Java SDK Sample: Change Item Attribute Name

This tutorial will load all the items from the account, look for ones with a particular attribute name, change it, and then perform batch updates of those items.

Change Item Attribute Sample Program
package com.ultracart.javasdksamples;

import com.ultracart.admin.v2.ItemApi;
import com.ultracart.admin.v2.models.Item;
import com.ultracart.admin.v2.models.ItemContentAttribute;
import com.ultracart.admin.v2.models.ItemsRequest;
import com.ultracart.admin.v2.models.ItemsResponse;
import com.ultracart.admin.v2.swagger.ApiClient;
import com.ultracart.admin.v2.swagger.ApiException;
import com.ultracart.admin.v2.swagger.Configuration;
import com.ultracart.admin.v2.swagger.auth.ApiKeyAuth;

import java.util.ArrayList;
import java.util.List;

/*

TODO: Add the dependency for the SDK JAR to your program

Maven users

Add this dependency to your project's POM:

<dependency>
    <groupId>com.ultracart</groupId>
    <artifactId>rest-sdk</artifactId>
    <version>1.0.4</version>
    <scope>compile</scope>
</dependency>

Gradle users

Add this dependency to your project's build file:

compile "com.ultracart:rest-sdk:1.0.4"

 */

public class ChangeItemAttribute {
  // TODO: Replace this with your API Simple Key
  private static final String API_KEY = "YOUR API KEY HERE";

  private static void initClient() {
    ApiClient defaultClient = Configuration.getDefaultApiClient();

    ApiKeyAuth ultraCartSimpleApiKey = (ApiKeyAuth) defaultClient.getAuthentication("ultraCartSimpleApiKey");
    ultraCartSimpleApiKey.setApiKey(API_KEY);

    defaultClient.addDefaultHeader("X-UltraCart-Api-Version", "2017-03-01");

    defaultClient.setVerifyingSsl(true);
  }

  public static void main(String... args) {
    initClient();

    ItemApi api = new ItemApi();

    try {

      int limit = 200; // int | The maximum number of records to return on this one API call. Maximum is 200
      String sort = "merchant_item_id"; // string | The sort order of the orders.  See Sorting documentation for examples of using multiple values and sorting by ascending and descending.
      String expand = "content.attributes"; // TODO: If you modify this program to update something other than attributes, make sure you adjust your expansion string.  See https://www.ultracart.com/api/#resource_item.html -> Expansion for details

      ArrayList<Item> itemsToUpdate = new ArrayList<Item>(); // Collect the items to update here
      int itemsQueried = 0;

      for (int offset = 0; ; offset += limit) {

        ItemsResponse itemsResponse = api.getItems(null, null, limit, offset, null, sort, expand, false);

        if (itemsResponse.isSuccess()) {
          System.out.println("Retrieved " + itemsResponse.getItems().size() + " items.");
          itemsQueried += itemsResponse.getItems().size();

          for (Item item : itemsResponse.getItems()) {
            System.out.println("Item: " + item.getMerchantItemId());

            if (item.getContent() != null && item.getContent().getAttributes() != null) {
              for (ItemContentAttribute attribute : item.getContent().getAttributes()) {
                // Look for the attribute name that is old
                if (attribute.getName().equalsIgnoreCase("offer")) {
                  // Change the attribute name
                  attribute.setName("attOffer");
                  // Add the item to a list of items we want to update at the end.
                  itemsToUpdate.add(item);
                  System.out.println("  new attribute " + attribute.getName() + " => " + attribute.getValue());
                  break;
                }
              }
            }
          }

          // Are we done paginating through the list of items?
          if (itemsResponse.getItems().size() < limit) break;
        } else {
          System.out.println("Error retrieving items");
          break;
        }

      }

      // Output some statistics
      System.out.println("Queried [" + itemsQueried + "] items.");
      System.out.println("Update [" + itemsToUpdate.size() + "] items.");

      // TODO: If you have a large amount of updates you can have them run async by setting this to true
      // TODO: UltraCart will receive the request, buffer it and then process the updates in the backward.
      // TODO: Async is not recommended for small numbers of updates.
      boolean asyncUpdate = false; // Change this to true if you want async updates to take place
      int batchSize = asyncUpdate ? 100 : 20;
      List<Item> batch = new ArrayList<Item>();
      for (Item item : itemsToUpdate) {
        batch.add(item);

        // Send an async batch every 20 or 100 items depending upon async
        if (batch.size() == batchSize) {
          ItemsRequest itemsRequest = new ItemsRequest();
          itemsRequest.setItems(batch);
          api.updateItems(itemsRequest, expand, false, asyncUpdate);
          batch.clear();

          // TODO: Remove this break statement after you have verified your updates are working correctly before you
          // TODO: run this program against your entire item database
          if (true) break;
        }
      }

      // Send a final batch
      if (batch.size() > 0) {
        ItemsRequest itemsRequest = new ItemsRequest();
        itemsRequest.setItems(batch);
        api.updateItems(itemsRequest, expand, false, asyncUpdate);
        batch.clear();
      }

    } catch (ApiException e) {
      System.err.println("Exception when calling Api#getItems or Api#updateItems");
      e.printStackTrace();
    }
  }
}