Project Report: fawkez

Packagesummary org.jcoderz.commons.logging

org.jcoderz.commons.logging.BasicPrinter

LineHitsNoteSource
1  /*
2   * $Id: BasicPrinter.java 1535 2009-07-12 08:31:31Z amandel $
3   *
4   * Copyright 2006, The jCoderZ.org Project. All rights reserved.
5   *
6   * Redistribution and use in source and binary forms, with or without
7   * modification, are permitted provided that the following conditions are
8   * met:
9   *
10   *    * Redistributions of source code must retain the above copyright
11   *      notice, this list of conditions and the following disclaimer.
12   *    * Redistributions in binary form must reproduce the above
13   *      copyright notice, this list of conditions and the following
14   *      disclaimer in the documentation and/or other materials
15   *      provided with the distribution.
16   *    * Neither the name of the jCoderZ.org Project nor the names of
17   *      its contributors may be used to endorse or promote products
18   *      derived from this software without specific prior written
19   *      permission.
20   *
21   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
22   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24   * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS
25   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32   */
33  package org.jcoderz.commons.logging;
34  
35  
36  import java.io.PrintWriter;
37  import java.text.Format;
38  import java.text.MessageFormat;
39  import java.util.ArrayList;
40  import java.util.Arrays;
41  import java.util.Iterator;
42  import java.util.List;
43  import java.util.Set;
44  
45  import org.jcoderz.commons.util.Assert;
46  
47  /**
48   * This printer prints the log information as lines of text and uses the display
49   * options for selecting the fields to display.
50   * The format is similar to the log file format.
51   *
52   */
530(1)public class BasicPrinter
54        extends LogPrinter
55  {
56     private static final String SOURCE_TAG = "_LOGGED_AT_";
57     private static final String SOLUTION_TAG = "_SOLUTION_";
58     private static final String SYMBOL_TAG = "_SYMBOL_";
59  
60     private static final String FIRST_MSG_ITEM = "{0}";
61  
620    private MessageFormat mStackTraceFormat = null;
630    private MessageFormat mTraceLineFormat = null;
640    private MessageFormat mLogMessageFormat = null;
650    private MessageFormat mParameterLineFormat = null;
660    private MessageFormat mNestedLineFormat = null;
67  
680    private Object[] mStackTraceData = null;
690    private Object[] mTraceLineData = null;
700    private Object[] mLogMessageData = null;
710    private Object[] mParameterLineData = null;
720    private Object[] mNestedLineData = null;
73  
740    private final StringBuffer mBuffer = new StringBuffer();
75  
76     /** {@inheritDoc} */
77     public void setDisplayOptions (DisplayOptions options)
78     {
790       super.setDisplayOptions(options);
800       setStackTraceFormat();
810       setTraceLineFormat();
820       setLogMessageFormat();
830       setParameterLineFormat();
840       setNestedLineFormat();
850    }
86  
87     /** {@inheritDoc} */
88     public void print (
89           final PrintWriter printer,
90           final LogItem entry)
91     {
920       LogItem currentEntry = entry;
93  
940       Assert.notNull(printer, "Printer");
950       Assert.notNull(entry, "entry");
960       Assert.notNull(entry.getType(), "entry.getType()");
970       final List trackingIds = new ArrayList();
980       while (currentEntry != null)
99        {
1000          printEntry(printer, currentEntry, trackingIds);
1010          currentEntry = currentEntry.getNestedItem();
1020          if (currentEntry != null)
103           {
1040             printNesting(printer, currentEntry, trackingIds);
105           }
106        }
1070       currentEntry = entry;
1080       trackingIds.clear();
1090       while (currentEntry != null)
110        {
1110          if (displayStackTrace(currentEntry))
112           {
1130             printStackTrace(printer, currentEntry, trackingIds);
114           }
1150          currentEntry = currentEntry.getNestedItem();
116        }
1170    }
118  
119     /**
120      * @param printer
121    * @param currentEntry
122    * @param trackingIds
123    */
124     private void printEntry (
125           final PrintWriter printer,
126           final LogItem entry,
127           final List trackingIds)
128     {
1290       if (! entry.isExceptionItem())
130        {
1310          addTrackingNumber(trackingIds, entry.getTrackingNumber());
1320          final LogLineFormat.LogLineType type
133                 = LogLineFormat.getLogLineType(entry.getType().charAt(0));
1340          if ((type == LogLineFormat.TRACE_MESSAGE)
135                 || (type == LogLineFormat.EXCEPTION_MESSAGE))
136           {
1370             printTraceLine(printer, entry, trackingIds);
138           }
1390          else if ((type == LogLineFormat.LOG_MESSAGE)
140                 || (type == LogLineFormat.ERROR_MESSAGE))
141           {
1420             printMessageLine(printer, entry, trackingIds);
1430             printParameters(printer, entry, trackingIds);
144           }
145        }
1460    }
147  
148     private void setStackTraceFormat ()
149     {
1500       final Format[] formats = StackTraceFormat.getFormatList(
151              getDisplayOptions(), false);
152  
1530       mStackTraceData = new Object[formats.length];
154  
1550       final StringBuffer pattern = new StringBuffer(FIRST_MSG_ITEM);
1560       for (int i = 1; i < formats.length; ++i)
157        {
1580          pattern.append(" {").append(i).append('}');
159        }
1600       mStackTraceFormat = new MessageFormat(pattern.toString());
1610       mStackTraceFormat.setFormats(formats);
1620    }
163  
164     private void setTraceLineFormat ()
165     {
1660       final Format[] formats = TraceLineFormat.getFormatList(
167              getDisplayOptions(), false);
1680       mTraceLineData = new Object[formats.length];
169  
1700       final StringBuffer pattern = new StringBuffer(FIRST_MSG_ITEM);
1710       for (int i = 1; i < formats.length; ++i)
172        {
1730          pattern.append(" {").append(i).append('}');
174        }
1750       mTraceLineFormat = new MessageFormat(pattern.toString());
1760       mTraceLineFormat.setFormats(formats);
1770    }
178  
179     private void setLogMessageFormat ()
180     {
1810       final Format[] formats = MessageLineFormat.getFormatList(
182              getDisplayOptions(), false);
1830       mLogMessageData = new Object[formats.length];
184  
1850       final StringBuffer pattern = new StringBuffer(FIRST_MSG_ITEM);
1860       for (int i = 1; i < formats.length; ++i)
187        {
1880          pattern.append(" {").append(i).append('}');
189        }
1900       mLogMessageFormat = new MessageFormat(pattern.toString());
1910       mLogMessageFormat.setFormats(formats);
1920    }
193  
194     private void setParameterLineFormat ()
195     {
1960       final Format[] formats = ParameterLineFormat.getFormatList(
197              getDisplayOptions(), false);
198  
1990       mParameterLineData = new Object[formats.length];
200  
2010       final StringBuffer pattern = new StringBuffer(FIRST_MSG_ITEM);
202        int i;
2030       for (i = 1; i < formats.length - 1; ++i)
204        {
2050          pattern.append(" {").append(i).append('}');
206        }
2070       pattern.append(": \t{").append(i).append('}');
2080       mParameterLineFormat = new MessageFormat(pattern.toString());
2090       mParameterLineFormat.setFormats(formats);
2100    }
211  
212     private void setNestedLineFormat ()
213     {
2140       final Format[] formats = NestedLineFormat.getFormatList(
215              getDisplayOptions(), false);
2160       mNestedLineData = new Object[formats.length];
217  
2180       final StringBuffer pattern = new StringBuffer();
2190       int i = 0;
2200       for (i = 0; i < formats.length - 1; ++i)
221        {
2220          pattern.append('{').append(i).append("} ");
223        }
2240       pattern.append("Caused by: {").append(i).append('}');
2250       mNestedLineFormat = new MessageFormat(pattern.toString());
2260       mNestedLineFormat.setFormats(formats);
2270    }
228  
229     private void printTraceLine (
230           final PrintWriter writer,
231           final LogItem entry,
232           final List trackingIds)
233     {
2340       int i = 0;
2350       i = setTimeStamp(i, mTraceLineData, entry);
2360       i = setNodeId(i, mTraceLineData, entry);
2370       i = setInstanceId(i, mTraceLineData, entry);
2380       i = setThreadId(i, mTraceLineData, entry);
2390       i = setLoggerLevel(i, mTraceLineData, entry);
2400       i = setSymbolId(i, mTraceLineData, entry);
2410       i = setBusinessImpact(i, mTraceLineData, entry);
2420       i = setThreadName(i, mTraceLineData, entry);
2430       i = setCategory(i, mTraceLineData, entry);
2440       i = setTrackingNumber(i, mTraceLineData, trackingIds);
2450       i = setSource(i, mTraceLineData, entry);
2460(2)      i = setMessage(i, mTraceLineData, entry);
2470       mBuffer.setLength(0);
2480       mTraceLineFormat.format(mTraceLineData, mBuffer, null);
2490       writer.println(mBuffer);
2500    }
251  
252     private void printMessageLine (
253           final PrintWriter writer,
254           final LogItem entry,
255           final List trackingIds)
256     {
2570       int i = 0;
2580       i = setTimeStamp(i, mLogMessageData, entry);
2590       i = setNodeId(i, mLogMessageData, entry);
2600       i = setInstanceId(i, mLogMessageData, entry);
2610       i = setThreadId(i, mLogMessageData, entry);
2620       i = setLoggerLevel(i, mLogMessageData, entry);
2630       i = setSymbolId(i, mLogMessageData, entry);
2640       i = setBusinessImpact(i, mLogMessageData, entry);
2650       i = setThreadName(i, mTraceLineData, entry);
2660       i = setCategory(i, mLogMessageData, entry);
2670       i = setTrackingNumber(i, mLogMessageData, trackingIds);
2680(3)      i = setMessage(i, mLogMessageData, entry);
2690       mBuffer.setLength(0);
2700       mLogMessageFormat.format(mLogMessageData, mBuffer, null);
2710       writer.println(mBuffer);
2720    }
273  
274     private void printParameterLine (
275           final PrintWriter writer,
276           final LogItem entry,
277           final List trackingIds,
278           final String parameterName,
279           final List parameterValues)
280     {
2810       int i = 0;
2820       i = setThreadId(i, mParameterLineData, entry);
2830       i = setTrackingNumber(i, mParameterLineData, trackingIds);
284  
2850       mParameterLineData[i++] = parameterName;
2860(4)      mParameterLineData[i++] = parameterValues;
287  
2880       mBuffer.setLength(0);
2890       mParameterLineFormat.format(mParameterLineData, mBuffer, null);
2900       writer.println(mBuffer);
2910    }
292  
293     private void printStackTraceLine (
294           final PrintWriter writer,
295           final LogItem entry,
296           final List trackingIds,
297           final StackTraceInfo stacktraceLine)
298     {
2990       int i = 0;
3000       i = setThreadId(i, mStackTraceData, entry);
3010       i = setTrackingNumber(i, mStackTraceData, trackingIds);
302  
3030(5)      mStackTraceData[i++] = stacktraceLine.toString();
304  
3050       mBuffer.setLength(0);
3060       mStackTraceFormat.format(mStackTraceData, mBuffer, null);
3070       writer.println(mBuffer);
3080    }
309  
310     private void printNesting (
311           final PrintWriter writer,
312           final LogItem entry,
313           final List trackingIds)
314     {
3150       int i = 0;
3160       i = setThreadId(i, mNestedLineData, entry);
3170       i = setTrackingNumber(i, mNestedLineData, trackingIds);
3180(6)      i = setMessage(i, mNestedLineData, entry);
319  
3200       mBuffer.setLength(0);
3210       mNestedLineFormat.format(mNestedLineData, mBuffer, null);
3220       writer.println(mBuffer);
3230    }
324  
325     private void printParameters (
326           final PrintWriter writer,
327           final LogItem entry,
328           final List trackingIds)
329     {
3300       final StringBuffer source = getPrintableSource(
331              entry.getSourceClass(), entry.getSourceMethod());
3320       if (source != null)
333        {
3340          printParameterLine(
335                 writer, entry, trackingIds, SOURCE_TAG, Arrays.asList(
336                       new String[]{source.toString()}));
337        }
3380       if (getDisplayOptions().displaySymbol())
339        {
3400          printParameterLine(
341                 writer, entry, trackingIds, SYMBOL_TAG, Arrays.asList(
342                       new String[]{entry.getSymbol()}));
343        }
3440       if (getDisplayOptions().displaySolution())
345        {
3460          printParameterLine(
347                 writer, entry, trackingIds, SOLUTION_TAG, Arrays.asList(
348                       new String[]{entry.getSolution()}));
349        }
3500       if (getDisplayOptions().displayParameters())
351        {
3520          final Set names = entry.getParameterNames();
3530          for (final Iterator nameIter = names.iterator(); nameIter.hasNext(); )
354           {
3550             final String name = (String) nameIter.next();
3560             printParameterLine(writer, entry, trackingIds,
357                    name, entry.getParameterValues(name));
3580          }
359        }
3600    }
361  
362     private void printStackTrace (
363           final PrintWriter writer,
364           final LogItem entry,
365           final List trackingIds)
366     {
3670       for (final Iterator iter = entry.getStackTraceLines().iterator();
3680             iter.hasNext(); )
369        {
3700          final StackTraceInfo info = (StackTraceInfo) iter.next();
3710          if (! info.isMoreLine())
372           {
3730             printStackTraceLine(writer, entry, trackingIds, info);
374           }
375           else
376           {
3770             printMoreStackTrace(writer, entry, trackingIds, info);
378           }
3790       }
3800    }
381  
382     private void printMoreStackTrace (
383           final PrintWriter writer,
384           final LogItem entry,
385           final List trackingIds,
386           final StackTraceInfo info)
387     {
3880       final LogItem stackTraceEntry = getEntryForMoreStackTrace(entry, info);
3890       if (stackTraceEntry == null)
390        {
3910          throw new IllegalStateException("Did not find correct stack trace to "
392                 + "display for " + entry);
393        }
3940       else if (entry == stackTraceEntry)
395        {
3960          printStackTraceLine(writer, entry, trackingIds, info);
397        }
398        else
399        {
4000          printStackTrace(writer, stackTraceEntry, trackingIds);
401        }
4020    }
403  
404     private int setTimeStamp (
405           final int i,
406           final Object[] data,
407           final LogItem entry)
408     {
4090       int rc = i;
4100       if (getDisplayOptions().displayTimestamp())
411        {
4120          data[rc++] = entry.getTimestamp();
413        }
4140       return rc;
415     }
416  
417     private int setNodeId (
418           final int i,
419           final Object[] data,
420           final LogItem entry)
421     {
4220       int rc = i;
4230       if (getDisplayOptions().displayNodeId())
424        {
4250          data[rc++] = entry.getNodeId();
426        }
4270       return rc;
428     }
429  
430     private int setInstanceId (
431           final int i,
432           final Object[] data,
433           final LogItem entry)
434     {
4350       int rc = i;
4360       if (getDisplayOptions().displayInstanceId())
437        {
4380          data[rc++] = entry.getInstanceId();
439        }
4400       return rc;
441     }
442  
443     private int setThreadId (
444           final int i,
445           final Object[] data,
446           final LogItem entry)
447     {
4480       int rc = i;
4490       if (getDisplayOptions().displayThreadId())
450        {
4510          data[rc++] = String.valueOf(entry.getThreadId());
452        }
4530       return rc;
454     }
455  
456     private int setLoggerLevel (
457           final int i,
458           final Object[] data,
459           final LogItem entry)
460     {
4610       int rc = i;
4620       if (getDisplayOptions().displayLoggerLevel())
463        {
4640          data[rc++] = entry.getLoggerLevel().toString();
465        }
4660       return rc;
467     }
468  
469     private int setSymbolId (
470           final int i,
471           final Object[] data,
472           final LogItem entry)
473     {
4740       int rc = i;
4750       if (getDisplayOptions().displaySymbolId())
476        {
4770          data[rc++] = entry.getSymbolId();
478        }
4790       return rc;
480     }
481  
482     private int setBusinessImpact (
483           final int i,
484           final Object[] data,
485           final LogItem entry)
486     {
4870       int rc = i;
4880       if (getDisplayOptions().displayBusinessImpact())
489        {
4900          data[rc++] = entry.getBusinessImpact().toString();
491        }
4920       return rc;
493     }
494  
495     private int setCategory (
496           final int i,
497           final Object[] data,
498           final LogItem entry)
499     {
5000       int rc = i;
5010       if (getDisplayOptions().displayCategory())
502        {
5030          data[rc++] = entry.getCategory().toString();
504        }
5050       return rc;
506     }
507  
508     private int setThreadName (
509         final int i,
510         final Object[] data,
511         final LogItem entry)
512   {
5130     int rc = i;
5140     if (getDisplayOptions().displayThreadName())
515      {
5160        data[rc++] = entry.getThreadName();
517      }
5180     return rc;
519   }
520  
521     private int setTrackingNumber (
522           final int i,
523           final Object[] data,
524           final List trackingNumbers)
525     {
5260       int rc = i;
5270       if (getDisplayOptions().displayTrackingNumber())
528        {
5290          data[rc++] = trackingNumbers;
530        }
5310       return rc;
532     }
533  
534     private int setSource (
535           final int i,
536           final Object[] data,
537           final LogItem entry)
538     {
5390       int rc = i;
5400       final StringBuffer source
541           = getPrintableSource(entry.getSourceClass(), entry.getSourceMethod());
5420       if (source != null)
543        {
5440          data[rc++] = source.toString();
545        }
5460       return rc;
547     }
548  
549     /**
550      * Gets source class and method appended within one string buffer according
551      * to the display options currently set.
552      *
553      * @param sourceClass The name of the source class.
554      * @param sourceMethod The name of the source method.
555      *
556      * @return null if none of source class or method is to display;
557      * StringBuffer containing the displayable parts of source class name
558      * and source method name, else
559      */
560     private StringBuffer getPrintableSource (
561           final String sourceClass,
562           final String sourceMethod)
563     {
5640       StringBuffer rc = null;
5650       final StringBuffer source = new StringBuffer();
566  
5670       if (getDisplayOptions().displaySourceClass())
568        {
5690          rc = source.append(sourceClass);
570        }
5710       if (getDisplayOptions().displaySourceMethod())
572        {
5730          if (getDisplayOptions().displaySourceClass())
574           {
5750             rc = source.append('.');
576           }
5770          source.append(sourceMethod);
5780          if (sourceMethod.indexOf('(') < 0)
579           {
5800             rc = source.append("()");
581           }
582        }
5830       return rc;
584     }
585  
586     private int setMessage (
587           final int i,
588           final Object[] data,
589           final LogItem entry)
590     {
5910       int rc = i;
5920       data[rc++] = entry.getMessage();
5930       return rc;
594     }
595  
596     /**
597      * Adds the new tracking number as new tracking id to the sequence of
598      * tracking ids, if it is not already included as last element.
599      *
600      * @param trackingIds The list storing the sequence of tracking ids.
601      * @param newId The number to add to the sequence.
602      */
603     private void addTrackingNumber (
604           final List trackingIds,
605           final String newId)
606     {
6070       if (! trackingIds.isEmpty())
608        {
6090          if (! trackingIds.get(trackingIds.size() - 1).equals(newId))
610           {
6110             trackingIds.add(newId);
612           }
613        }
614        else
615        {
6160          trackingIds.add(newId);
617        }
6180    }
619  }
620  

Findings in this File

c (1) 53 : 0 Type Javadoc comment is missing an @author tag.
i (2) 246 : 0 Dead store to i in org.jcoderz.commons.logging.BasicPrinter.printTraceLine(PrintWriter, LogItem, List)
i (3) 268 : 0 Dead store to i in org.jcoderz.commons.logging.BasicPrinter.printMessageLine(PrintWriter, LogItem, List)
w (4) 286 : 0 method org.jcoderz.commons.logging.BasicPrinter.printParameterLine(PrintWriter, LogItem, List, String, List) adds unrelated types to collection or array
i (5) 303 : 0 Dead store to i in org.jcoderz.commons.logging.BasicPrinter.printStackTraceLine(PrintWriter, LogItem, List, StackTraceInfo)
i (6) 318 : 0 Dead store to i in org.jcoderz.commons.logging.BasicPrinter.printNesting(PrintWriter, LogItem, List)