/*
* Copyright 2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gradle.api.tasks.diagnostics.internal.dependencies;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.result.ResolutionResult;
import org.gradle.api.tasks.diagnostics.internal.DependencyReportRenderer;
import org.gradle.api.tasks.diagnostics.internal.TextReportRenderer;
import org.gradle.api.tasks.diagnostics.internal.graph.DependencyGraphRenderer;
import org.gradle.api.tasks.diagnostics.internal.graph.LegendRenderer;
import org.gradle.api.tasks.diagnostics.internal.graph.NodeRenderer;
import org.gradle.api.tasks.diagnostics.internal.graph.SimpleNodeRenderer;
import org.gradle.api.tasks.diagnostics.internal.graph.nodes.RenderableDependency;
import org.gradle.api.tasks.diagnostics.internal.graph.nodes.RenderableModuleResult;
import org.gradle.api.tasks.diagnostics.internal.graph.nodes.UnresolvableConfigurationResult;
import org.gradle.internal.graph.GraphRenderer;
import org.gradle.internal.logging.text.StyledTextOutput;
import org.gradle.util.GUtil;
import java.io.IOException;
import static org.gradle.internal.logging.text.StyledTextOutput.Style.*;
/**
* Simple dependency graph renderer that emits an ASCII tree.
*/
public class AsciiDependencyReportRenderer extends TextReportRenderer implements DependencyReportRenderer {
private LegendRenderer legendRenderer;
private boolean hasConfigs;
DependencyGraphRenderer dependencyGraphRenderer;
@Override
public void startProject(Project project) {
super.startProject(project);
hasConfigs = false;
legendRenderer = new LegendRenderer(getTextOutput());
}
@Override
public void completeProject(Project project) {
if (!hasConfigs) {
getTextOutput().withStyle(Info).println("No configurations");
}
super.completeProject(project);
}
@Override
public void startConfiguration(final Configuration configuration) {
if (hasConfigs) {
getTextOutput().println();
}
hasConfigs = true;
GraphRenderer renderer = new GraphRenderer(getTextOutput());
renderer.visit(new Action<StyledTextOutput>() {
public void execute(StyledTextOutput styledTextOutput) {
getTextOutput().withStyle(Identifier).text(configuration.getName());
getTextOutput().withStyle(Description).text(getDescription(configuration));
if (!configuration.isCanBeResolved()) {
getTextOutput().withStyle(Info).text(" (n)");
}
}
}, true);
NodeRenderer nodeRenderer = new SimpleNodeRenderer();
dependencyGraphRenderer = new DependencyGraphRenderer(renderer, nodeRenderer, legendRenderer);
}
private String getDescription(Configuration configuration) {
return GUtil.isTrue(configuration.getDescription()) ? " - " + configuration.getDescription() : "";
}
@Override
public void completeConfiguration(Configuration configuration) {}
@Override
public void render(Configuration configuration) throws IOException {
if (configuration.isCanBeResolved()) {
ResolutionResult result = configuration.getIncoming().getResolutionResult();
RenderableDependency root = new RenderableModuleResult(result.getRoot());
renderNow(root);
} else {
renderNow(new UnresolvableConfigurationResult(configuration));
}
}
void renderNow(RenderableDependency root) {
if (root.getChildren().isEmpty()) {
getTextOutput().withStyle(Info).text("No dependencies");
getTextOutput().println();
return;
}
dependencyGraphRenderer.render(root);
}
@Override
public void complete() {
legendRenderer.printLegend();
super.complete();
}
}