1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. 2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under 4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution, 5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html 6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: ReportGenerator.java,v 1.2.2.1 2004/07/16 23:32:04 vlad_r Exp $ 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.report.html; 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.BufferedReader; 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.BufferedWriter; 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.File; 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.FileOutputStream; 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.FileReader; 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException; 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.OutputStreamWriter; 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.UnsupportedEncodingException; 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.text.DecimalFormat; 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.text.FieldPosition; 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.text.NumberFormat; 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Date; 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Iterator; 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.LinkedList; 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.Descriptors; 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.Files; 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IProperties; 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IntObjectMap; 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IntVector; 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.ObjectIntMap; 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.Property; 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.asserts.$assert; 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.IAppConstants; 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.IAppErrorCodes; 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.EMMAProperties; 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.EMMARuntimeException; 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.ICoverageData; 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.IMetaData; 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.AbstractReportGenerator; 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.AllItem; 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.ClassItem; 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.IItem; 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.IItemAttribute; 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.IItemMetadata; 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.ItemComparator; 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.MethodItem; 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.PackageItem; 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.SourcePathCache; 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.SrcFileItem; 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.html.doc.*; 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/** 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class ReportGenerator extends AbstractReportGenerator 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project implements IAppErrorCodes 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: make sure relative file names are converted to relative URLs in all anchors/hrefs 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public ReportGenerator () 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_format = (DecimalFormat) NumberFormat.getPercentInstance (); // TODO: locale 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_fieldPosition = new FieldPosition (DecimalFormat.INTEGER_FIELD); 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_format.setMaximumFractionDigits (0); 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // IReportGenerator: 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public final String getType () 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return TYPE; 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public void process (final IMetaData mdata, final ICoverageData cdata, 82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final SourcePathCache cache, final IProperties properties) 83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws EMMARuntimeException 84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project initialize (mdata, cdata, cache, properties); 86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_pageTitle = null; 88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_footerBottom = null; 89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project File outDir = m_settings.getOutDir (); 91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((outDir == null) /* this should never happen */ || (outDir.equals (new File (Property.getSystemProperty ("user.dir", ""))))) 92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project outDir = new File ("coverage"); 94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_settings.setOutDir (outDir); 95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project long start = 0, end; 98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean trace1 = m_log.atTRACE1 (); 99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (trace1) start = System.currentTimeMillis (); 101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_queue = new LinkedList (); 104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_reportIDNamespace = new IDGenerator (mdata.size ()); 105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (m_queue.add (m_view.getRoot ()); ! m_queue.isEmpty (); ) 107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem head = (IItem) m_queue.removeFirst (); 109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project head.accept (this, null); 111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_reportIDNamespace = null; 114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (trace1) 117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project end = System.currentTimeMillis (); 119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_log.trace1 ("process", "[" + getType () + "] report generated in " + (end - start) + " ms"); 121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public void cleanup () 125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_queue = null; 127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_reportIDNamespace = null; 128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project super.cleanup (); 130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // IItemVisitor: 134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Object visit (final AllItem item, final Object ctx) 136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HTMLWriter out = null; 138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project File outFile = m_settings.getOutFile (); 141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (outFile == null) 142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project outFile = new File ("index".concat (FILE_EXTENSION)); 144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_settings.setOutFile (outFile); 145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final File fullOutFile = Files.newFile (m_settings.getOutDir (), outFile); 148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_log.info ("writing [" + getType () + "] report to [" + fullOutFile.getAbsolutePath () + "] ..."); 150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = openOutFile (fullOutFile, m_settings.getOutEncoding (), true); 152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int [] columns = m_settings.getColumnOrder (); 154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer buf = new StringBuffer (); 155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String title; 157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer _title = new StringBuffer (REPORT_HEADER_TITLE); 159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _title.append (" (generated "); 161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _title.append (new Date (EMMAProperties.getTimeStamp ())); 162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _title.append (')'); 163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title = _title.toString (); 165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLDocument page = createPage (title); 168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem [] path = getParentPath (item); 170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageHeader (page, item, path); 172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageFooter (page, item, path); 173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // [all] coverage summary table: 176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (1, "OVERALL COVERAGE SUMMARY", null); 178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable summaryTable = new HTMLTable ("100%", null, null, "0"); 180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow header = summaryTable.newTitleRow (); 183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // coverage row: 184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow coverage = summaryTable.newRow (); 185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell headercell = header.newCell (); 192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headercell.setText (attr.getName (), true); 193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean fail = (m_metrics [attrID] > 0) && ! attr.passes (item, m_metrics [attrID]); 197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = coverage.newCell (); 202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (buf.toString (), true); 203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (fail) cell.setClass (CSS_DATA_HIGHLIGHT); 204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (summaryTable); 208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // [all] stats summary table ([all] only): 210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (2, "OVERALL STATS SUMMARY", null); 212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable statsTable = new HTMLTable (null, null, null, "0"); 214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project statsTable.setClass (CSS_INVISIBLE_TABLE); 215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HTMLTable.IRow row = statsTable.newRow (); 217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("total packages:", true); 218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("" + item.getChildCount (), false); 219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (m_srcView && m_hasSrcFileInfo) 221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row = statsTable.newRow (); 223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("total executable files:", true); 224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("" + item.getAggregate (IItem.TOTAL_SRCFILE_COUNT), false); 225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row = statsTable.newRow (); 228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("total classes:", true); 229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("" + item.getAggregate (IItem.TOTAL_CLASS_COUNT), true); 230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row = statsTable.newRow (); 231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("total methods:", true); 232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("" + item.getAggregate (IItem.TOTAL_METHOD_COUNT), true); 233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (m_srcView && m_hasSrcFileInfo && m_hasLineNumberInfo) 235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row = statsTable.newRow (); 237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("total executable lines:", true); 238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("" + item.getAggregate (IItem.TOTAL_LINE_COUNT), true); 239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow first = statsTable.newRow (); // stats always available 244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project first.newCell ().setText ("total packages: " + item.getChildCount (), true); 246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project first.newCell ().setText ("total classes: " + item.getAggregate (IItem.TOTAL_CLASS_COUNT), true); 247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project first.newCell ().setText ("total methods: " + item.getAggregate (IItem.TOTAL_METHOD_COUNT), true); 248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (m_srcView && m_hasSrcFileInfo) 250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow second = statsTable.newRow (); 252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell1 = second.newCell (); 254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell1.setText ("total source files: " + item.getAggregate (IItem.TOTAL_SRCFILE_COUNT), true); 255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (m_hasLineNumberInfo) 257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell2 = second.newCell (); 259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell2.setText ("total executable source lines: " + item.getAggregate (IItem.TOTAL_LINE_COUNT), true); 261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell2.getAttributes ().set (Attribute.COLSPAN, "2"); 262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell1.getAttributes ().set (Attribute.COLSPAN, "3"); 266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (statsTable); 271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean deeper = (m_settings.getDepth () > item.getMetadata ().getTypeID ()); 273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // render package summary tables on the same page: 275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (2, "COVERAGE BREAKDOWN BY PACKAGE", null); 277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable childSummaryTable = new HTMLTable ("100%", null, null, "0"); 279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int [] headerColumns = null; 281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean odd = true; 283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ItemComparator order = m_typeSortComparators [PackageItem.getTypeMetadata ().getTypeID ()]; 284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (Iterator packages = item.getChildren (order); packages.hasNext (); odd = ! odd) 285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem pkg = (IItem) packages.next (); 287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (headerColumns == null) 289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headerColumns = addHeaderRow (pkg, childSummaryTable, columns); 292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // coverage row: 295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String childHREF = null; 296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (deeper) 297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project childHREF = getItemHREF (item, pkg); 299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addItemRow (pkg, odd, childSummaryTable, headerColumns, childHREF, false); 301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (deeper) m_queue.addLast (pkg); 303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (childSummaryTable); 306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.emit (out); 309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.flush (); 310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project finally 312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (out != null) out.close (); 314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = null; 315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return ctx; 318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Object visit (final PackageItem item, final Object ctx) 321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HTMLWriter out = null; 323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (m_verbose) m_log.verbose (" report: processing package [" + item.getName () + "] ..."); 326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final File outFile = getItemFile (NESTED_ITEMS_PARENT_DIR, m_reportIDNamespace.getID (getItemKey (item))); 328f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 329f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = openOutFile (Files.newFile (m_settings.getOutDir (), outFile), m_settings.getOutEncoding (), true); 330f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 331f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int [] columns = m_settings.getColumnOrder (); 332f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer buf = new StringBuffer (); 333f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 334f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: set title [from a prop?] 335f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLDocument page = createPage (REPORT_HEADER_TITLE); 336f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 337f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem [] path = getParentPath (item); 338f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 339f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageHeader (page, item, path); 340f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageFooter (page, item, path); 341f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 342f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 343f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // summary table: 344f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 345f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 346f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElement itemname = IElement.Factory.create (Tag.SPAN); 347f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemname.setText (item.getName (), true); 348f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemname.setClass (CSS_ITEM_NAME); 349f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 350f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElementList title = new ElementList (); 351f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (new Text ("COVERAGE SUMMARY FOR PACKAGE [", true)); 352f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (itemname); 353f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (new Text ("]", true)); 354f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 355f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (1, title, null); 356f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 357f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 358f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable summaryTable = new HTMLTable ("100%", null, null, "0"); 359f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 360f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 361f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow header = summaryTable.newTitleRow (); 362f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // coverage row: 363f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow coverage = summaryTable.newRow (); 364f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 365f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 366f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 367f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 368f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 369f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 370f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell headercell = header.newCell (); 371f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headercell.setText (attr.getName (), true); 372f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 373f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 374f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 375f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean fail = (m_metrics [attrID] > 0) && ! attr.passes (item, m_metrics [attrID]); 376f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 377f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 378f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 379f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 380f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = coverage.newCell (); 381f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (buf.toString (), true); 382f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (fail) cell.setClass (CSS_DATA_HIGHLIGHT); 383f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 384f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 385f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 386f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (summaryTable); 387f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 388f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean deeper = (m_settings.getDepth () > item.getMetadata ().getTypeID ()); 389f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 390f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // render child summary tables on the same page: 391f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 392f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String summaryTitle = m_srcView ? "COVERAGE BREAKDOWN BY SOURCE FILE" : "COVERAGE BREAKDOWN BY CLASS"; 393f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (2, summaryTitle, null); 394f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 395f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable childSummaryTable = new HTMLTable ("100%", null, null, "0"); 396f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 397f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int [] headerColumns = null; 398f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 399f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean odd = true; 400f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ItemComparator order = m_typeSortComparators [m_srcView ? SrcFileItem.getTypeMetadata ().getTypeID () : ClassItem.getTypeMetadata ().getTypeID ()]; 401f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (Iterator srcORclsFiles = item.getChildren (order); srcORclsFiles.hasNext (); odd = ! odd) 402f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 403f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem srcORcls = (IItem) srcORclsFiles.next (); 404f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 405f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (headerColumns == null) 406f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 407f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 408f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headerColumns = addHeaderRow (srcORcls, childSummaryTable, columns); 409f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 410f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 411f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // coverage row: 412f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String childHREF = null; 413f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (deeper) 414f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 415f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project childHREF = getItemHREF (item, srcORcls); 416f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 417f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addItemRow (srcORcls, odd, childSummaryTable, headerColumns, childHREF, false); 418f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 419f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (deeper) m_queue.addLast (srcORcls); 420f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 421f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 422f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (childSummaryTable); 423f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 424f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 425f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.emit (out); 426f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.flush (); 427f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 428f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project finally 429f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 430f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (out != null) out.close (); 431f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = null; 432f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 433f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 434f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return ctx; 435f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 436f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 437f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Object visit (final SrcFileItem item, final Object ctx) 438f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 439f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // this visit only takes place in src views 440f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 441f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HTMLWriter out = null; 442f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 443f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 444f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final File outFile = getItemFile (NESTED_ITEMS_PARENT_DIR, m_reportIDNamespace.getID (getItemKey (item))); 445f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 446f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = openOutFile (Files.newFile (m_settings.getOutDir (), outFile), m_settings.getOutEncoding (), true); 447f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 448f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int [] columns = m_settings.getColumnOrder (); 449f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer buf = new StringBuffer (); 450f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 451f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: set title [from a prop?] 452f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLDocument page = createPage (REPORT_HEADER_TITLE); 453f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 454f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem [] path = getParentPath (item); 455f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 456f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageHeader (page, item, path); 457f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageFooter (page, item, path); 458f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 459f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 460f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // summary table: 461f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 462f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 463f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElement itemname = IElement.Factory.create (Tag.SPAN); 464f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemname.setText (item.getName (), true); 465f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemname.setClass (CSS_ITEM_NAME); 466f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 467f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElementList title = new ElementList (); 468f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (new Text ("COVERAGE SUMMARY FOR SOURCE FILE [", true)); 469f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (itemname); 470f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (new Text ("]", true)); 471f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 472f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (1, title, null); 473f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 474f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 475f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable summaryTable = new HTMLTable ("100%", null, null, "0"); 476f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 477f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 478f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow header = summaryTable.newTitleRow (); 479f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // coverage row: 480f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow coverage = summaryTable.newRow (); 481f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 482f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 483f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 484f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 485f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 486f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 487f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell headercell = header.newCell (); 488f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headercell.setText (attr.getName (), true); 489f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 490f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 491f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 492f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean fail = (m_metrics [attrID] > 0) && ! attr.passes (item, m_metrics [attrID]); 493f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 494f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 495f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 496f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 497f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = coverage.newCell (); 498f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (buf.toString (), true); 499f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (fail) cell.setClass (CSS_DATA_HIGHLIGHT); 500f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 501f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 502f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 503f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (summaryTable); 504f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 505f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean deeper = (m_settings.getDepth () > ClassItem.getTypeMetadata ().getTypeID ()); 506f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean embedSrcFile = deeper && srcFileAvailable (item, m_cache); 507f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean createAnchors = embedSrcFile && m_hasLineNumberInfo; 508f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 509f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IDGenerator pageIDNamespace = createAnchors ? new IDGenerator () : null; 510f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 511f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // child summary table is special for srcfile items: 512f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 513f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (2, "COVERAGE BREAKDOWN BY CLASS AND METHOD", null); 514f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 515f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IntObjectMap lineAnchorIDMap = embedSrcFile ? new IntObjectMap () : null; 516f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable childSummaryTable = new HTMLTable ("100%", null, null, "0"); 517f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 518f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project childSummaryTable.setClass (CSS_CLS_NOLEFT); 519f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 520f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 521f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int [] headerColumns = null; 522f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 523f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ItemComparator order = m_typeSortComparators [ClassItem.getTypeMetadata ().getTypeID ()]; 524f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int clsIndex = 0; 525f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (Iterator classes = item.getChildren (order); classes.hasNext (); ++ clsIndex) 526f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 527f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ClassItem cls = (ClassItem) classes.next (); 528f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 529f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (headerColumns == null) 530f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 531f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 532f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headerColumns = addHeaderRow (cls, childSummaryTable, columns); 533f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 534f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 535f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String HREFname = null; 536f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 537f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // special class subheader: 538f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (createAnchors) 539f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 540f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 541f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 542f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (lineAnchorIDMap != null); 543f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (pageIDNamespace != null); 544f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 545f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 546f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String childKey = getItemKey (cls); 547f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 548f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HREFname = addLineAnchorID (cls.getFirstLine (), pageIDNamespace.getID (childKey), lineAnchorIDMap); 549f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 550f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 551f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addClassRow (cls, clsIndex, childSummaryTable, headerColumns, HREFname, createAnchors); 552f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 553f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// // row to separate this class's methods: 554f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// final HTMLTable.IRow subheader = childSummaryTable.newTitleRow (); 555f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// final HTMLTable.ICell cell = subheader.newCell (); 556f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// // TODO: cell.setColspan (???) 557f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// cell.setText ("class " + child.getName () + " methods:", true); 558f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 559f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean odd = false; 560f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ItemComparator order2 = m_typeSortComparators [MethodItem.getTypeMetadata ().getTypeID ()]; 561f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (Iterator methods = cls.getChildren (order2); methods.hasNext (); odd = ! odd) 562f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 563f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final MethodItem method = (MethodItem) methods.next (); 564f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 565f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HREFname = null; 566f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 567f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (createAnchors) 568f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 569f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 570f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 571f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (lineAnchorIDMap != null); 572f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (pageIDNamespace != null); 573f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 574f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 575f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String child2Key = getItemKey (method); 576f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 577f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HREFname = addLineAnchorID (method.getFirstLine (), pageIDNamespace.getID (child2Key), lineAnchorIDMap); 578f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 579f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 580f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addClassItemRow (method, odd, childSummaryTable, headerColumns, HREFname, createAnchors); 581f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 582f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 583f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 584f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (childSummaryTable); 585f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 586f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 587f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // embed source file: 588f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 589f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (deeper) 590f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 591f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //page.addHR (1); 592f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addEmptyP (); 593f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 594f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project embedSrcFile (item, page, lineAnchorIDMap, m_cache); 595f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 596f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //page.addHR (1); 597f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 598f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 599f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 600f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.emit (out); 601f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.flush (); 602f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 603f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project finally 604f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 605f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (out != null) out.close (); 606f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = null; 607f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 608f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 609f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return ctx; 610f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 611f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 612f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public Object visit (final ClassItem item, final Object ctx) 613f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 614f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // this visit only takes place in class views 615f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 616f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project HTMLWriter out = null; 617f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 618f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 619f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final File outFile = getItemFile (NESTED_ITEMS_PARENT_DIR, m_reportIDNamespace.getID (getItemKey (item))); 620f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 621f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: deal with overwrites 622f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = openOutFile (Files.newFile (m_settings.getOutDir (), outFile), m_settings.getOutEncoding (), true); 623f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 624f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int [] columns = m_settings.getColumnOrder (); 625f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer buf = new StringBuffer (); 626f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 627f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: set title [from a prop?] 628f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLDocument page = createPage (REPORT_HEADER_TITLE); 629f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 630f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem [] path = getParentPath (item); 631f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 632f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageHeader (page, item, path); 633f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageFooter (page, item, path); 634f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 635f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 636f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 637f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // summary table: 638f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 639f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 640f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElement itemname = IElement.Factory.create (Tag.SPAN); 641f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemname.setText (item.getName (), true); 642f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemname.setClass (CSS_ITEM_NAME); 643f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 644f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElementList title = new ElementList (); 645f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (new Text ("COVERAGE SUMMARY FOR CLASS [", true)); 646f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (itemname); 647f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project title.add (new Text ("]", true)); 648f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 649f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (1, title, null); 650f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 651f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 652f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable summaryTable = new HTMLTable ("100%", null, null, "0"); 653f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 654f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 655f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow header = summaryTable.newTitleRow (); 656f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // coverage row: 657f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow coverage = summaryTable.newRow (); 658f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 659f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 660f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 661f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 662f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 663f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 664f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell headercell = header.newCell (); 665f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headercell.setText (attr.getName (), true); 666f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 667f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 668f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 669f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean fail = (m_metrics [attrID] > 0) && ! attr.passes (item, m_metrics [attrID]); 670f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 671f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 672f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 673f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 674f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = coverage.newCell (); 675f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (buf.toString (), true); 676f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (fail) cell.setClass (CSS_DATA_HIGHLIGHT); 677f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 678f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 679f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 680f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (summaryTable); 681f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 682f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 683f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // child summary table: 684f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 685f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addH (2, "COVERAGE BREAKDOWN BY METHOD", null); 686f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 687f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable childSummaryTable = new HTMLTable ("100%", null, null, "0"); 688f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 689f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int [] headerColumns = null; 690f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 691f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean odd = true; 692f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ItemComparator order = m_typeSortComparators [MethodItem.getTypeMetadata ().getTypeID ()]; 693f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (Iterator methods = item.getChildren (order); methods.hasNext (); odd = ! odd) 694f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 695f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final MethodItem method = (MethodItem) methods.next (); 696f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 697f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (headerColumns == null) 698f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 699f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 700f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headerColumns = addHeaderRow (method, childSummaryTable, columns); 701f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 702f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 703f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addItemRow (method, odd, childSummaryTable, headerColumns, null, false); 704f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 705f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 706f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (childSummaryTable); 707f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 708f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 709f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.emit (out); 710f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out.flush (); 711f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 712f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project finally 713f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 714f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (out != null) out.close (); 715f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = null; 716f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 717f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 718f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return ctx; 719f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 720f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 721f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // protected: ............................................................. 722f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 723f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // package: ............................................................... 724f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 725f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // private: ............................................................... 726f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 727f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 728f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final class IDGenerator 729f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 730f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project IDGenerator () 731f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 732f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_namespace = new ObjectIntMap (101); 733f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_out = new int [1]; 734f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 735f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 736f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project IDGenerator (final int initialCapacity) 737f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 738f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_namespace = new ObjectIntMap (initialCapacity); 739f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_out = new int [1]; 740f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 741f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 742f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String getID (final String key) 743f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 744f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int [] out = m_out; 745f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int ID; 746f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 747f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (m_namespace.get (key, out)) 748f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ID = out [0]; 749f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 750f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 751f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ID = m_namespace.size (); 752f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_namespace.put (key, ID); 753f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 754f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 755f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return Integer.toHexString (ID); 756f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 757f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 758f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private final ObjectIntMap /* key:String->ID */ m_namespace; 759f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private final int [] m_out; 760f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 761f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of nested class 762f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 763f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 764f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private HTMLDocument createPage (final String title) 765f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 766f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLDocument page = new HTMLDocument (title, m_settings.getOutEncoding ()); 767f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.addStyle (CSS); // TODO: split by visit type 768f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 769f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return page; 770f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 771f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 772f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IElement addPageHeader (final HTMLDocument page, final IItem item, final IItem [] path) 773f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 774f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: merge header and footer in the same method 775f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 776f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 777f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 778f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (page != null); 779f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 780f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 781f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable header = new HTMLTable ("100%", null, null, "0"); 782f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project header.setClass (CSS_HEADER_FOOTER); 783f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 784f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 785f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project addPageHeaderTitleRow (header); 786f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 787f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // nav row: 788f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 789f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow navRow = header.newRow (); 790f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 791f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = navRow.newCell (); 792f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (CSS_NAV); 793f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 794f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int lLimit = path.length > 1 ? path.length - 1 : path.length; 795f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int l = 0; l < lLimit; ++ l) 796f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 797f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (LEFT_BRACKET); 798f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 799f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String name = path [l].getName (); 800f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String HREF = getItemHREF (item, path [l]); 801f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (new HyperRef (HREF, name, true)); 802f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 803f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (RIGHT_BRACKET); 804f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 805f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 806f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 807f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.setHeader (header); 808f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 809f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return header; 810f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 811f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 812f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IElement addPageFooter (final HTMLDocument page, final IItem item, final IItem [] path) 813f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 814f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 815f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 816f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (page != null); 817f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 818f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 819f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable footerTable = new HTMLTable ("100%", null, null, "0"); 820f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project footerTable.setClass (CSS_HEADER_FOOTER); 821f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 822f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // nav row: 823f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 824f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow navRow = footerTable.newRow (); 825f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 826f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = navRow.newCell (); 827f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (CSS_NAV); 828f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 829f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int lLimit = path.length > 1 ? path.length - 1 : path.length; 830f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int l = 0; l < lLimit; ++ l) 831f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 832f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (LEFT_BRACKET); 833f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 834f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String name = path [l].getName (); 835f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String HREF = getItemHREF (item, path [l]); 836f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (new HyperRef (HREF, name, true)); 837f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 838f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (RIGHT_BRACKET); 839f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 840f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 841f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 842f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // title row: 843f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 844f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow titleRow = footerTable.newRow (); 845f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 846f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = titleRow.newCell (); 847f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (CSS_TITLE); 848f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 849f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (getFooterBottom ()); 850f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 851f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 852f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final ElementList footer = new ElementList (); 853f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 854f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project footer.add (IElement.Factory.create (Tag.P)); // spacer 855f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project footer.add (footerTable); 856f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 857f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.setFooter (footer); 858f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 859f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return footerTable; 860f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 861f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 862f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private int [] addHeaderRow (final IItem item, final HTMLTable table, final int [] columns) 863f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 864f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 865f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 866f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (item != null, "null input: item"); 867f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (table != null, "null input: table"); 868f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (columns != null, "null input: columns"); 869f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 870f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 871f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // header row: 872f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow header = table.newTitleRow (); 873f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 874f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // determine the set of columns actually present in the header [may be narrower than 'columns']: 875f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IntVector headerColumns = new IntVector (columns.length); 876f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 877f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 878f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 879f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 880f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 881f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 882f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 883f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 884f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = header.newCell (); 885f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 886f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (attr.getName (), true);//.getAttributes ().set (Attribute.WIDTH, "20%"); 887f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (headerCellStyle (c)); 888f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project headerColumns.add (attrID); 889f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 890f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 891f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // note: by design this does not create columns for nonexistent attribute types 892f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 893f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 894f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return headerColumns.values (); 895f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 896f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 897f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 898f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * No header row, just data rows. 899f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 900f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void addItemRow (final IItem item, final boolean odd, final HTMLTable table, final int [] columns, final String nameHREF, final boolean anchor) 901f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 902f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 903f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 904f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (item != null, "null input: item"); 905f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (table != null, "null input: table"); 906f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (columns != null, "null input: columns"); 907f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 908f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 909f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow row = table.newRow (); 910f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (odd) row.setClass (CSS_ODDROW); 911f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 912f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer buf = new StringBuffer (11); // TODO: reuse a buffer 913f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 914f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 915f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 916f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 917f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 918f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 919f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 920f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 921f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = row.newCell (); 922f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 923f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((nameHREF != null) && (attrID == IItemAttribute.ATTRIBUTE_NAME_ID)) 924f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 925f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 926f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 927f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 928f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project trimForDisplay (buf); 929f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 930f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String fullHREFName = anchor ? "#".concat (nameHREF) : nameHREF; 931f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 932f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (new HyperRef (fullHREFName, buf.toString (), true)); 933f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 934f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 935f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 936f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean fail = (m_metrics [attrID] > 0) && ! attr.passes (item, m_metrics [attrID]); 937f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 938f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 939f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 940f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 941f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project trimForDisplay (buf); 942f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 943f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (buf.toString (), true); 944f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (fail) cell.setClass (CSS_DATA_HIGHLIGHT); 945f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 946f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 947f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 948f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 949f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // note: by design this puts empty cells for nonexistent attribute types 950f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 951f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = row.newCell (); 952f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (" ", true); 953f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 954f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 955f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 956f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 957f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void addClassRow (final ClassItem item, final int clsIndex, final HTMLTable table, final int [] columns, 958f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String itemHREF, final boolean isAnchor) 959f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 960f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 961f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 962f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (item != null, "null input: item"); 963f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (table != null, "null input: table"); 964f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (columns != null, "null input: columns"); 965f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 966f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 967f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow blank = table.newRow (); 968f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 969f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow row = table.newRow (); 970f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.setClass (CSS_CLASS_ITEM_SPECIAL); 971f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 972f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer buf = new StringBuffer (11); 973f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 974f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 975f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 976f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 977f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 978f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 979f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 980f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 981f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 982f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 983f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 984f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell blankcell = blank.newCell (); 985f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project blankcell.setClass (clsIndex == 0 ? CSS_BLANK : CSS_BOTTOM); 986f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project blankcell.setText (" ", true); 987f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 988f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = row.newCell (); 989f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 990f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean fail = false; 991f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attrID == IItemAttribute.ATTRIBUTE_NAME_ID) 992f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 993f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (itemHREF != null) 994f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 995f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String fullItemHREF = isAnchor ? "#".concat (itemHREF) : itemHREF; 996f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 997f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (new Text ("class ", true)); 998f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (new HyperRef (fullItemHREF, buf.toString (), true)); 999f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1000f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1001f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1002f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText ("class " + buf.toString (), true); 1003f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1004f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1005f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1006f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1007f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fail = (m_metrics [attrID] > 0) && ! attr.passes (item, m_metrics [attrID]); 1008f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1009f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (buf.toString (), true); 1010f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1011f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1012f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (dataCellStyle (c, fail)); 1013f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1014f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1015f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1016f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = row.newCell (); 1017f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (" ", true); 1018f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (dataCellStyle (c, false)); 1019f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1020f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1021f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1022f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1023f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1024f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void addClassItemRow (final IItem item, final boolean odd, final HTMLTable table, final int [] columns, final String nameHREF, final boolean anchor) 1025f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1026f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 1027f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1028f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (item != null, "null input: item"); 1029f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (table != null, "null input: table"); 1030f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (columns != null, "null input: columns"); 1031f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1032f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1033f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow row = table.newRow (); 1034f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (odd) row.setClass (CSS_ODDROW); 1035f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1036f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer buf = new StringBuffer (11); // TODO: reuse a buffer 1037f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1038f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int c = 0; c < columns.length; ++ c) 1039f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1040f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int attrID = columns [c]; 1041f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ()); 1042f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1043f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (attr != null) 1044f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1045f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = row.newCell (); 1046f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1047f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean fail = false; 1048f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((nameHREF != null) && (attrID == IItemAttribute.ATTRIBUTE_NAME_ID)) 1049f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1050f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 1051f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 1052f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1053f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project trimForDisplay (buf); 1054f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1055f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String fullHREFName = anchor ? "#".concat (nameHREF) : nameHREF; 1056f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1057f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (new HyperRef (fullHREFName, buf.toString (), true)); 1058f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1059f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1060f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1061f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fail = (m_metrics [attrID] > 0) && ! attr.passes (item, m_metrics [attrID]); 1062f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1063f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (0); 1064f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project attr.format (item, buf); 1065f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1066f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project trimForDisplay (buf); 1067f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1068f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (buf.toString (), true); 1069f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1070f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1071f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (dataCellStyle (c, fail)); 1072f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1073f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1074f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1075f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // note: by design this puts empty cells for nonexistent attribute types 1076f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1077f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = row.newCell (); 1078f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setText (" ", true); 1079f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (dataCellStyle (c, false)); 1080f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1081f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1082f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1083f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1084f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1085f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private boolean srcFileAvailable (final SrcFileItem item, final SourcePathCache cache) 1086f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1087f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (cache == null) return false; 1088f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1089f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) $assert.ASSERT (item != null, "null input: item"); 1090f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1091f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String fileName = item.getName (); 1092f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) $assert.ASSERT (fileName.endsWith (".java"), "cache only handles .java extensions"); 1093f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1094f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: should I keep VM names in package items? 1095f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String packageVMName = ((PackageItem) item.getParent ()).getVMName (); 1096f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1097f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return (cache.find (packageVMName, fileName) != null); 1098f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1099f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// private boolean srcFileAvailable (final ClassItem item, final SourcePathCache cache) 1101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// { 1102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// if (cache == null) return false; 1103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// 1104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// if ($assert.ENABLED) $assert.ASSERT (item != null, "null input: item"); 1105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// 1106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// final String fileName = item.getSrcFileName (); 1107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// if ($assert.ENABLED) $assert.ASSERT (fileName.endsWith (".java"), "cache only handles .java extensions"); 1108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// 1109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// // TODO: should I keep VM names in package items? 1110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// final String packageVMName = ((PackageItem) item.getParent ()).getVMName (); 1111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// 1112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// return (cache.find (packageVMName, fileName) != null); 1113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// } 1114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void embedSrcFile (final SrcFileItem item, final HTMLDocument page, 1116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IntObjectMap /* line num:int->anchor name:String */anchorMap, 1117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final SourcePathCache cache) 1118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) 1120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (item != null, "null input: item"); 1122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (page != null, "null input: page"); 1123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String fileName = item.getName (); 1126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ($assert.ENABLED) $assert.ASSERT (fileName.endsWith (".java"), "cache only handles .java extensions"); 1127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: should I keep VM names in package items? 1129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String packageVMName = ((PackageItem) item.getParent ()).getVMName (); 1130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean success = false; 1132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable srcTable = new HTMLTable ("100%", null, null, "0"); 1134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (cache != null) // TODO: do this check earlier, in outer scope 1136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project srcTable.setClass (CSS_SOURCE); 1138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final File srcFile = cache.find (packageVMName, fileName); 1139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (srcFile != null) 1141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project BufferedReader in = null; 1143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 1144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project in = new BufferedReader (new FileReader (srcFile), IO_BUF_SIZE); 1146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final boolean markupCoverage = m_hasLineNumberInfo; 1148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int unitsType = m_settings.getUnitsType (); 1150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project IntObjectMap /* line num:int -> SrcFileItem.LineCoverageData */ lineCoverageMap = null; 1151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project StringBuffer tooltipBuffer = null; 1152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (markupCoverage) 1155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineCoverageMap = item.getLineCoverage (); 1157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project $assert.ASSERT (lineCoverageMap != null, "null: lineCoverageMap"); 1158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer = new StringBuffer (64); 1160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int l = 1; 1163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (String line; (line = in.readLine ()) != null; ++ l) 1164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow srcline = srcTable.newRow (); 1166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell lineNumCell = srcline.newCell (); 1167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineNumCell.setClass (CSS_LINENUM); 1168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (anchorMap != null) 1170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int adjustedl = l < SRC_LINE_OFFSET ? l : l + SRC_LINE_OFFSET; 1172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String anchor = (String) anchorMap.get (adjustedl); 1174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (anchor != null) 1175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElement a = IElement.Factory.create (Tag.A); 1177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //a.getAttributes ().set (Attribute.ID, anchor); ID anchoring does not work in NS 4.0 1178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project a.getAttributes ().set (Attribute.NAME, anchor); 1179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project a.setText (Integer.toString (l), true); 1181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineNumCell.add (a); 1183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineNumCell.setText (Integer.toString (l), true); 1187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineNumCell.setText (Integer.toString (l), true); 1192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell lineTxtCell = srcline.newCell (); 1195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineTxtCell.setText (line.length () > 0 ? line : " ", true); 1196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (markupCoverage) 1198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final SrcFileItem.LineCoverageData lCoverageData = (SrcFileItem.LineCoverageData) lineCoverageMap.get (l); 1200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (lCoverageData != null) 1202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (lCoverageData.m_coverageStatus) 1204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case SrcFileItem.LineCoverageData.LINE_COVERAGE_ZERO: 1206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project srcline.setClass (CSS_COVERAGE_ZERO); 1207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 1208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case SrcFileItem.LineCoverageData.LINE_COVERAGE_PARTIAL: 1210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project srcline.setClass (CSS_COVERAGE_PARTIAL); 1212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (USE_LINE_COVERAGE_TOOLTIPS) 1214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer.setLength (0); 1216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int [] coverageRatio = lCoverageData.m_coverageRatio [unitsType]; 1218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int d = coverageRatio [0]; 1220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int n = coverageRatio [1]; 1221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_format.format ((double) n / d, tooltipBuffer, m_fieldPosition); 1223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer.append (" line coverage ("); 1225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer.append (n); 1226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer.append (" out of "); 1227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer.append (d); 1228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (unitsType) 1230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case IItemAttribute.UNITS_COUNT: 1232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer.append (" basic blocks)"); 1233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 1234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case IItemAttribute.UNITS_INSTR: 1236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project tooltipBuffer.append (" instructions)"); 1237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 1238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // [Opera does not display TITLE tooltios on <TR> elements] 1241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineNumCell.getAttributes ().set (Attribute.TITLE, tooltipBuffer.toString ()); 1243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineTxtCell.getAttributes ().set (Attribute.TITLE, tooltipBuffer.toString ()); 1244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 1247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case SrcFileItem.LineCoverageData.LINE_COVERAGE_COMPLETE: 1249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project srcline.setClass (CSS_COVERAGE_COMPLETE); 1250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 1251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project default: $assert.ASSERT (false, "invalid line coverage status: " + lCoverageData.m_coverageStatus); 1253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of switch 1255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project success = true; 1260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project catch (Throwable t) 1262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project t.printStackTrace (System.out); // TODO: logging 1264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project success = false; 1265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project finally 1267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (in != null) try { in.close (); } catch (Throwable ignore) {} 1269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project in = null; 1270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (! success) 1275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project srcTable.setClass (CSS_INVISIBLE_TABLE); 1277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow row = srcTable.newTitleRow (); 1279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project row.newCell ().setText ("[source file '" + Descriptors.combineVMName (packageVMName, fileName) + "' not found in sourcepath]", false); 1280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project page.add (srcTable); 1283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static String addLineAnchorID (final int line, final String anchorID, 1287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IntObjectMap /* line num:int->anchorID:String */lineAnchorIDMap) 1288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (line > 0) 1290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String _anchorID = (String) lineAnchorIDMap.get (line); 1292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (_anchorID != null) 1293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return _anchorID; 1294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project lineAnchorIDMap.put (line, anchorID); 1297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return anchorID; 1299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return null; 1303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 1306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Always includes AllItem 1307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 1308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IItem [] getParentPath (IItem item) 1309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final LinkedList /* IItem */ _result = new LinkedList (); 1311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for ( ; item != null; item = item.getParent ()) 1313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _result.add (item); 1315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItem [] result = new IItem [_result.size ()]; 1318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int j = result.length - 1; 1319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (Iterator i = _result.iterator (); i.hasNext (); -- j) 1320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result [j] = (IItem) i.next (); 1322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result; 1325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 1328f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 1329f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 1330f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private String getItemHREF (final IItem base, final IItem item) 1331f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1332f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String itemHREF; 1333f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (item instanceof AllItem) 1334f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemHREF = m_settings.getOutFile ().getName (); // note that this is always a simple filename [no parent path] 1335f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1336f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project itemHREF = m_reportIDNamespace.getID (getItemKey (item)).concat (FILE_EXTENSION); 1337f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1338f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String fullHREF; 1339f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1340f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (base == null) 1341f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fullHREF = itemHREF; 1342f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1343f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1344f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int nesting = NESTING [base.getMetadata ().getTypeID ()] [item.getMetadata ().getTypeID ()]; 1345f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (nesting == 1) 1346f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fullHREF = NESTED_ITEMS_PARENT_DIRNAME.concat ("/").concat (itemHREF); 1347f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (nesting == -1) 1348f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fullHREF = "../".concat (itemHREF); 1349f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1350f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fullHREF = itemHREF; 1351f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1352f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1353f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return fullHREF; 1354f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1355f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1356f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1357f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IContent getPageTitle () 1358f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1359f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project IContent title = m_pageTitle; 1360f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (title == null) 1361f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1362f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElementList _title = new ElementList (); 1363f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1364f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _title.add (new HyperRef (IAppConstants.APP_HOME_SITE_LINK, IAppConstants.APP_NAME, true)); 1365f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1366f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer s = new StringBuffer (" Coverage Report (generated "); 1367f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s.append (new Date (EMMAProperties.getTimeStamp ())); 1368f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project s.append (')'); 1369f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1370f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _title.add (new Text (s.toString (), true)); 1371f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1372f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_pageTitle = title = _title; 1373f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1374f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1375f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return title; 1376f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1377f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1378f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IContent getFooterBottom () 1379f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1380f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project IContent bottom = m_footerBottom; 1381f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (bottom == null) 1382f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1383f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IElementList _bottom = new ElementList (); 1384f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1385f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _bottom.add (new HyperRef (IAppConstants.APP_BUG_REPORT_LINK, IAppConstants.APP_NAME + " " + IAppConstants.APP_VERSION_WITH_BUILD_ID_AND_TAG, true)); 1386f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _bottom.add (new Text (" " + IAppConstants.APP_COPYRIGHT, true)); 1387f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1388f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_footerBottom = bottom = _bottom; 1389f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1390f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1391f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return bottom; 1392f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1393f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1394f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void addPageHeaderTitleRow (final HTMLTable header) 1395f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1396f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.IRow titleRow = header.newTitleRow (); 1397f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1398f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final HTMLTable.ICell cell = titleRow.newCell (); 1399f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.setClass (CSS_TITLE); 1400f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project cell.add (getPageTitle ()); 1401f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1402f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1403f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static void trimForDisplay (final StringBuffer buf) 1404f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1405f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (buf.length () > MAX_DISPLAY_NAME_LENGTH) 1406f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1407f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.setLength (MAX_DISPLAY_NAME_LENGTH - 3); 1408f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project buf.append ("..."); 1409f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1410f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1411f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1412f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 1413f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Assumes relative pathnames. 1414f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 1415f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static File getItemFile (final File parentDir, final String itemKey) 1416f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1417f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (parentDir == null) 1418f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return new File (itemKey.concat (FILE_EXTENSION)); 1419f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1420f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return new File (parentDir, itemKey.concat (FILE_EXTENSION)); 1421f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1422f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1423f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static String getItemKey (IItem item) 1424f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1425f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer result = new StringBuffer (); 1426f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1427f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for ( ; item != null; item = item.getParent ()) 1428f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1429f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (item.getName ()); 1430f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (':'); 1431f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1432f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1433f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result.toString (); 1434f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1435f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1436f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static HTMLWriter openOutFile (final File file, final String encoding, final boolean mkdirs) 1437f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1438f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project BufferedWriter out = null; 1439f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 1440f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1441f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (mkdirs) 1442f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1443f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final File parent = file.getParentFile (); 1444f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (parent != null) parent.mkdirs (); 1445f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1446f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1447f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project out = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (file), encoding), IO_BUF_SIZE); 1448f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1449f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project catch (UnsupportedEncodingException uee) 1450f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1451f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: error code 1452f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new EMMARuntimeException (uee); 1453f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1454f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // note: in J2SDK 1.3 FileOutputStream constructor's throws clause 1455f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // was narrowed to FileNotFoundException: 1456f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project catch (IOException fnfe) // FileNotFoundException 1457f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1458f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: error code 1459f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new EMMARuntimeException (fnfe); 1460f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1461f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1462f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return new HTMLWriter (out); 1463f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1464f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1465f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static String dataCellStyle (final int column, final boolean highlight) 1466f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1467f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (column == 0) 1468f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return highlight ? CSS_DATA_HIGHLIGHT_FIRST : CSS_DATA_FIRST; 1469f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 1470f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return highlight ? CSS_DATA_HIGHLIGHT : CSS_DATA; 1471f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1472f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1473f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static String headerCellStyle (final int column) 1474f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1475f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return (column == 0) ? CSS_HEADER_FIRST : CSS_HEADER; 1476f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1477f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1478f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1479f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private final DecimalFormat m_format; 1480f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private final FieldPosition m_fieldPosition; 1481f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1482f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private LinkedList /* IITem */ m_queue; 1483f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IDGenerator m_reportIDNamespace; 1484f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1485f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private IContent m_pageTitle, m_footerBottom; 1486f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1487f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final boolean USE_LINE_COVERAGE_TOOLTIPS = true; 1488f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1489f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String TYPE = "html"; 1490f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String REPORT_HEADER_TITLE = IAppConstants.APP_NAME + " Coverage Report"; 1491f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final IContent LEFT_BRACKET = new Text ("[", false); 1492f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final IContent RIGHT_BRACKET = new Text ("]", false); 1493f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1494f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final int MAX_DISPLAY_NAME_LENGTH = 80; 1495f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final int SRC_LINE_OFFSET = 4; 1496f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1497f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1498f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_HEADER_FOOTER = "hdft"; 1499f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_TITLE = "tl"; 1500f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_NAV = "nv"; 1501f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1502f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_COVERAGE_ZERO = "z"; 1503f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_COVERAGE_PARTIAL = "p"; 1504f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_COVERAGE_COMPLETE = "c"; 1505f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1506f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String DARKER_BACKGROUND = "#F0F0F0"; 1507f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String TITLE_BACKGROUND = "#6699CC"; 1508f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String NAV_BACKGROUND = "#6633DD"; 1509f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1510f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_INVISIBLE_TABLE = "it"; 1511f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1512f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_ITEM_NAME = "in"; 1513f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1514f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_CLASS_ITEM_SPECIAL = "cis"; 1515f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1516f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_SOURCE = "s"; 1517f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_LINENUM = "l"; 1518f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1519f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_BOTTOM = "bt"; 1520f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_ODDROW = "o"; 1521f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_BLANK = "b"; 1522f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1523f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_DATA = ""; 1524f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_DATA_HIGHLIGHT = CSS_DATA + "h"; 1525f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_DATA_FIRST = CSS_DATA + "f"; 1526f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_DATA_HIGHLIGHT_FIRST = CSS_DATA + "hf"; 1527f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_HEADER = ""; 1528f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_HEADER_FIRST = CSS_HEADER + "f"; 1529f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1530f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS_CLS_NOLEFT = "cn"; 1531f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1532f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: optimize this 1533f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1534f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String CSS = 1535f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE,TD,TH {border-style:solid; border-color:black;}" + 1536f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD,TH {background:white;margin:0;line-height:100%;padding-left:0.5em;padding-right:0.5em;}" + 1537f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1538f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD {border-width:0 1px 0 0;}" + 1539f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TH {border-width:1px 1px 1px 0;}" + 1540f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TR TD." + CSS_DATA_HIGHLIGHT + " {color:red;}" + 1541f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1542f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE {border-spacing:0; border-collapse:collapse;border-width:0 0 1px 1px;}" + 1543f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1544f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " P,H1,H2,H3,TH {font-family:verdana,arial,sans-serif;font-size:10pt;}" + 1545f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD {font-family:courier,monospace;font-size:10pt;}" + 1546f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1547f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_HEADER_FOOTER + " {border-spacing:0;border-collapse:collapse;border-style:none;}" + 1548f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_HEADER_FOOTER + " TH,TABLE." + CSS_HEADER_FOOTER + " TD {border-style:none;line-height:normal;}" + 1549f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1550f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_HEADER_FOOTER + " TH." + CSS_TITLE + ",TABLE." + CSS_HEADER_FOOTER + " TD." + CSS_TITLE + " {background:" + TITLE_BACKGROUND + ";color:white;}" + 1551f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_HEADER_FOOTER + " TD." + CSS_NAV + " {background:" + NAV_BACKGROUND + ";color:white;}" + 1552f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1553f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " ." + CSS_NAV + " A:link {color:white;}" + 1554f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " ." + CSS_NAV + " A:visited {color:white;}" + 1555f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " ." + CSS_NAV + " A:active {color:yellow;}" + 1556f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1557f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_HEADER_FOOTER + " A:link {color:white;}" + 1558f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_HEADER_FOOTER + " A:visited {color:white;}" + 1559f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_HEADER_FOOTER + " A:active {color:yellow;}" + 1560f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1561f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //" ." + CSS_ITEM_NAME + " {color:#6633FF;}" + 1562f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //" ." + CSS_ITEM_NAME + " {color:#C000E0;}" + 1563f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " ." + CSS_ITEM_NAME + " {color:#356085;}" + 1564f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1565f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //" A:hover {color:#0066FF; text-decoration:underline; font-style:italic}" + 1566f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1567f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_SOURCE + " TD {padding-left:0.25em;padding-right:0.25em;}" + 1568f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_SOURCE + " TD." + CSS_LINENUM + " {padding-left:0.25em;padding-right:0.25em;text-align:right;background:" + DARKER_BACKGROUND + ";}" + 1569f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_SOURCE + " TR." + CSS_COVERAGE_ZERO + " TD {background:#FF9999;}" + 1570f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_SOURCE + " TR." + CSS_COVERAGE_PARTIAL + " TD {background:#FFFF88;}" + 1571f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_SOURCE + " TR." + CSS_COVERAGE_COMPLETE + " TD {background:#CCFFCC;}" + 1572f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1573f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " A:link {color:#0000EE;text-decoration:none;}" + 1574f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " A:visited {color:#0000EE;text-decoration:none;}" + 1575f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " A:hover {color:#0000EE;text-decoration:underline;}" + 1576f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1577f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_CLS_NOLEFT + " {border-width:0 0 1px 0;}" + 1578f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TABLE." + CSS_SOURCE + " {border-width:1px 0 1px 1px;}" + 1579f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1580f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// " TD {border-width: 0px 1px 0px 0px; }" + 1581f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD." + CSS_DATA_HIGHLIGHT + " {color:red;border-width:0 1px 0 0;}" + 1582f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD." + CSS_DATA_FIRST + " {border-width:0 1px 0 1px;}" + 1583f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD." + CSS_DATA_HIGHLIGHT_FIRST + " {color:red;border-width:0 1px 0 1px;}" + 1584f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1585f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// " TH {border-width: 1px 1px 1px 0px; }" + 1586f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TH." + CSS_HEADER_FIRST + " {border-width:1px 1px 1px 1px;}" + 1587f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1588f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TR." + CSS_CLASS_ITEM_SPECIAL + " TD {background:" + DARKER_BACKGROUND + ";}" + 1589f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TR." + CSS_CLASS_ITEM_SPECIAL + " TD {border-width:1px 1px 1px 0;}" + 1590f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TR." + CSS_CLASS_ITEM_SPECIAL + " TD." + CSS_DATA_HIGHLIGHT + " {color:red;border-width:1px 1px 1px 0;}" + 1591f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TR." + CSS_CLASS_ITEM_SPECIAL + " TD." + CSS_DATA_FIRST + " {border-width:1px 1px 1px 1px;}" + 1592f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TR." + CSS_CLASS_ITEM_SPECIAL + " TD." + CSS_DATA_HIGHLIGHT_FIRST + " {color:red;border-width:1px 1px 1px 1px;}" + 1593f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1594f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD." + CSS_BLANK + " {border-style:none;background:transparent;line-height:50%;} " + 1595f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TD." + CSS_BOTTOM + " {border-width:1px 0 0 0;background:transparent;line-height:50%;}" + 1596f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project " TR." + CSS_ODDROW + " TD {background:" + DARKER_BACKGROUND + ";}" + 1597f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1598f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project "TABLE." + CSS_INVISIBLE_TABLE + " {border-style:none;}" + 1599f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project "TABLE." + CSS_INVISIBLE_TABLE + " TD,TABLE." + CSS_INVISIBLE_TABLE + " TH {border-style:none;}" + 1600f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1601f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ""; 1602f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1603f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String NESTED_ITEMS_PARENT_DIRNAME = "_files"; 1604f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final File NESTED_ITEMS_PARENT_DIR = new File (NESTED_ITEMS_PARENT_DIRNAME); 1605f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final int [][] NESTING; // set in <clinit>; this reflects the dir structure for the report 1606f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1607f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final String FILE_EXTENSION = ".html"; 1608f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final int IO_BUF_SIZE = 32 * 1024; 1609f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1610f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final long [] ATTRIBUTE_SETS; // set in <clinit> 1611f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1612f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project static 1613f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1614f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final IItemMetadata [] allTypes = IItemMetadata.Factory.getAllTypes (); 1615f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1616f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ATTRIBUTE_SETS = new long [allTypes.length]; 1617f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int t = 0; t < allTypes.length; ++ t) 1618f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 1619f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ATTRIBUTE_SETS [allTypes [t].getTypeID ()] = allTypes [t].getAttributeIDs (); 1620f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1621f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1622f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NESTING = new int [4][4]; 1623f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1624f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int base = AllItem.getTypeMetadata().getTypeID (); 1625f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NESTING [base][PackageItem.getTypeMetadata ().getTypeID ()] = 1; 1626f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NESTING [base][SrcFileItem.getTypeMetadata ().getTypeID ()] = 1; 1627f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NESTING [base][ClassItem.getTypeMetadata ().getTypeID ()] = 1; 1628f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1629f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project base = PackageItem.getTypeMetadata().getTypeID (); 1630f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NESTING [base][AllItem.getTypeMetadata ().getTypeID ()] = -1; 1631f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1632f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project base = SrcFileItem.getTypeMetadata().getTypeID (); 1633f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NESTING [base][AllItem.getTypeMetadata ().getTypeID ()] = -1; 1634f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1635f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project base = ClassItem.getTypeMetadata().getTypeID (); 1636f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NESTING [base][AllItem.getTypeMetadata ().getTypeID ()] = -1; 1637f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 1638f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 1639f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class 1640f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 1641