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

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

There is a newer version: 0.9.1
Show newest version
package net.kemitix.dependency.digraph.maven.plugin;

import lombok.AccessLevel;
import lombok.Getter;
import net.kemitix.node.Node;

/**
 * Abstract base for {@link DotFileFormat} implementations.
 *
 * @author pcampbell
 */
abstract class AbstractDotFileFormat implements DotFileFormat {

    @Getter(AccessLevel.PROTECTED)
    private final Node base;

    private final NodePathGenerator nodePathGenerator;

    /**
     * Constructor.
     *
     * @param base              the base package
     * @param nodePathGenerator the node path generator
     */
    AbstractDotFileFormat(
            final Node base,
            final NodePathGenerator nodePathGenerator) {
        this.base = base;
        this.nodePathGenerator = nodePathGenerator;
    }

    @Override
    public String renderReport() {
        final StringBuilder report = new StringBuilder();
        report.append(renderGraphStart());
        report.append(renderElements(this::renderNode, this::renderUsages));
        report.append(renderGraphFinish());
        return report.toString();
    }

    protected String getPath(
            final Node headNode,
            final String delimiter) {
        return nodePathGenerator.getPath(headNode, getBase(), delimiter);
    }

    protected String renderElements(
            final NodeRenderer nodeRenderer,
            final UsageRenderer usageRenderer) {
        final StringBuilder render = new StringBuilder();
        render.append(nodeRenderer.renderNode(base));
        render.append(usageRenderer.renderUsage(base));
        return render.toString();
    }

    String renderGraphStart() {
        return "digraph{compound=true;node[shape=box]\n";
    }

    abstract String renderNode(final Node node);

    abstract String renderUsages(final Node node);

    String renderGraphFinish() {
        return "}";
    }

    /**
     * Functional Interface for rendering a node.
     */
    @FunctionalInterface
    protected interface NodeRenderer {

        String renderNode(final Node node);

    }

    /**
     * Functional Interface for rendering a usage.
     */
    @FunctionalInterface
    protected interface UsageRenderer {

        String renderUsage(final Node node);

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy