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.1.1.1.2.1 2004/07/16 23:32:29 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.report.xml;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.BufferedWriter;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.File;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.FileOutputStream;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.OutputStreamWriter;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.UnsupportedEncodingException;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.Writer;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Date;
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Iterator;
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.Files;
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IConstants;
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IProperties;
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.Strings;
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.IAppConstants;
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.IAppErrorCodes;
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.EMMAProperties;
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.EMMARuntimeException;
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.ICoverageData;
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.IMetaData;
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.AbstractReportGenerator;
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.AllItem;
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.ClassItem;
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.IItem;
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.IItemAttribute;
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.IItemMetadata;
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.ItemComparator;
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.MethodItem;
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.PackageItem;
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.SourcePathCache;
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.report.SrcFileItem;
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class ReportGenerator extends AbstractReportGenerator
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            implements IAppErrorCodes
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // IReportGenerator:
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public String getType ()
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return TYPE;
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void process (final IMetaData mdata, final ICoverageData cdata,
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                         final SourcePathCache cache, final IProperties properties)
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws EMMARuntimeException
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        initialize (mdata, cdata, cache, properties);
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        long start = 0, end;
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final boolean trace1 = m_log.atTRACE1 ();
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (trace1) start = System.currentTimeMillis ();
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_view.getRoot ().accept (this, null);
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            close ();
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (trace1)
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            end = System.currentTimeMillis ();
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_log.trace1 ("process", "[" + getType () + "] report generated in " + (end - start) + " ms");
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void cleanup ()
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        close ();
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super.cleanup ();
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // IItemVisitor:
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object visit (final AllItem item, final Object ctx)
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            File outFile = m_settings.getOutFile ();
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (outFile == null)
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                outFile = new File ("coverage.xml");
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_settings.setOutFile (outFile);
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final File fullOutFile = Files.newFile (m_settings.getOutDir (), outFile);
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_log.info ("writing [" + getType () + "] report to [" + fullOutFile.getAbsolutePath () + "] ...");
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            openOutFile (fullOutFile, m_settings.getOutEncoding (), true);
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // XML header:
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.write ("<?xml version=\"1.0\" encoding=\"" + m_settings.getOutEncoding () + "\"?>");
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // build ID stamp:
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            try
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final StringBuffer label = new StringBuffer (101);
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                label.append ("<!-- ");
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                label.append (IAppConstants.APP_NAME);
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                label.append (" v"); label.append (IAppConstants.APP_VERSION_WITH_BUILD_ID_AND_TAG);
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                label.append (" report, generated ");
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                label.append (new Date (EMMAProperties.getTimeStamp ()));
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                label.append (" -->");
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_out.write (label.toString ());
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_out.newLine ();
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_out.flush ();
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            catch (IOException ioe)
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new EMMARuntimeException (IAppErrorCodes.REPORT_IO_FAILURE, ioe);
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            eol ();
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            openElementTag ("report");
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            closeElementTag (false);
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.incIndent ();
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // stats summary section:
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            eol ();
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            openElementTag ("stats");
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            closeElementTag (false);
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.incIndent ();
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                emitStatsCount ("packages", item.getChildCount ());
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                emitStatsCount ("classes", item.getAggregate (IItem.TOTAL_CLASS_COUNT));
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                emitStatsCount ("methods", item.getAggregate (IItem.TOTAL_METHOD_COUNT));
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (m_srcView && m_hasSrcFileInfo)
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    emitStatsCount ("srcfiles", item.getAggregate (IItem.TOTAL_SRCFILE_COUNT));
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (m_hasLineNumberInfo)
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        emitStatsCount ("srclines", item.getAggregate (IItem.TOTAL_LINE_COUNT));
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.decIndent ();
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            eol ();
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            endElement ("stats");
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // actual coverage data:
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            eol ();
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            openElementTag ("data");
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            closeElementTag (false);
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.incIndent ();
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final ItemComparator childrenOrder = m_typeSortComparators [PackageItem.getTypeMetadata ().getTypeID ()];
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                emitItem (item, childrenOrder);
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.decIndent ();
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            eol ();
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            endElement ("data");
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.decIndent ();
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            eol ();
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            endElement ("report");
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (IOException ioe)
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new EMMARuntimeException (IAppErrorCodes.REPORT_IO_FAILURE, ioe);
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return ctx;
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object visit (final PackageItem item, final Object ctx)
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (m_verbose) m_log.verbose ("  report: processing package [" + item.getName () + "] ...");
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final ItemComparator childrenOrder = m_typeSortComparators [m_srcView ? SrcFileItem.getTypeMetadata ().getTypeID () : ClassItem.getTypeMetadata ().getTypeID ()];
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            emitItem (item, childrenOrder);
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (IOException ioe)
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new EMMARuntimeException (IAppErrorCodes.REPORT_IO_FAILURE, ioe);
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return ctx;
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object visit (final SrcFileItem item, final Object ctx)
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final ItemComparator childrenOrder = m_typeSortComparators [ClassItem.getTypeMetadata ().getTypeID ()];
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            emitItem (item, childrenOrder);
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (IOException ioe)
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new EMMARuntimeException (IAppErrorCodes.REPORT_IO_FAILURE, ioe);
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return ctx;
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object visit (final ClassItem item, final Object ctx)
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final ItemComparator childrenOrder = m_typeSortComparators [MethodItem.getTypeMetadata ().getTypeID ()];
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            emitItem (item, childrenOrder);
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (IOException ioe)
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new EMMARuntimeException (IAppErrorCodes.REPORT_IO_FAILURE, ioe);
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return ctx;
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object visit (final MethodItem item, final Object ctx)
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            emitItem (item, null);
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (IOException ioe)
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new EMMARuntimeException (IAppErrorCodes.REPORT_IO_FAILURE, ioe);
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return ctx;
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final class IndentingWriter extends BufferedWriter
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void newLine () throws IOException
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_state = 0;
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            super.write (IConstants.EOL, 0, IConstants.EOL.length ());
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void write (final char [] cbuf, final int off, final int len) throws IOException
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            indent ();
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            super.write (cbuf, off, len);
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void write (int c) throws IOException
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            indent ();
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            super.write (c);
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void write (final String s, final int off, final int len) throws IOException
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            indent ();
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            super.write (s, off, len);
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        IndentingWriter (final Writer out, final int buffer, final int indent)
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            super (out, buffer);
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_indent = indent;
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void incIndent (final int delta)
293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (delta < 0) throw new IllegalArgumentException ("delta be non-negative: " + delta);
295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_indent += delta;
297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void incIndent ()
300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            incIndent (INDENT_INCREMENT);
302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void decIndent (final int delta)
305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (delta < 0) throw new IllegalArgumentException ("delta be non-negative: " + delta);
307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (delta > m_indent) throw new IllegalArgumentException ("delta = " + delta + ", current indent = " + m_indent);
308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_indent -= delta;
310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void decIndent ()
313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            decIndent (INDENT_INCREMENT);
315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String getIndent ()
318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (m_indent <= 0)
320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return "";
321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else
322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if ((m_sindent == null) || (m_sindent.length () < m_indent))
324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final char [] ca = new char [m_indent];
326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (int i = 0; i < m_indent; ++ i) ca [i] = ' ';
328f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_sindent = new String (ca);
329f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
330f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    return m_sindent;
331f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
332f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                else
333f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
334f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    return m_sindent.substring (0, m_indent);
335f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
336f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
337f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
338f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
339f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
340f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void indent ()
341f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throws IOException
342f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
343f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (m_state == 0)
344f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
345f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final String indent = getIndent ();
346f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                super.write (indent, 0, indent.length ());
347f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
348f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_state = 1;
349f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
350f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
351f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
352f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
353f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private int m_indent;
354f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private int m_state;
355f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private transient String m_sindent;
356f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
357f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private static final int INDENT_INCREMENT = 2;
358f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
359f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    } // end of nested class
360f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
361f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
362f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void emitStatsCount (final String name, final int value)
363f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
364f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
365f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        eol ();
366f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        openElementTag (name);
367f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.write (" value=\"" + value);
368f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.write ('"');
369f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        closeElementTag (true);
370f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
371f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
372f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void emitItem (final IItem item, final ItemComparator childrenOrder)
373f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
374f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
375f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final IItemMetadata metadata = item.getMetadata ();
376f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int [] columns = m_settings.getColumnOrder ();
377f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String tag = metadata.getTypeName ();
378f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
379f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        eol ();
380f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
381f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // emit opening tag with name attribute:
382f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
383f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            openElementTag (tag);
384f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
385f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.write (" name=\"");
386f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.write (Strings.HTMLEscape (item.getName ()));
387f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.write ('"');
388f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
389f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            closeElementTag (false);
390f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
391f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
392f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        eol ();
393f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
394f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.incIndent ();
395f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
396f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        emitItemCoverage (item, columns);
397f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
398f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final boolean deeper = (childrenOrder != null) && (m_settings.getDepth () > metadata.getTypeID ()) && (item.getChildCount () > 0);
399f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
400f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (deeper)
401f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
402f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (Iterator packages = item.getChildren (childrenOrder); packages.hasNext (); )
403f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
404f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                ((IItem) packages.next ()).accept (this, null);
405f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
406f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
407f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            eol ();
408f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
409f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
410f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.decIndent ();
411f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
412f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // emit closing tag:
413f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
414f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            endElement (tag);
415f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
416f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
417f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
418f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /*
419f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * No header row, just data rows.
420f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
421f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void emitItemCoverage (final IItem item, final int [] columns)
422f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
423f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
424f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer buf = new StringBuffer (64);
425f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
426f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int c = 0, cLimit = columns.length; c < cLimit; ++ c)
427f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
428f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int attrID = columns [c];
429f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
430f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (attrID != IItemAttribute.ATTRIBUTE_NAME_ID)
431f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
432f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final IItemAttribute attr = item.getAttribute (attrID, m_settings.getUnitsType ());
433f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
434f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (attr != null)
435f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
436f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    openElementTag ("coverage");
437f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
438f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_out.write (" type=\"");
439f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_out.write (Strings.HTMLEscape (attr.getName ()));
440f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_out.write ("\" value=\"");
441f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    attr.format (item, buf);
442f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_out.write (Strings.HTMLEscape (buf.toString ()));
443f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    m_out.write ('"');
444f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    buf.setLength (0);
445f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
446f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    closeElementTag (true);
447f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
448f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    eol ();
449f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
450f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
451f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
452f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
453f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
454f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
455f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void openElementTag (final String tag)
456f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
457f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
458f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.write ('<');
459f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.write (tag);
460f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
461f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
462f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void closeElementTag (final boolean simple)
463f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
464f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
465f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (simple)
466f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.write ("/>");
467f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
468f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out.write ('>');
469f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
470f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
471f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void endElement (final String tag)
472f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
473f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
474f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.write ("</");
475f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.write (tag);
476f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.write ('>');
477f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
478f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
479f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void eol ()
480f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
481f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
482f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_out.newLine ();
483f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
484f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
485f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void close ()
486f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
487f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (m_out != null)
488f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
489f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            try
490f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
491f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_out.flush ();
492f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_out.close ();
493f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
494f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            catch (IOException ioe)
495f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
496f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new EMMARuntimeException (IAppErrorCodes.REPORT_IO_FAILURE, ioe);
497f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
498f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            finally
499f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
500f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_out = null;
501f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
502f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
503f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
504f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
505f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void openOutFile (final File file, final String encoding, final boolean mkdirs)
506f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
507f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
508f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
509f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (mkdirs)
510f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
511f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final File parent = file.getParentFile ();
512f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (parent != null) parent.mkdirs ();
513f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
514f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
515f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_out = new IndentingWriter (new OutputStreamWriter (new FileOutputStream (file), encoding), IO_BUF_SIZE, 0);
516f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
517f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (UnsupportedEncodingException uee)
518f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
519f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: error code
520f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new EMMARuntimeException (uee);
521f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
522f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // note: in J2SDK 1.3 FileOutputStream constructor's throws clause
523f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // was narrowed to FileNotFoundException:
524f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (IOException fnfe) // FileNotFoundException
525f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
526f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: error code
527f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new EMMARuntimeException (fnfe);
528f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
529f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
530f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
531f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
532f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private IndentingWriter m_out;
533f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
534f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final String TYPE = "xml";
535f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final int IO_BUF_SIZE = 64 * 1024;
536f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
537f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
538f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------