private List<KnapsackState> get(String name) throws IOException {
   ImmutableList.Builder<KnapsackState> builder = ImmutableList.builder();
   try {
     logger.debug("get knapsack states: {}", name);
     final Client client = injector.getInstance(Client.class);
     createIndexIfNotExist(client);
     GetResponse getResponse =
         client.prepareGet(INDEX_NAME, MAPPING_NAME, name).execute().actionGet();
     if (!getResponse.isExists()) {
       return builder.build();
     }
     XContentParser parser = xContent(JSON).createParser(getResponse.getSourceAsBytes());
     while (parser.nextToken() != START_ARRAY) {
       // forward
     }
     while (parser.nextToken() != END_ARRAY) {
       KnapsackState state = new KnapsackState();
       builder.add(state.fromXContent(parser));
     }
     return builder.build();
   } catch (Throwable t) {
     logger.error("get settings failed", t);
     return null;
   }
 }
 private static XContentBuilder generate(List<KnapsackState> values) throws IOException {
   XContentBuilder builder = jsonBuilder();
   builder.startObject();
   builder.startArray("array");
   for (KnapsackState value : values) {
     value.toXContent(builder, EMPTY_PARAMS);
   }
   builder.endArray();
   builder.endObject();
   return builder;
 }
 private void remove(String name, List<KnapsackState> values, KnapsackState targetValue)
     throws IOException {
   logger.debug("remove: {} -> {}", name, values);
   ImmutableList.Builder<KnapsackState> updatedValues = ImmutableList.builder();
   for (KnapsackState value : values) {
     if (!value.equals(targetValue)) {
       updatedValues.add(value);
     }
   }
   put(name, generate(updatedValues.build()));
 }