PathResolver.java
package io.github.pojotools.flat2pojo.core.util;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.Set;
/**
* Encapsulates all path-related operations with a specific separator. Eliminates primitive
* obsession by bundling the separator with path operations.
*/
public record PathResolver(String separator) {
/** Checks if a path is under any of the given parent paths. */
public boolean isUnderAny(final String path, final Set<String> parentPaths) {
return PathOps.isUnderAny(path, parentPaths, separator);
}
/** Gets the portion of a path after a prefix. Example: tailAfter("a/b/c", "a") returns "b/c" */
public String tailAfter(final String path, final String prefix) {
return PathOps.tailAfter(path, prefix, separator);
}
/** Gets the final segment of a path. Example: getFinalSegment("a/b/c") returns "c" */
public String getFinalSegment(final String path) {
return PathOps.getFinalSegment(path, separator);
}
/** Builds a path prefix by appending the separator. Example: buildPrefix("a/b") returns "a/b/" */
public String buildPrefix(final String path) {
return path + separator;
}
/** Strips the prefix from a path. Example: stripPrefix("a/b/c", "a/b/") returns "c" */
public String stripPrefix(final String path, final String prefix) {
return path.substring(prefix.length());
}
/** Traverses and ensures the path exists in the target node, creating objects as needed. */
public ObjectNode traverseAndEnsurePath(final ObjectNode target, final String path) {
return PathOps.traverseAndEnsurePath(target, path, separator, PathOps::ensureObject);
}
/**
* Checks if a relative suffix is under any child list of the parent. Example: For parent
* "definitions", checks if suffix "modules/name" starts with "modules/"
*/
public boolean isSuffixUnderAnyChildList(
final String suffix, final String parentPath, final Set<String> allListPaths) {
final String parentPrefix = buildPrefix(parentPath);
for (final String listPath : allListPaths) {
if (listPath.startsWith(parentPrefix)) {
final String childRelativePath = buildPrefix(listPath.substring(parentPrefix.length()));
if (suffix.startsWith(childRelativePath)) {
return true;
}
}
}
return false;
}
}