Clover coverage report - Dependency Finder
Coverage timestamp: Mon Nov 29 2010 15:00:50 PST
file stats: LOC: 266   Methods: 21
NCLOC: 182   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
TextPrinter.java 87.5% 94.8% 100% 93.7%
coverage coverage
 1    /*
 2    * Copyright (c) 2001-2009, Jean Tessier
 3    * All rights reserved.
 4    *
 5    * Redistribution and use in source and binary forms, with or without
 6    * modification, are permitted provided that the following conditions
 7    * are met:
 8    *
 9    * * Redistributions of source code must retain the above copyright
 10    * notice, this list of conditions and the following disclaimer.
 11    *
 12    * * Redistributions in binary form must reproduce the above copyright
 13    * notice, this list of conditions and the following disclaimer in the
 14    * documentation and/or other materials provided with the distribution.
 15    *
 16    * * Neither the name of Jean Tessier nor the names of his contributors
 17    * may be used to endorse or promote products derived from this software
 18    * without specific prior written permission.
 19    *
 20    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 21    * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 22    * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 23    * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
 24    * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 25    * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 26    * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 27    * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 28    * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 29    * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 30    * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 31    */
 32   
 33    package com.jeantessier.dependency;
 34   
 35    import java.io.*;
 36    import java.util.*;
 37   
 38    import org.apache.log4j.*;
 39    import org.apache.oro.text.perl.*;
 40   
 41    public class TextPrinter extends Printer {
 42    private static final Perl5Util perl = new Perl5Util();
 43   
 44  4806 protected static Perl5Util perl() {
 45  4806 return perl;
 46    }
 47   
 48    private boolean showInferred = true;
 49    private Map<Node, Integer> dependencies = new TreeMap<Node, Integer>();
 50   
 51  118 public TextPrinter(PrintWriter out) {
 52  118 super(out);
 53    }
 54   
 55  15 public TextPrinter(TraversalStrategy strategy, PrintWriter out) {
 56  15 super(strategy, out);
 57    }
 58   
 59  3729 public boolean isShowInferred() {
 60  3729 return showInferred;
 61    }
 62   
 63  2 public void setShowInferred(boolean showInferred) {
 64  2 this.showInferred = showInferred;
 65    }
 66   
 67  372 protected void preprocessPackageNode(PackageNode node) {
 68  372 Logger.getLogger(getClass()).debug("Printing package \"" + node + "\" and its " + node.getInboundDependencies().size() + " inbounds and " + node.getOutboundDependencies().size() + " outbounds");
 69   
 70  372 super.preprocessPackageNode(node);
 71   
 72  372 raiseIndent();
 73   
 74  372 dependencies.clear();
 75    }
 76   
 77  372 protected void preprocessAfterDependenciesPackageNode(PackageNode node) {
 78  372 Logger.getLogger(getClass()).debug("Package \"" + node + "\" with " + node.getInboundDependencies().size() + " inbounds and " + node.getOutboundDependencies().size() + " outbounds had " + dependencies.size() + " dependencies.");
 79   
 80  372 if (shouldShowPackageNode(node) || !dependencies.isEmpty()) {
 81  360 lowerIndent();
 82  360 indent().printScopeNodeName(node).eol();
 83  360 raiseIndent();
 84    }
 85   
 86  372 printDependencies(node, dependencies);
 87    }
 88   
 89  372 protected void postprocessPackageNode(PackageNode node) {
 90  372 lowerIndent();
 91   
 92  372 super.postprocessPackageNode(node);
 93    }
 94   
 95  66 public void visitInboundPackageNode(PackageNode node) {
 96  66 if (isShowInbounds()) {
 97  54 Logger.getLogger(getClass()).debug("Printing \"" + getCurrentNode() + "\" <-- \"" + node + "\"");
 98   
 99  54 Integer i = dependencies.get(node);
 100  54 if (i != null) {
 101  14 dependencies.put(node, i - 1);
 102    } else {
 103  40 dependencies.put(node, -1);
 104    }
 105    } else {
 106  12 Logger.getLogger(getClass()).debug("Ignoring \"" + getCurrentNode() + "\" <-- \"" + node + "\"");
 107    }
 108    }
 109   
 110  66 public void visitOutboundPackageNode(PackageNode node) {
 111  66 if (isShowOutbounds()) {
 112  54 Logger.getLogger(getClass()).debug("Printing \"" + getCurrentNode() + "\" --> \"" + node + "\"");
 113   
 114  54 Integer i = dependencies.get(node);
 115  54 if (i != null) {
 116  0 dependencies.put(node, i + 1);
 117    } else {
 118  54 dependencies.put(node, 1);
 119    }
 120    } else {
 121  12 Logger.getLogger(getClass()).debug("Ignoring \"" + getCurrentNode() + "\" --> \"" + node + "\"");
 122    }
 123    }
 124   
 125  280 protected void preprocessClassNode(ClassNode node) {
 126  280 Logger.getLogger(getClass()).debug("Printing class \"" + node + "\" and its " + node.getInboundDependencies().size() + " inbounds and " + node.getOutboundDependencies().size() + " outbounds");
 127   
 128  280 super.preprocessClassNode(node);
 129   
 130  280 raiseIndent();
 131   
 132  280 dependencies.clear();
 133    }
 134   
 135  280 protected void preprocessAfterDependenciesClassNode(ClassNode node) {
 136  280 Logger.getLogger(getClass()).debug("Class \"" + node + "\" with " + node.getInboundDependencies().size() + " inbounds and " + node.getOutboundDependencies().size() + " outbounds had " + dependencies.size() + " dependencies.");
 137   
 138  280 if (shouldShowClassNode(node) || !dependencies.isEmpty()) {
 139  272 lowerIndent();
 140  272 indent().printScopeNodeName(node, node.getSimpleName()).eol();
 141  272 raiseIndent();
 142    }
 143   
 144  280 printDependencies(node, dependencies);
 145    }
 146   
 147  280 protected void postprocessClassNode(ClassNode node) {
 148  280 lowerIndent();
 149   
 150  280 super.postprocessClassNode(node);
 151    }
 152   
 153  44 public void visitInboundClassNode(ClassNode node) {
 154  44 if (isShowInbounds()) {
 155  31 Logger.getLogger(getClass()).debug("Printing \"" + getCurrentNode() + "\" <-- \"" + node + "\"");
 156   
 157  31 Integer i = dependencies.get(node);
 158  31 if (i != null) {
 159  2 dependencies.put(node, i - 1);
 160    } else {
 161  29 dependencies.put(node, -1);
 162    }
 163    } else {
 164  13 Logger.getLogger(getClass()).debug("Ignoring \"" + getCurrentNode() + "\" <-- \"" + node + "\"");
 165    }
 166    }
 167   
 168  44 public void visitOutboundClassNode(ClassNode node) {
 169  44 if (isShowOutbounds()) {
 170  31 Logger.getLogger(getClass()).debug("Printing \"" + getCurrentNode() + "\" --> \"" + node + "\"");
 171   
 172  31 Integer i = dependencies.get(node);
 173  31 if (i != null) {
 174  0 dependencies.put(node, i + 1);
 175    } else {
 176  31 dependencies.put(node, 1);
 177    }
 178    } else {
 179  13 Logger.getLogger(getClass()).debug("Ignoring \"" + getCurrentNode() + "\" --> \"" + node + "\"");
 180    }
 181    }
 182   
 183  218 protected void preprocessFeatureNode(FeatureNode node) {
 184  218 Logger.getLogger(getClass()).debug("Printing feature \"" + node + "\" and its " + node.getInboundDependencies().size() + " inbounds and " + node.getOutboundDependencies().size() + " outbounds");
 185   
 186  218 super.preprocessFeatureNode(node);
 187   
 188  218 raiseIndent();
 189   
 190  218 dependencies.clear();
 191    }
 192   
 193  218 protected void postprocessFeatureNode(FeatureNode node) {
 194  218 Logger.getLogger(getClass()).debug("Feature \"" + node + "\" with " + node.getInboundDependencies().size() + " inbounds and " + node.getOutboundDependencies().size() + " outbounds had " + dependencies.size() + " dependencies.");
 195   
 196  218 if (shouldShowFeatureNode(node) || !dependencies.isEmpty()) {
 197  214 lowerIndent();
 198  214 if (perl().match("/([^\\.]*\\(.*\\))$/", node.getName())) {
 199  121 indent().printScopeNodeName(node, perl().group(1)).eol();
 200  93 } else if (perl().match("/([^\\.]*)$/", node.getName())) {
 201  93 indent().printScopeNodeName(node, perl().group(1)).eol();
 202    } else {
 203  0 indent().printScopeNodeName(node, node.getName().substring(node.getName().lastIndexOf('.') + 1)).eol();
 204    }
 205  214 raiseIndent();
 206    }
 207   
 208  218 printDependencies(node, dependencies);
 209   
 210  218 lowerIndent();
 211   
 212  218 super.postprocessFeatureNode(node);
 213    }
 214   
 215  102 public void visitInboundFeatureNode(FeatureNode node) {
 216  102 if (isShowInbounds()) {
 217  89 Logger.getLogger(getClass()).debug("Printing \"" + getCurrentNode() + "\" <-- \"" + node + "\"");
 218   
 219  89 Integer i = dependencies.get(node);
 220  89 if (i != null) {
 221  26 dependencies.put(node, i - 1);
 222    } else {
 223  63 dependencies.put(node, -1);
 224    }
 225    } else {
 226  13 Logger.getLogger(getClass()).debug("Ignoring \"" + getCurrentNode() + "\" <-- \"" + node + "\"");
 227    }
 228    }
 229   
 230  108 public void visitOutboundFeatureNode(FeatureNode node) {
 231  108 if (isShowOutbounds()) {
 232  95 Logger.getLogger(getClass()).debug("Printing \"" + getCurrentNode() + "\" --> \"" + node + "\"");
 233   
 234  95 Integer i = dependencies.get(node);
 235  95 if (i != null) {
 236  0 dependencies.put(node, i + 1);
 237    } else {
 238  95 dependencies.put(node, 1);
 239    }
 240    } else {
 241  13 Logger.getLogger(getClass()).debug("Ignoring \"" + getCurrentNode() + "\" --> \"" + node + "\"");
 242    }
 243    }
 244   
 245  1158 protected Printer printNodeName(Node node, String name) {
 246  1158 super.printNodeName(node, name);
 247   
 248  1158 if (isShowInferred() && !node.isConfirmed()) {
 249  708 append(" *");
 250    }
 251   
 252  1158 return this;
 253    }
 254   
 255  247 protected void printDependencies(Node node, Map<Node, Integer> dependencies) {
 256  247 for (Map.Entry<Node, Integer> entry : dependencies.entrySet()) {
 257  66 if (entry.getValue() < 0) {
 258  33 indent().append("<-- ").printDependencyNodeName(entry.getKey()).eol();
 259  33 } else if (entry.getValue() > 0) {
 260  33 indent().append("--> ").printDependencyNodeName(entry.getKey()).eol();
 261    } else {
 262  0 indent().append("<-> ").printDependencyNodeName(entry.getKey()).eol();
 263    }
 264    }
 265    }
 266    }