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