PrimitiveArrayNodeFactory.java

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

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.github.pojotools.flat2pojo.core.util.PathOps;

/**
 * Creates and attaches array nodes to the object tree. Single Responsibility: Array node creation
 * and attachment.
 */
final class PrimitiveArrayNodeFactory {
  private final ObjectMapper objectMapper;
  private final String separator;

  PrimitiveArrayNodeFactory(final ObjectMapper objectMapper, final String separator) {
    this.objectMapper = objectMapper;
    this.separator = separator;
  }

  ArrayNode createAndAttach(final ObjectNode targetRoot, final String path) {
    final ObjectNode parent = traverseToParent(targetRoot, path);
    final String fieldName = extractFieldName(path);
    return attachNewArray(parent, fieldName);
  }

  private ObjectNode traverseToParent(final ObjectNode targetRoot, final String path) {
    return PathOps.traverseAndEnsurePath(targetRoot, path, separator, PathOps::ensureObject);
  }

  private String extractFieldName(final String path) {
    return PathOps.getFinalSegment(path, separator);
  }

  private ArrayNode attachNewArray(final ObjectNode parent, final String fieldName) {
    final ArrayNode array = objectMapper.createArrayNode();
    parent.set(fieldName, array);
    return array;
  }
}