PrimitiveArrayBucket.java

package io.github.pojotools.flat2pojo.core.engine;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import io.github.pojotools.flat2pojo.core.config.MappingConfig;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * Accumulates primitive values with deduplication support. Single Responsibility: Primitive value
 * accumulation and deduplication.
 */
final class PrimitiveArrayBucket {
  private final List<JsonNode> values = new ArrayList<>();
  private final Set<JsonNode> dedupSet = new HashSet<>();
  private final boolean dedup;

  PrimitiveArrayBucket(final boolean dedup) {
    this.dedup = dedup;
  }

  void add(final JsonNode value) {
    if (shouldAdd(value)) {
      values.add(value);
    }
  }

  boolean shouldAdd(final JsonNode value) {
    return !dedup || dedupSet.add(value);
  }

  void writeToArray(final ArrayNode array, final MappingConfig.OrderDirection direction) {
    sortIfNeeded(direction);
    addAllToArray(array);
  }

  private void sortIfNeeded(final MappingConfig.OrderDirection direction) {
    if (direction == MappingConfig.OrderDirection.asc) {
      values.sort(new JsonNodeComparator());
    } else if (direction == MappingConfig.OrderDirection.desc) {
      values.sort(new JsonNodeComparator().reversed());
    }
  }

  private void addAllToArray(final ArrayNode array) {
    for (final JsonNode value : values) {
      array.add(value);
    }
  }
}