All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.kemitix.dependency.digraph.maven.plugin.NodeTreeDependencyData Maven / Gradle / Ivy

package net.kemitix.dependency.digraph.maven.plugin;

import lombok.Getter;
import org.apache.maven.plugin.logging.Log;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import net.kemitix.node.Node;
import net.kemitix.node.NodeItem;

/**
 * Implementation of {@link DependencyData} using a node tree.
 *
 * @author Paul Campbell
 */
class NodeTreeDependencyData implements DependencyData {

    private final Node root = new NodeItem<>(
            new PackageData("[root]"));

    @Getter
    private Node baseNode;

    @Override
    public void addDependency(final String user, final String imported) {
        final List userLine = createPackageLineList(user);
        root.createDescendantLine(userLine);
        final List importedLine = createPackageLineList(imported);
        root.createDescendantLine(importedLine);
        root.walkTree(importedLine).ifPresent((Node i) -> {
            root.walkTree(userLine).ifPresent((Node u) -> {
                u.getData().getUses().add(i);
            });
        });
    }

    /**
     * Sets the base package.
     *
     * @param basePackage the base package within which to report
     */
    @Override
    public void setBasePackage(final String basePackage) {
        final List baseLine = createPackageLineList(basePackage);
        root.createDescendantLine(baseLine);
        root.walkTree(baseLine)
            .ifPresent((Node base) -> baseNode = base);
    }

    private List createPackageLineList(final String userPackage) {
        List line = new ArrayList<>();
        Arrays.asList(userPackage.split("\\."))
              .forEach((String n) -> line.add(new PackageData(n)));
        return line;
    }

    @Override
    public void debugLog(final Log log) {
        debugLogNode(log, baseNode, 0);
    }

    private void debugLogNode(
            final Log log, final Node node, final int depth) {
        String padding = IntStream.range(0, depth * 2)
                                  .mapToObj(x -> " ")
                                  .collect(Collectors.joining());
        log.info(padding + node.getData().getName());
        node.getChildren().stream().forEach((Node t) -> {
            debugLogNode(log, t, depth + 1);
        });
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy