Clover coverage report - Dependency Finder
Coverage timestamp: Mon Nov 29 2010 15:00:50 PST
file stats: LOC: 281   Methods: 35
NCLOC: 191   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
ListDiffPrinter.java 88.9% 75.5% 60% 73.5%
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.diff;
 34   
 35    import java.util.*;
 36   
 37    import org.apache.oro.text.perl.*;
 38   
 39    import com.jeantessier.text.*;
 40   
 41    public class ListDiffPrinter {
 42    public static final boolean DEFAULT_COMPRESS = false;
 43    public static final String DEFAULT_ENCODING = "utf-8";
 44    public static final String DEFAULT_DTD_PREFIX = "http://depfind.sourceforge.net/dtd";
 45    public static final String DEFAULT_INDENT_TEXT = PrinterBuffer.DEFAULT_INDENT_TEXT;
 46   
 47    private static final Perl5Util perl = new Perl5Util();
 48   
 49    private PrinterBuffer buffer = new PrinterBuffer();
 50   
 51    private boolean compress;
 52   
 53    private String name = "";
 54    private String oldVersion = "";
 55    private String newVersion = "";
 56    private Collection<String> removed = new TreeSet<String>();
 57    private Collection<String> added = new TreeSet<String>();
 58   
 59  2 public ListDiffPrinter() {
 60  2 this(DEFAULT_COMPRESS, DEFAULT_ENCODING, DEFAULT_DTD_PREFIX);
 61    }
 62   
 63  0 public ListDiffPrinter(boolean compress) {
 64  0 this(compress, DEFAULT_ENCODING, DEFAULT_DTD_PREFIX);
 65    }
 66   
 67  3 public ListDiffPrinter(String encoding, String dtdPrefix) {
 68  3 this(DEFAULT_COMPRESS, encoding, dtdPrefix);
 69    }
 70   
 71  10 public ListDiffPrinter(boolean compress, String encoding, String dtdPrefix) {
 72  10 this.compress = compress;
 73   
 74  10 appendHeader(encoding, dtdPrefix);
 75    }
 76   
 77  0 public void setIndentText(String indentText) {
 78  0 buffer.setIndentText(indentText);
 79    }
 80   
 81  10 private void appendHeader(String encoding, String dtdPrefix) {
 82  10 append("<?xml version=\"1.0\" encoding=\"").append(encoding).append("\" ?>").eol();
 83  10 eol();
 84  10 append("<!DOCTYPE list-diff SYSTEM \"").append(dtdPrefix).append("/list-diff.dtd\">").eol();
 85  10 eol();
 86    }
 87   
 88  10 public String getName() {
 89  10 return name;
 90    }
 91   
 92  0 public void setName(String name) {
 93  0 this.name = name;
 94    }
 95   
 96  10 public String getOldVersion() {
 97  10 return oldVersion;
 98    }
 99   
 100  0 public void setOldVersion(String oldVersion) {
 101  0 this.oldVersion = oldVersion;
 102    }
 103   
 104  10 public String getNewVersion() {
 105  10 return newVersion;
 106    }
 107   
 108  0 public void setNewVersion(String newVersion) {
 109  0 this.newVersion = newVersion;
 110    }
 111   
 112  10 public Collection<String> getRemoved() {
 113  10 return Collections.unmodifiableCollection(removed);
 114    }
 115   
 116  46 public void remove(String line) {
 117  46 this.removed.add(line);
 118    }
 119   
 120  10 public Collection<String> getAdded() {
 121  10 return Collections.unmodifiableCollection(added);
 122    }
 123   
 124  46 public void add(String line) {
 125  46 this.added.add(line);
 126    }
 127   
 128  0 protected ListDiffPrinter append(boolean b) {
 129  0 buffer.append(b);
 130  0 return this;
 131    }
 132   
 133  0 protected ListDiffPrinter append(char c) {
 134  0 buffer.append(c);
 135  0 return this;
 136    }
 137   
 138  0 protected ListDiffPrinter append(char[] str, int offset, int len) {
 139  0 buffer.append(str, offset, len);
 140  0 return this;
 141    }
 142   
 143  0 protected ListDiffPrinter append(char[] str) {
 144  0 buffer.append(str);
 145  0 return this;
 146    }
 147   
 148  0 protected ListDiffPrinter append(double d) {
 149  0 buffer.append(d);
 150  0 return this;
 151    }
 152   
 153  0 protected ListDiffPrinter append(float f) {
 154  0 buffer.append(f);
 155  0 return this;
 156    }
 157   
 158  0 protected ListDiffPrinter append(int i) {
 159  0 buffer.append(i);
 160  0 return this;
 161    }
 162   
 163  0 protected ListDiffPrinter append(long l) {
 164  0 buffer.append(l);
 165  0 return this;
 166    }
 167   
 168  0 protected ListDiffPrinter append(Object obj) {
 169  0 buffer.append(obj);
 170  0 return this;
 171    }
 172   
 173  432 protected ListDiffPrinter append(String str) {
 174  432 buffer.append(str);
 175  432 return this;
 176    }
 177   
 178  164 protected ListDiffPrinter indent() {
 179  164 buffer.indent();
 180  164 return this;
 181    }
 182   
 183  204 protected ListDiffPrinter eol() {
 184  204 buffer.eol();
 185  204 return this;
 186    }
 187   
 188  30 protected void raiseIndent() {
 189  30 buffer.raiseIndent();
 190    }
 191   
 192  30 protected void lowerIndent() {
 193  30 buffer.lowerIndent();
 194    }
 195   
 196  10 public String toString() {
 197  10 indent().append("<list-diff>").eol();
 198  10 raiseIndent();
 199   
 200  10 indent().append("<name>").append(getName()).append("</name>").eol();
 201  10 indent().append("<old>").append(getOldVersion()).append("</old>").eol();
 202  10 indent().append("<new>").append(getNewVersion()).append("</new>").eol();
 203   
 204  10 indent().append("<removed>").eol();
 205  10 raiseIndent();
 206  10 printLines(compress ? compress(getRemoved()) : getRemoved());
 207  10 lowerIndent();
 208  10 indent().append("</removed>").eol();
 209   
 210  10 indent().append("<added>").eol();
 211  10 raiseIndent();
 212  10 printLines(compress ? compress(getAdded()) : getAdded());
 213  10 lowerIndent();
 214  10 indent().append("</added>").eol();
 215   
 216  10 lowerIndent();
 217  10 indent().append("</list-diff>").eol();
 218   
 219  10 return buffer.toString();
 220    }
 221   
 222  20 private void printLines(Collection<String> lines) {
 223  20 for (String line : lines) {
 224  74 int pos = line.lastIndexOf(" [");
 225  74 if (pos != -1) {
 226  16 indent().append("<line>").append(line.substring(0, pos)).append("</line>").eol();
 227    } else {
 228  58 indent().append("<line>").append(line).append("</line>").eol();
 229    }
 230    }
 231    }
 232   
 233  8 private Collection<String> compress(Collection<String> lines) {
 234  8 Collection<String> result = new TreeSet<String>();
 235   
 236  8 for (String line : lines) {
 237  68 boolean add = true;
 238  68 if (line.endsWith(" [C]")) {
 239  8 String packageName = extractPackageName(line);
 240   
 241  8 add = !lines.contains(packageName + " [P]");
 242  60 } else if (line.endsWith(" [F]")) {
 243  18 String className = extractClassName(line);
 244  18 String packageName = extractPackageName(className);
 245   
 246  18 add = !lines.contains(packageName + " [P]") && !lines.contains(className + " [C]");
 247    }
 248   
 249  68 if (add) {
 250  50 result.add(line);
 251    }
 252    }
 253   
 254  8 return result;
 255    }
 256   
 257  26 private String extractPackageName(String className) {
 258  26 String result = "";
 259   
 260  26 int pos = className.lastIndexOf('.');
 261  26 if (pos != -1) {
 262  26 result = className.substring(0, pos);
 263    }
 264   
 265  26 return result;
 266    }
 267   
 268  18 private String extractClassName(String featureName) {
 269  18 String result = "";
 270   
 271  18 synchronized (perl) {
 272  18 if (perl.match("/^(.*)\\.[^\\.]*\\(.*\\)/", featureName)) {
 273  14 result = perl.group(1);
 274  4 } else if (perl.match("/^(.*)\\.[\\^.]*/", featureName)) {
 275  4 result = perl.group(1);
 276    }
 277    }
 278   
 279  18 return result;
 280    }
 281    }