1   package com.stateofflow.eclipse.metrics.export.html;
2   
3   import com.stateofflow.eclipse.metrics.collator.MetricsCollator;
4   import com.stateofflow.eclipse.metrics.configuration.MetricsConfiguration;
5   import com.stateofflow.eclipse.metrics.location.MetricLocation;
6   import com.stateofflow.eclipse.metrics.location.NamedLineNumber;
7   import com.stateofflow.eclipse.metrics.metric.MetricId;
8   
9   final class MetricsTableRowWriter {
10      private final HtmlPageBuilder pageBuilder;
11      private MetricLocation location;
12      private final MetricsConfiguration configuration;
13      private final String javaExportDirectory;
14  
15      public MetricsTableRowWriter(final HtmlPageBuilder builder, final MetricsConfiguration configuration, final String javaExportDirectory) {
16          this.pageBuilder = builder;
17          this.configuration = configuration;
18          this.javaExportDirectory = javaExportDirectory;
19      }
20  
21      public void write(final MetricLocation location, final MetricId[] metricIds, final MetricsCollator collator) {
22          this.location = location;
23  
24          pageBuilder.openElement("TR");
25          writeMetrics(metricIds, collator);
26          writeMethodInfo();
27          writeTypeInfo();
28          writePackageInfo();
29          pageBuilder.closeElementAndNewline("TR");
30      }
31  
32      private void writePackageInfo() {
33          pageBuilder.createElement("TD", (location.getPackageName().length() > 0 ? location.getPackageName() : "(default)"));
34      }
35  
36      private void writeTypeInfo() {
37          if (location.hasType()) {
38              if (!location.hasMethod()) {
39                  pageBuilder.createElement("TD", getLineNumberJavaLink(location.getTypeInfo()));
40              }
41              pageBuilder.createElement("TD", getNameJavaLink(location.getTypeInfo()));
42          }
43      }
44  
45      private void writeMethodInfo() {
46          if (location.hasMethod()) {
47              pageBuilder.createElement("TD", getLineNumberJavaLink(location.getMethodInfo())).createElement("TD", getNameJavaLink(location.getMethodInfo()));
48          }
49      }
50  
51      private String getNameJavaLink(final NamedLineNumber namedLineNumber) {
52          return getJavaLink(namedLineNumber.getLineNumber(), namedLineNumber.getName());
53      }
54  
55      private String getLineNumberJavaLink(final NamedLineNumber namedLineNumber) {
56          return getJavaLink(namedLineNumber.getLineNumber(), Integer.toString(namedLineNumber.getLineNumber()));
57      }
58  
59      private String getJavaHtmlFile() {
60          return javaExportDirectory + "/" + location.getCompilationUnit().replace('.', '/') + ".java.html";
61      }
62  
63      private String getJavaLink(final int lineNumber, final String text) {
64          return javaExportDirectory == null ? text : pageBuilder.getLink(getJavaHtmlFile() + "#" + Integer.toString(lineNumber), text);
65      }
66  
67      private void writeMetrics(final MetricId[] metricIds, final MetricsCollator collator) {
68          for (final MetricId metricId : metricIds) {
69              writeMetricTableData(metricId, collator);
70          }
71      }
72  
73      private void writeMetricTableData(final MetricId metricId, final MetricsCollator collator) {
74          pageBuilder.openElement("TD");
75          if (collator.hasMetric(location, metricId)) {
76              writeValidMetricTableData(metricId, collator);
77          } else {
78              pageBuilder.print('-');
79          }
80          pageBuilder.closeElement("TD");
81      }
82  
83      private void writeValidMetricTableData(final MetricId metricId, final MetricsCollator collator) {
84          final int value = collator.getMetric(location, metricId).getValue();
85          final boolean violation = (value > configuration.getUpperBound(metricId));
86          if (violation) {
87              pageBuilder.print("<FONT color=\"red\">");
88          }
89          pageBuilder.print(Integer.toString(collator.getMetric(location, metricId).getValue()));
90          if (violation) {
91              pageBuilder.print("</FONT>");
92          }
93      }
94  }
95