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// ----------------------------------------------------------------------------