package jdepend.client.report.way.textui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import jdepend.framework.log.LogUtil;
import jdepend.framework.util.MetricsFormat;
import jdepend.metadata.JavaClassRelationItem;
import jdepend.model.GroupCohesionItem;
import jdepend.model.JDependUnit;
import jdepend.model.JavaClassUnit;
import jdepend.model.MetricsMgr;
import jdepend.model.Relation;
import jdepend.model.SubJDependUnit;
import jdepend.model.result.AnalysisResult;
import jdepend.model.util.JDependUnitByMetricsComparator;
import jdepend.client.report.filter.CouplingReportFilter;
import jdepend.client.report.filter.RelationFilter;
import jdepend.client.report.filter.ReportFilter;
import jdepend.client.report.util.ReportConstant;
import jdepend.client.report.util.ReportUtil;
import jdepend.client.report.way.xmlui.XMLSummaryPrinter;
/**
* 报告输出器
*
* @author <b>Abner</b>
*
*/
public final class JDependPrinter extends Printer {
public final static String Split = "~";
public final static String Start = "@";
private ReportFilter filter = new ReportFilter();
private RelationFilter relationFilter = new RelationFilter();
private CouplingReportFilter couplingFilter = new CouplingReportFilter();
protected void printSplit(String name) {
this.getWriter().print(Split);
this.getWriter().print(Start);
this.getWriter().print(name);
this.getWriter().print(Split);
getWriter().flush();
}
public void print(AnalysisResult result, Set<String> items) {
LogUtil.getInstance(JDependPrinter.class).systemLog("create text report start!");
if (items.contains(ReportConstant.SummaryText)) {
printSplit(ReportConstant.SummaryText);
printTextBasic(result);
LogUtil.getInstance(JDependPrinter.class).systemLog("SummaryText report finish!");
}
if (items.contains(ReportConstant.SummaryXML)) {
printSplit(ReportConstant.SummaryXML);
printXMLBasic(result);
LogUtil.getInstance(JDependPrinter.class).systemLog("SummaryXML report finish!");
}
if (items.contains(ReportConstant.RelationText)) {
printSplit(ReportConstant.RelationText);
printRelations(result.getRelations());
LogUtil.getInstance(JDependPrinter.class).systemLog("RelationText report finish!");
}
if (items.contains(ReportConstant.CouplingText)) {
printSplit(ReportConstant.CouplingText);
printCouplings(result.getComponents());
LogUtil.getInstance(JDependPrinter.class).systemLog("CouplingText report finish!");
}
if (items.contains(ReportConstant.CohesionText)) {
printSplit(ReportConstant.CohesionText);
printCohesions(result.getComponents());
LogUtil.getInstance(JDependPrinter.class).systemLog("CohesionText report finish!");
}
getWriter().flush();
LogUtil.getInstance(JDependPrinter.class).systemLog("create text report finish!");
}
protected void printTextBasic(AnalysisResult result) {
TextSummaryPrinter textSummaryPrinter = new TextSummaryPrinter();
textSummaryPrinter.setStream(getStream());
textSummaryPrinter.printBasic(result);
}
protected void printXMLBasic(AnalysisResult result) {
XMLSummaryPrinter xmlSummaryPrinter = new XMLSummaryPrinter();
xmlSummaryPrinter.setStream(getStream());
xmlSummaryPrinter.printBasic(result);
}
public void printCouplings(Collection<? extends JDependUnit> units1) {
getWriter().println("<?xml version=\"1.0\"?>");
getWriter().println("<Components>");
List<JDependUnit> units = new ArrayList<JDependUnit>(units1);
Collections.sort(units, new JDependUnitByMetricsComparator(MetricsMgr.Coupling, false));
for (JDependUnit unit : units) {
printCoupling(unit);
}
getWriter().println("</Components>");
}
private void printCoupling(JDependUnit unit) {
Float ceCoupling = 0F;
Float caCoupling = 0F;
Float coupling = 0F;
coupling = unit.getCoupling();
ceCoupling = unit.ceCoupling();
caCoupling = unit.caCoupling();
getWriter().println(tab() + "<Component name=\"" + unit.getName() + "\">");
// 输出摘要信息
if (couplingFilter.isComponentSummary()) {
getWriter().println(tab(2) + "<Ce>"
+ MetricsFormat.toFormattedMetrics(ceCoupling) + "</Ce>");
getWriter().println(tab(2) + "<Ca>" + MetricsFormat.toFormattedMetrics(caCoupling) + "</Ca>");
getWriter().println(tab(2) + "<Coupling>" + MetricsFormat.toFormattedMetrics(coupling) + "</Coupling>");
}
// 输出类信息
if (couplingFilter.isClassInfo()) {
printJavaClassCouplingInfo(unit);
}
getWriter().println(tab() + "</Component>");
}
private void printJavaClassCouplingInfo(JDependUnit unit) {
if (unit.getClasses().size() == 0) {
return;
}
List<JavaClassUnit> javaClasses = new ArrayList<JavaClassUnit>(unit.getClasses());
Collections.sort(javaClasses, new JDependUnitByMetricsComparator(MetricsMgr.Coupling, false));
Float coupling = 0.0F;
for (JavaClassUnit javaClass : javaClasses) {
coupling = javaClass.getCoupling();
if (couplingFilter.isInnerClass() && coupling.equals(0.0F) || couplingFilter.isExpertClass()
&& !coupling.equals(0.0F)) {
getWriter().println(
tab(3) + "<JavaClass name=\"" + javaClass.getName() + "\" CeCoupling=\""
+ MetricsFormat.toFormattedMetrics(javaClass.ceCoupling()) + "\" CaCoupling=\""
+ MetricsFormat.toFormattedMetrics(javaClass.caCoupling()) + "\" Coupling=\""
+ MetricsFormat.toFormattedMetrics(coupling) + "\">");
}
// 打印细节
if (couplingFilter.isClassDetail()) {
this.printJavaClassCouplingInfoDetail(javaClass);
}
getWriter().println(tab(3) + "</JavaClass>");
}
}
private void printJavaClassCouplingInfoDetail(JavaClassUnit javaClass) {
getWriter().println(tab(4) + "<Ce>");
for (JavaClassRelationItem ceItem : javaClass.getJavaClass().getCeItems()) {
getWriter().println(
tab(5)
+ "<CouplingJavaClass name=\""
+ ceItem.getTarget().getName()
+ "\" DependType=\""
+ ceItem.getType().getName()
+ "\" Intensity=\""
+ MetricsFormat.toFormattedMetrics(ReportUtil.calCouplingIntensity(ceItem,
javaClass.getResult())) + "\"/>");
}
getWriter().println(tab(4) + "</Ce>");
getWriter().println(tab(4) + "<Ca>");
for (JavaClassRelationItem caItem : javaClass.getJavaClass().getCaItems()) {
getWriter().println(
tab(5)
+ "<CouplingJavaClass name=\""
+ caItem.getSource().getName()
+ "\" DependType=\""
+ caItem.getType().getName()
+ "\" Intensity=\""
+ MetricsFormat.toFormattedMetrics(ReportUtil.calCouplingIntensity(caItem,
javaClass.getResult())) + "\"/>");
}
getWriter().println(tab(4) + "</Ca>");
}
public void printCohesions(Collection<? extends JDependUnit> units1) {
getWriter().println("<?xml version=\"1.0\"?>");
getWriter().println("<Components>");
List<JDependUnit> units = new ArrayList<JDependUnit>(units1);
Collections.sort(units, new JDependUnitByMetricsComparator(MetricsMgr.Cohesion));
for (JDependUnit unit : units) {
printCohesion(unit);
}
getWriter().println("</Components>");
}
public float printCohesion(JDependUnit unit) {
Float cohesion = 0F;
cohesion = unit.getCohesion();
getWriter().println(tab() + "<Component name=\"" + unit.getName() + "\">");
getWriter().println(tab(2) + "<Cohesion>" + MetricsFormat.toFormattedMetrics(cohesion) + "</Cohesion>");
if (filter.isClassInfo()) {
printJavaClassCohesionInfo(unit);
}
getWriter().println(tab() + "</Component>");
return cohesion;
}
private void printJavaClassCohesionInfo(JDependUnit unit) {
if (unit.getClasses().size() == 0) {
return;
}
List<JavaClassUnit> javaClasses = new ArrayList<JavaClassUnit>(unit.getClasses());
Collections.sort(javaClasses, new JDependUnitByMetricsComparator(MetricsMgr.Cohesion));
for (JavaClassUnit javaClass : javaClasses) {
getWriter().println(
tab(3) + "<JavaClass name=\"" + javaClass.getName() + "\" Cohesion=\""
+ MetricsFormat.toFormattedMetrics(javaClass.getCohesion()) + "\">");
// 打印细节
if (filter.isClassDetail())
this.printJavaClassCohesionInfoDetail(javaClass);
getWriter().println(tab(3) + "</JavaClass>");
}
}
private void printJavaClassCohesionInfoDetail(JavaClassUnit javaClass) {
getWriter().println(tab(4) + "<Ce>");
for (JavaClassRelationItem ceItem : javaClass.getJavaClass().getCeItems()) {
getWriter().println(
tab(5)
+ "<CohesionjavaClass name=\""
+ ceItem.getTarget().getName()
+ "\" DependType=\""
+ ceItem.getType().getName()
+ "\" Intensity=\""
+ MetricsFormat.toFormattedMetrics(ReportUtil.calCohesionIntensity(ceItem,
javaClass.getResult())) + "\"/>");
}
getWriter().println(tab(4) + "</Ce>");
getWriter().println(tab(4) + "<Ca>");
for (JavaClassRelationItem caItem : javaClass.getJavaClass().getCaItems()) {
getWriter().println(
tab(5)
+ "<CohesionjavaClass name=\""
+ caItem.getSource().getName()
+ "\" DependType=\""
+ caItem.getType().getName()
+ "\" Intensity=\""
+ MetricsFormat.toFormattedMetrics(ReportUtil.calCohesionIntensity(caItem,
javaClass.getResult())) + "\"/>");
}
getWriter().println(tab(4) + "</Ca>");
}
public float printSubJDependUnitCohesion(SubJDependUnit unit) {
Float cohesion = 0F;
cohesion = unit.getCohesion();
getWriter().println(tab() + "<SubJDependUnit name=\"" + unit.getName() + "\">");
getWriter().println(tab(2) + "<Cohesion>" + MetricsFormat.toFormattedMetrics(cohesion) + "</Cohesion>");
printGroupCohesionItem(unit.getGroupCohesionInfo().getGroupCohesionItems());
getWriter().println(tab() + "</SubJDependUnit>");
return cohesion;
}
private void printGroupCohesionItem(List<GroupCohesionItem> items) {
for (GroupCohesionItem item : items) {
getWriter().println(
tab(3) + "<SubJDependUnit name=\"" + item.getName() + "\" Cohesion=\""
+ MetricsFormat.toFormattedMetrics(item.getCohesion()) + "\">");
// 打印细节
this.printJavaClassRelationItems(item.getJavaClassRelationItems());
getWriter().println(tab(3) + "</SubJDependUnit>");
}
}
private void printJavaClassRelationItems(Collection<JavaClassRelationItem> javaClassRelationItems) {
for (JavaClassRelationItem item : javaClassRelationItems) {
getWriter().println(
tab(4) + "<CohesionjavaClass source=\"" + item.getSource().getName() + "\" target=\""
+ item.getTarget().getName() + "\" DependType=\"" + item.getType().getName()
+ "\" Intensity=\"" + MetricsFormat.toFormattedMetrics(item.getRelationIntensity())
+ "\"/>");
}
}
protected void printRelations(Collection<Relation> relations) {
getWriter().println("Current Element Depend Element Relation Current Depend RelationBalance");
float balance = 0F;
for (Relation relation : relations) {
balance += relation.getBalance();
getWriter().println("\n" + relation);
if (relationFilter.isRelationDetail()) {
this.printRelationDetail(relation);
}
}
getWriter().println("Relations Balance : " + balance);
}
protected void printRelationDetail(Relation relation) {
if (!relationFilter.isTheRelationDetail(relation))
return;
Collection<JavaClassRelationItem> items = relation.getItems();
if (items != null && items.size() != 0) {
for (JavaClassRelationItem item : items) {
getWriter().println(
"\n #javaClassName: " + item.getSource().getName() + " #DependJavaClassName: "
+ item.getTarget().getName() + " #DependType: " + item.getType().getName()
+ " #Intensity: " + item.getRelationIntensity());
}
}
}
protected String tab() {
return " ";
}
protected String tab(int n) {
StringBuilder s = new StringBuilder();
for (int i = 0; i < n; i++) {
s.append(tab());
}
return s.toString();
}
}