View Javadoc

1   /*
2   Copyright (C) 2001 Chr. Clemens Lee <clemens@kclee.com>.
3   
4   This file is part of JavaNCSS
5   (http://www.kclee.com/clemens/java/javancss/).
6   
7   JavaNCSS is free software; you can redistribute it and/or modify it
8   under the terms of the GNU General Public License as published by the
9   Free Software Foundation; either version 2, or (at your option) any
10  later version.
11  
12  JavaNCSS is distributed in the hope that it will be useful, but WITHOUT
13  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15  for more details.
16  
17  You should have received a copy of the GNU General Public License
18  along with JavaNCSS; see the file COPYING.  If not, write to
19  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  Boston, MA 02111-1307, USA.  */
21  
22  package javancss;
23  
24  import java.text.DecimalFormat;
25  import java.text.NumberFormat;
26  import java.util.Calendar;
27  import java.util.Iterator;
28  import java.util.List;
29  import java.util.Locale;
30  
31  import ccl.util.Util;
32  
33  /**
34   * Generates XML output of Java metrics.
35   *
36   * @author    Chr. Clemens Lee <clemens@kclee.com>
37   * @version   $Id: XmlFormatter.java 121 2009-01-17 22:19:45Z hboutemy $
38   */
39  public class XmlFormatter implements Formatter
40  {
41      private final Javancss _javancss;
42  
43      private double _divide( int divident, int divisor )
44      {
45          double dRetVal = 0.0;
46          if ( divisor > 0) {
47              dRetVal = Math.round(((double)divident/(double)divisor)*100)/100.0;
48          }
49  
50          return dRetVal;
51      }
52  
53      private double _divide( long divident, long divisor )
54      {
55          double dRetVal = 0.0;
56          if ( divisor > 0) {
57              dRetVal = Math.round(((double)divident/(double)divisor)*100)/100.0;
58          }
59  
60          return dRetVal;
61      }
62  
63      private NumberFormat _pNumberFormat = null;
64  
65      private String _formatPackageMatrix( int packages
66                                           , int classesSum
67                                           , int functionsSum
68                                           , int ncssSum
69                                           , int javadocsSum                                // added by SMS
70                                           , int javadocLnSum                                // added by SMS
71                                           , int singleLnSum                                // added by SMS
72                                           , int multiLnSum                )                // added by SMS
73      {
74          //NumberFormat pNumberFormat = new DecimalFormat("#,##0.00");
75  
76          String sRetVal =
77              "    <table>\n"
78              + "      <tr><td>Packages</td><td>Classes</td><td>Functions</td><td>NCSS</td><td>Javadocs</td><td>per</td></tr>\n"
79  
80  
81              + "      <tr><td>"
82              + _pNumberFormat.format( packages )
83              + "</td><td>"
84              + _pNumberFormat.format( classesSum )
85              + "</td><td>"
86              + _pNumberFormat.format( functionsSum )
87              + "</td><td>"
88              + _pNumberFormat.format( ncssSum )
89              + "</td><td>"
90              + _pNumberFormat.format( javadocsSum )
91              + "</td><td>Project</td></tr>\n"
92              + "      <tr><td></td><td>"
93              + _pNumberFormat.format( _divide( classesSum, packages ) )
94              + "</td><td>"
95              + _pNumberFormat.format( _divide( functionsSum, packages ) )
96              + "</td><td>"
97              + _pNumberFormat.format( _divide( ncssSum, packages ) )
98              + "</td><td>"
99              + _pNumberFormat.format( _divide( javadocsSum, packages ) )
100             + "</td><td>Package</td></tr>\n"
101             + "      <tr><td></td><td></td><td>"
102             + _pNumberFormat.format( _divide( functionsSum, classesSum ) )
103             + "</td><td>"
104             + _pNumberFormat.format( _divide( ncssSum, classesSum ) )
105             + "</td><td>"
106             + _pNumberFormat.format( _divide( javadocsSum, classesSum ) )
107             + "</td><td>Class</td></tr>\n"
108             + "      <tr><td></td><td></td><td></td><td>"
109             + _pNumberFormat.format( _divide( ncssSum, functionsSum ) )
110             + "</td><td>"
111             //+ _pNumberFormat.format( _divide( ncssSum, functionsSum ) )
112             + _pNumberFormat.format( _divide( javadocsSum, functionsSum ) )
113             + "</td><td>Function</td></tr>\n"
114             + "    </table>\n";
115         /*
116         String sRetVal =
117             "    <table>\n"
118             + "      <tr><td>Packages</td><td>Classes</td><td>Functions</td><td>NCSS</td>"
119             + "<td>javadocs</td><td>javadocs_lines</td><td>single_comment_lines"
120             + "</td><td>implementation_comment_lines</td><td>per</td></tr>\n"
121             + "      <tr><td>"
122             + _pNumberFormat.format( packages )
123             + "</td><td>"
124             + _pNumberFormat.format( classesSum )
125             + "</td><td>"
126             + _pNumberFormat.format( functionsSum )
127             + "</td><td>"
128             + _pNumberFormat.format( ncssSum )
129                 + "</td><td>"
130             + _pNumberFormat.format( javadocSum )
131                 + "</td><td>"
132             + _pNumberFormat.format( javadocLnSum )
133                 + "</td><td>"
134             + _pNumberFormat.format( singleLnSum )
135                 + "</td><td>"
136             + _pNumberFormat.format( multiLnSum )
137             + "</td><td>Project</td></tr>\n"
138             + "      <tr><td></td><td>"
139             + _pNumberFormat.format( _divide( classesSum, packages ) )
140             + "</td><td>"
141             + _pNumberFormat.format( _divide( functionsSum, packages ) )
142             + "</td><td>"
143             + _pNumberFormat.format( _divide( ncssSum, packages ) )
144                 + "</td><td>"
145             + _pNumberFormat.format( _divide( javadocSum, packages ) )
146                 + "</td><td>"
147             + _pNumberFormat.format( _divide( javadocLnSum, packages ) )
148                 + "</td><td>"
149             + _pNumberFormat.format( _divide( javadocLnSum, packages ) )
150                 + "</td><td>"
151             + _pNumberFormat.format( _divide( multiLnSum, packages ) )
152             + "</td><td>Package</td></tr>\n"
153             + "      <tr><td></td><td></td><td>"
154             + _pNumberFormat.format( _divide( functionsSum, classesSum ) )
155             + "</td><td>"
156             + _pNumberFormat.format( _divide( ncssSum, classesSum ) )
157                 + "</td><td>"
158             + _pNumberFormat.format( _divide( javadocSum, classesSum ) )
159                 + "</td><td>"
160             + _pNumberFormat.format( _divide( javadocLnSum, classesSum ) )
161                 + "</td><td>"
162             + _pNumberFormat.format( _divide( javadocLnSum, classesSum ) )
163                 + "</td><td>"
164             + _pNumberFormat.format( _divide( multiLnSum, classesSum ) )
165             + "</td><td>Class</td></tr>\n"
166             + "      <tr><td></td><td></td><td></td><td>"
167             + _pNumberFormat.format( _divide( ncssSum, functionsSum ) )
168                 + "</td><td>"
169             + _pNumberFormat.format( _divide( javadocSum, functionsSum ) )
170                 + "</td><td>"
171             + _pNumberFormat.format( _divide( javadocLnSum, functionsSum ) )
172                 + "</td><td>"
173             + _pNumberFormat.format( _divide( javadocLnSum, functionsSum ) )
174                 + "</td><td>"
175             + _pNumberFormat.format( _divide( multiLnSum, functionsSum ) )
176             + "</td><td>Function</td></tr>\n"
177             + "    </table>\n";
178         */
179 
180         return sRetVal;
181     }
182 
183     public XmlFormatter( Javancss javancss )
184     {
185         super();
186 
187         _javancss = javancss;
188 
189         _pNumberFormat = NumberFormat.getInstance( Locale.US );
190         ((DecimalFormat)_pNumberFormat).applyPattern( "#,##0.00" );
191     }
192 
193     public String printPackageNcss()
194     {
195         StringBuffer sbRetVal = new StringBuffer( "  <packages>\n" );
196         List vPackageMetrics = _javancss.getPackageMetrics();
197 
198         int packages = vPackageMetrics.size();
199         int classesSum = 0;
200         int functionsSum = 0;
201         int ncssSum = 0;
202         //added by SMS
203         int javadocSum = 0;
204         int javadocLnSum = 0;
205         int singleLnSum = 0;
206         int multiLnSum = 0;
207         //
208         for( Iterator ePackages = vPackageMetrics.iterator(); ePackages.hasNext(); )
209         {
210             PackageMetric pPackageMetric = (PackageMetric)ePackages.next();
211 
212             classesSum += pPackageMetric.classes;
213             functionsSum += pPackageMetric.functions;
214             ncssSum += pPackageMetric.ncss;
215             // added by SMS
216             javadocSum += pPackageMetric.javadocs;
217             javadocLnSum += pPackageMetric.javadocsLn;
218             singleLnSum += pPackageMetric.singleLn;
219             multiLnSum += pPackageMetric.multiLn;
220             //
221             sbRetVal.append(
222                    "    <package>\n" +
223                    "      <name>" + pPackageMetric.name + "</name>\n" +
224                    "      <classes>" + pPackageMetric.classes + "</classes>\n" +
225                    "      <functions>" + pPackageMetric.functions + "</functions>\n" +
226                    "      <ncss>" + pPackageMetric.ncss + "</ncss>\n" +
227                    "      <javadocs>" + pPackageMetric.javadocs + "</javadocs>\n" +
228                    "      <javadoc_lines>" + pPackageMetric.javadocsLn + "</javadoc_lines>\n" +
229                    "      <single_comment_lines>" + pPackageMetric.singleLn + "</single_comment_lines>\n" +
230                    "      <multi_comment_lines>" + pPackageMetric.multiLn + "</multi_comment_lines>\n" +
231                    "    </package>\n" );
232         }
233 
234         sbRetVal.append(
235                "    <total>\n" +
236                "      <classes>" + classesSum + "</classes>\n" +
237                "      <functions>" + functionsSum + "</functions>\n" +
238                "      <ncss>" + ncssSum + "</ncss>\n" +
239                "      <javadocs>" + javadocSum + "</javadocs>\n" +
240                "      <javadoc_lines>" + javadocLnSum + "</javadoc_lines>\n" +
241                "      <single_comment_lines>" + singleLnSum + "</single_comment_lines>\n" +
242                "      <multi_comment_lines>" + multiLnSum + "</multi_comment_lines>\n" +
243                "    </total>\n" );
244 
245         sbRetVal.append( _formatPackageMatrix( packages
246                                          , classesSum
247                                          , functionsSum
248                                          , ncssSum
249                                          , javadocSum                                // added by SMS
250                                          , javadocLnSum                                // added by SMS
251                                          , singleLnSum                                // added by SMS
252                                          , multiLnSum               ) );                // added by SMS
253 
254         sbRetVal.append( "  </packages>\n" );
255 
256         return sbRetVal.toString();
257     }
258 
259     private String _formatObjectResume( int objects
260                                         , long lObjectSum
261                                         , long lFunctionSum
262                                         , long lClassesSum
263                                         , long lJVDCSum
264                                         , long lJVDCLSum
265                                         , long lSLSum
266                                         , long lMLSum                )
267     {
268         double fAverageNcss     = _divide( lObjectSum  , objects );
269         double fAverageFuncs    = _divide( lFunctionSum, objects );
270         double fAverageClasses  = _divide( lClassesSum , objects );
271         double fAverageJavadocs = _divide( lJVDCSum    , objects );
272         // added by SMS
273         //double fAverageJVDCL = _divide( lJVDCLSum   , objects );
274         //double fAverageSL         = _divide( lSLSum                , objects );
275         //double fAverageML         = _divide( lMLSum                , objects );
276         //
277         //NumberFormat _pNumberFormat = new DecimalFormat("#,##0.00");
278         String sRetVal =
279             "    <averages>\n" +
280             "      <ncss>" + _pNumberFormat.format( fAverageNcss ) + "</ncss>\n" +
281             "      <functions>" + _pNumberFormat.format( fAverageFuncs ) + "</functions>\n" +
282             "      <classes>" + _pNumberFormat.format( fAverageClasses ) + "</classes>\n" +
283             "      <javadocs>" + _pNumberFormat.format( fAverageJavadocs ) + "</javadocs>\n" +
284             //"      <javadocs_lines>" + _pNumberFormat.format( fAverageJVDCL ) + "</javadocs_lines>\n" +
285             //"      <single_comment_lines>" + _pNumberFormat.format( fAverageSL ) + "</single_comment_lines>\n" +
286             //"      <implementation_comment_lines>" + _pNumberFormat.format( fAverageML ) + "</implementation_comment_lines>\n" +
287             "    </averages>\n" +
288             "    <ncss>" + _pNumberFormat.format( _javancss.getNcss() ) + "</ncss>\n";
289 
290         return sRetVal;
291     }
292 
293     public String printObjectNcss() {
294         StringBuffer sbRetVal = new StringBuffer( "  <objects>\n" );
295 
296         List/*<ObjectMetric>*/ vObjectMetrics = _javancss.getObjectMetrics();
297 
298         long lFunctionSum = 0;
299         long lClassesSum  = 0;
300         long lObjectSum   = 0;
301         long lJVDCSum     = 0;
302         for( Iterator eClasses = vObjectMetrics.iterator(); eClasses.hasNext(); )
303         {
304             ObjectMetric classMetric = (ObjectMetric)eClasses.next();
305             String sClass = classMetric.name;
306             int objectNcss = classMetric.ncss;
307             int functions  = classMetric.functions;
308             int classes    = classMetric.classes;
309             int jvdcs      = classMetric.javadocs;
310 
311             // added by SMS
312             //int jvdcsl     = ((Integer)vClassMetrics.elementAt(OBJ_JVDC_LINES)).intValue();
313             //int singlel           = ((Integer)vClassMetrics.elementAt(OBJ_SINGLE_LINES)).intValue();
314             //int multil     = ((Integer)vClassMetrics.elementAt(OBJ_MULTI_LINES)).intValue();
315             //
316             lObjectSum   += (long)objectNcss;
317             lFunctionSum += (long)functions;
318             lClassesSum  += (long)classes;
319             lJVDCSum     += (long)jvdcs;
320             sbRetVal.append(
321                 "    <object>\n" +
322                 "      <name>"      + sClass     + "</name>\n"      +
323                 "      <ncss>"      + objectNcss + "</ncss>\n"      +
324                 "      <functions>" + functions  + "</functions>\n" +
325                 "      <classes>"   + classes    + "</classes>\n"   +
326                 "      <javadocs>"  + jvdcs      + "</javadocs>\n"  +
327                 //"      <javadocs_lines>" + jvdcsl + "</javadocs_lines>\n" +
328                 //"      <single_comment_lines>" + singlel + "</single_comment_lines>\n" +
329                 //"      <implementation_comment_lines>" + multil + "</implementation_comment_lines>\n" +
330                 "    </object>\n" );
331         }
332 
333         sbRetVal.append( _formatObjectResume( vObjectMetrics.size()
334                                         , lObjectSum
335                                         , lFunctionSum
336                                         , lClassesSum
337                                         , lJVDCSum
338                                         , _javancss.getJdcl()
339                                         , _javancss.getSl()
340                                         , _javancss.getMl()
341                                         ) );
342 
343         sbRetVal.append( "  </objects>\n" );
344 
345         return sbRetVal.toString();
346     }
347 
348     private String _formatFunctionResume( int functions
349                                           , long lFunctionSum
350                                           , long lCCNSum
351                                           , long lJVDCSum
352                                           , long lJVDCLSum
353                                           , long lSLSum
354                                           , long lMLSum                )
355     {
356         double fAverageNcss = _divide( lFunctionSum, functions );
357         double fAverageCCN  = _divide( lCCNSum     , functions );
358         double fAverageJVDC = _divide( lJVDCSum    , functions );
359 
360         // added by SMS
361         //double fAverageJVDCL = _divide( lJVDCLSum   , functions );
362         //double fAverageSL         = _divide( lSLSum                , functions );
363         //double fAverageML         = _divide( lMLSum                , functions );
364         //
365 
366         //NumberFormat _pNumberFormat = new DecimalFormat("#,##0.00");
367         String sRetVal = "    <function_averages>\n" +
368                        "      <ncss>" + _pNumberFormat.format( fAverageNcss ) + "</ncss>\n" +
369                        "      <ccn>"  + _pNumberFormat.format( fAverageCCN  ) + "</ccn>\n"  +
370                        "      <javadocs>" + _pNumberFormat.format( fAverageJVDC ) + "</javadocs>\n" +
371                        //"      <javadocs_lines>" + _pNumberFormat.format( fAverageJVDCL ) + "</javadocs_lines>\n" +
372                        //"      <single_comment_lines>" + _pNumberFormat.format( fAverageSL ) + "</single_comment_lines>\n" +
373                        //"      <implementation_comment_lines>" + _pNumberFormat.format( fAverageML ) + "</implementation_comment_lines>\n" +
374                        "    </function_averages>\n" +
375                        "    <ncss>" + _pNumberFormat.format( _javancss.getNcss() ) + "</ncss>\n";
376 
377         return sRetVal;
378     }
379 
380     public String printFunctionNcss()
381     {
382         StringBuffer sRetVal = new StringBuffer(80000);
383 
384         sRetVal.append( "  <functions>\n" );
385 
386         List vFunctionMetrics = _javancss.getFunctionMetrics();
387 
388         long lFunctionSum = 0;
389         long lCCNSum      = 0;
390         long lJVDCSum     = 0;
391         for( Iterator eFunctions = vFunctionMetrics.iterator(); eFunctions.hasNext(); )
392         {
393             FunctionMetric functionMetric = (FunctionMetric)eFunctions.next();
394             String sFunction = functionMetric.name;
395             int functionNcss = functionMetric.ncss;
396             int functionCCN  = functionMetric.ccn;
397             int functionJVDC = functionMetric.javadocs;
398 
399             // added by SMS
400             //int functionJVDCL        = ((Integer)vSingleFunctionMetrics.elementAt(FCT_JVDC_LINES)).intValue();
401             //int functionSL                = ((Integer)vSingleFunctionMetrics.elementAt(FCT_SINGLE_LINES)).intValue();
402             //int functionML                = ((Integer)vSingleFunctionMetrics.elementAt(FCT_MULTI_LINES)).intValue();
403             //
404 
405             lFunctionSum += (long)functionNcss;
406             lCCNSum      += (long)functionCCN;
407             lJVDCSum     += (long)functionJVDC;
408             sRetVal.append(
409                            "    <function>\n" +
410                            "      <name>" + sFunction + "</name>\n" +
411                            "      <ncss>" + functionNcss + "</ncss>\n" +
412                            "      <ccn>"  + functionCCN  + "</ccn>\n"  +
413                            "      <javadocs>" + functionJVDC + "</javadocs>\n" +
414                            //"      <javadocs_lines>" + functionJVDCL + "</javadocs_lines>\n" +
415                            //"      <single_comment_lines>" + functionSL + "</single_comment_lines>\n" +
416                            //"      <implementation_comment_lines>" + functionML + "</implementation_comment_lines>\n" +
417                            "    </function>\n" );
418         }
419 
420         sRetVal.append( _formatFunctionResume( vFunctionMetrics.size()
421                                                , lFunctionSum
422                                                , lCCNSum
423                                                , lJVDCSum
424                                                , _javancss.getJdcl()
425                                                , _javancss.getSl()
426                                                , _javancss.getMl()
427                                                ) );
428 
429         sRetVal.append( "  </functions>\n" );
430 
431         return sRetVal.toString();
432     }
433 
434     public String printJavaNcss() {
435         return        "  <ncss>" + _javancss.getNcss() + "</ncss>\n"
436                //+
437                //"  <javadocs>" + _javancss.getJvdc() + "</javadocs>\n" +
438                //"  <javadocs_lines>" + _javancss.getJdcl() + "</javadocs_lines>\n" +
439                //"  <single_comment_lines>" + _javancss.getSl() + "</single_comment_lines>\n" +
440                //"  <implementation_comment_lines>" + _javancss.getSl() + "</implementation_comment_lines>\n";
441                ;
442     }
443 
444     static public String printStart()
445     {
446         Calendar calendar = Util.getCalendar();
447 
448         return "<?xml version=\"1.0\"?>\n" +
449                "<javancss>\n" +
450                "  <date>" + Util.getDate( calendar ) + "</date>\n" +
451                "  <time>" + Util.getTime( calendar ) + "</time>\n";
452     }
453 
454     static public String printEnd()
455     {
456         return "</javancss>\n";
457     }
458 }