package org.moxie;
import static java.text.MessageFormat.format;
import java.io.File;
import java.text.MessageFormat;
import java.util.Set;
import org.moxie.utils.StringUtils;
public class DependencyReport implements MoxieReport {
@Override
public String report(Build build) {
String h2Pattern = "<h2>{0}</h2>\n";
String aPattern = "<a href=\"{1}\" target=\"_blank\">{0}</a>";
StringBuilder sb = new StringBuilder();
sb.append(format(h2Pattern,"dependencies"));
sb.append("<div class=\"tabbable\">\n<ul class=\"nav nav-tabs\">\n");
// define tab titles
boolean first = true;
for (Scope scope : new Scope[] { Scope.compile, Scope.runtime, Scope.test, Scope.build }) {
Set<Dependency> dependencies = build.getSolver().getDependencies(scope);
if (dependencies.size() == 0) {
continue;
}
if (first) {
first = false;
sb.append(MessageFormat.format("<li class=\"active\"><a href=\"#{0}\" data-toggle=\"tab\">{0} </a></li>\n", scope.name()));
} else {
sb.append(MessageFormat.format("<li><a href=\"#{0}\" data-toggle=\"tab\">{0} </a></li>\n", scope.name()));
}
}
// rings tab
sb.append(MessageFormat.format("<li><a href=\"#{0}\" data-toggle=\"tab\">{0} </a></li>\n", "rings"));
sb.append("</ul><div class=\"tab-content\">\n");
// define tab content
first = true;
for (Scope scope : new Scope[] { Scope.compile, Scope.runtime, Scope.test, Scope.build }) {
Set<Dependency> dependencies = build.getSolver().getDependencies(scope);
if (dependencies.size() == 0) {
continue;
}
sb.append(MessageFormat.format("<div class=\"tab-pane{1}\" id=\"{0}\">\n", scope.name(), first ? " active":""));
first = false;
sb.append("<div class=\"row-fluid\">\n");
sb.append("<table class=\"table table-striped table-bordered table-condensed\">\n");
sb.append(format("<thead><tr><th>{0}</th><th>{1}</th><th>{2}</th><th>{3}</th><th>{4}</th><th>{5}</th></tr></thead>\n", "ring", "artifact", "size", "groups", "links", "license"));
sb.append("<tbody>\n");
for (Dependency dep : dependencies) {
File file = build.getSolver().getArtifact(dep);
String size = file.length()/1024L + " kB";
Pom depPom = build.getSolver().getPom(dep);
String badge;
switch (dep.ring){
case 1:
badge = "badge-success";
break;
case 2:
badge = "badge-info";
break;
case 3:
badge = "badge-inverse";
break;
default:
badge = "badge";
}
sb.append(format("<tr><td><span class=\"badge {1}\">{0,number,0}</span></td>", dep.ring, badge));
if (!dep.isMavenObject()) {
// not a Maven artifact
sb.append(format("<td>{0}</td><td>{1}</td><td></td><td>{2}</td>", depPom.getCoordinates(), size, dep.tags));
} else {
// Maven artifact
String mvnrepository = format("http://search.maven.org/#artifactdetails|{0}|{1}|{2}|pom", depPom.groupId, depPom.artifactId, depPom.version);
String mvnLink = format(aPattern, depPom.getCoordinates(), mvnrepository);
String siteLink = "";
if (!StringUtils.isEmpty(depPom.url)) {
siteLink = format(aPattern, "site", depPom.url);
}
String issuesLink = "";
if (!StringUtils.isEmpty(depPom.issuesUrl)) {
issuesLink = format(aPattern, "issues", depPom.issuesUrl);
}
sb.append("<td>").append(mvnLink).append(format("</td><td>{0}</td><td>{1}</td><td>{2}</td>", size, dep.tags, siteLink + " " + issuesLink));
}
sb.append("<td>");
if (depPom.getLicenses().size() == 0) {
// no license specified
sb.append("<span class=\"label label-warning\">Unknown!</span>");
} else {
// license(s)
for (License license : depPom.getLicenses()) {
if (StringUtils.isEmpty(license.url)) {
sb.append(format("{0}<br/>", license.name));
} else {
sb.append(format(aPattern, license.name, license.url)).append("<br/>");
}
}
}
sb.append("</td></tr>\n");
}
sb.append("</tbody></table></div></div>\n");
}
// rings tab
sb.append("<div class=\"tab-pane\" id=\"rings\">\n");
sb.append("<center><div id='chart'></div></center>\n");
sb.append("<script src='./d3/d3.js' type='text/javascript'></script>\n");
sb.append("<link href='./d3/rings.css' rel='stylesheet' type='text/css' />\n");
sb.append("<script src='./d3/rings.js' type='text/javascript'></script>\n");
sb.append("</div>\n");
sb.append("</div>\n");
return sb.toString();
}
}