001: /*______________________________________________________________________________
002: *
003: * Macker http://innig.net/macker/
004: *
005: * Copyright 2002-2003 Paul Cantrell
006: *
007: * This program is free software; you can redistribute it and/or modify it under
008: * the terms of the GNU General Public License version 2, as published by the
009: * Free Software Foundation. See the file LICENSE.html for more information.
010: *
011: * This program is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
013: * FOR A PARTICULAR PURPOSE. See the license for more details.
014: *
015: * You should have received a copy of the GNU General Public License along with
016: * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
017: * Place, Suite 330 / Boston, MA 02111-1307 / USA.
018: *______________________________________________________________________________
019: */
020:
021: package net.innig.macker.event;
022:
023: import net.innig.macker.rule.RuleSet;
024: import net.innig.macker.rule.RuleSeverity;
025:
026: import java.io.Writer;
027: import java.io.PrintWriter;
028: import java.io.OutputStream;
029: import java.util.*;
030: import net.innig.collect.MultiMap;
031: import net.innig.collect.CompositeMultiMap;
032:
033: public class PrintingListener implements MackerEventListener {
034: public PrintingListener(PrintWriter out) {
035: this .out = out;
036: }
037:
038: public PrintingListener(Writer out) {
039: this .out = new PrintWriter(out, true);
040: }
041:
042: public PrintingListener(OutputStream out) {
043: this .out = new PrintWriter(out, true);
044: }
045:
046: public void setThreshold(RuleSeverity threshold) {
047: this .threshold = threshold;
048: }
049:
050: public void setMaxMessages(int maxMessages) {
051: this .maxMessages = maxMessages;
052: }
053:
054: public void mackerStarted(RuleSet ruleSet) {
055: if (ruleSet.getParent() == null || ruleSet.hasName()) {
056: out.println();
057: out.println("(Checking ruleset: " + ruleSet.getName()
058: + " ...)");
059: first = true;
060: }
061: }
062:
063: public void mackerFinished(RuleSet ruleSet)
064: throws MackerIsMadException {
065: }
066:
067: public void mackerAborted(RuleSet ruleSet) {
068: } // don't care
069:
070: public void handleMackerEvent(RuleSet ruleSet, MackerEvent event)
071: throws MackerIsMadException {
072: if (event instanceof ForEachEvent) {
073: if (event instanceof ForEachIterationStarted) {
074: ForEachIterationStarted iterStart = (ForEachIterationStarted) event;
075: out.print('(');
076: out.print(iterStart.getForEach().getVariableName());
077: out.print(": ");
078: out.print(iterStart.getVariableValue());
079: out.println(")");
080: }
081: // ignore other ForEachEvents
082: } else {
083: eventsBySeverity.put(event.getRule().getSeverity(), event);
084: if (event.getRule().getSeverity().compareTo(threshold) >= 0) {
085: if (messagesPrinted < maxMessages) {
086: if (first) {
087: out.println();
088: first = false;
089: }
090: out.println(event.toStringVerbose());
091: }
092: if (messagesPrinted == maxMessages)
093: out.println("WARNING: Exceeded the limit of "
094: + maxMessages + " message"
095: + (maxMessages == 1 ? "" : "s")
096: + "; further messages surpressed");
097: messagesPrinted++;
098: }
099:
100: }
101: }
102:
103: public void printSummary() {
104: // output looks like: "(2 errors, 1 warning)"
105: boolean firstSeverity = true;
106: List severities = new ArrayList(eventsBySeverity.keySet());
107: Collections.reverse(severities);
108: for (Iterator i = severities.iterator(); i.hasNext();) {
109: RuleSeverity severity = (RuleSeverity) i.next();
110: Collection eventsForSev = eventsBySeverity.get(severity);
111: if (eventsForSev.size() > 0) {
112: if (firstSeverity)
113: out.print("(");
114: else
115: out.print(", ");
116: firstSeverity = false;
117: out.print(eventsForSev.size());
118: out.print(' ');
119: out.print((eventsForSev.size() == 1) ? severity
120: .getName() : severity.getNamePlural());
121: }
122: }
123: if (!firstSeverity)
124: out.println(')');
125: }
126:
127: public String toString() {
128: return "PrintingListener";
129: }
130:
131: private boolean first;
132: private PrintWriter out;
133: private int maxMessages = Integer.MAX_VALUE, messagesPrinted = 0;
134: private RuleSeverity threshold = RuleSeverity.INFO;
135: private final MultiMap eventsBySeverity = new CompositeMultiMap(
136: TreeMap.class, HashSet.class);
137: }
|