1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*******************************************************************************
2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Copyright (c) 2000, 2006 IBM Corporation and others.
3402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * All rights reserved. This program and the accompanying materials
4402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * are made available under the terms of the Eclipse Public License v1.0
5402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * which accompanies this distribution, and is available at
6402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * http://www.eclipse.org/legal/epl-v10.html
7402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
8402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Contributors:
9402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *     IBM Corporation - initial API and implementation
10402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *******************************************************************************/
11402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpackage org.eclipse.releng.generators;
12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.BufferedReader;
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.File;
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileInputStream;
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileNotFoundException;
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileOutputStream;
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileReader;
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.IOException;
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.InputStream;
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Arrays;
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.StringTokenizer;
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Vector;
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Enumeration;
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.Task;
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.DocumentBuilderFactory;
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.DocumentBuilder;
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.ParserConfigurationException;
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Document;
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Element;
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.NamedNodeMap;
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.Node;
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.w3c.dom.NodeList;
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.InputSource;
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.SAXException;
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/**
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @version 	1.0
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @author Dean Roberts
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class TestResultsGenerator extends Task {
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private static final String WARNING_SEVERITY = "WARNING";
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private static final String ERROR_SEVERITY = "ERROR";
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private static final String ForbiddenReferenceID = "ForbiddenReference";
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private static final String DiscouragedReferenceID = "DiscouragedReference";
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private static final int DEFAULT_READING_SIZE = 8192;
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	static final String elementName = "testsuite";
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	static final String testResultsToken = "%testresults%";
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	static final String compileLogsToken = "%compilelogs%";
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	static final String accessesLogsToken = "%accesseslogs%";
56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public Vector dropTokens;
57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public Vector platformSpecs;
58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public Vector differentPlatforms;
59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String testResultsWithProblems = "\n";
60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String testResultsXmlUrls = "\n";
61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private DocumentBuilder parser =null;
63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public ErrorTracker anErrorTracker;
64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String testResultsTemplateString = "";
65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String dropTemplateString = "";
66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public Vector platformDescription;
68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public Vector platformTemplateString;
69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public Vector platformDropFileName;
70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//Status of tests results (pending, successful, failed), used to specify the color
72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//of the test Results link on the build pages (standard, green, red), once failures
73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//are encountered, this is set to failed
74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected String testResultsStatus = "successful";
75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//assume tests ran.  If no html files are found, this is set to false
76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private boolean testsRan = true;
77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Parameters
79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// build runs JUnit automated tests
80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private boolean isBuildTested;
81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// buildType, I, N
83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String buildType;
84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Comma separated list of drop tokens
86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String dropTokenList;
87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Token in platform.php.template to be replaced by the desired platform ID
89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String platformIdentifierToken;
90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Location of the xml files
92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String xmlDirectoryName;
93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Location of the html files
95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String htmlDirectoryName;
96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Location of the resulting index.php file.
98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String dropDirectoryName;
99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Location and name of the template index.php file.
101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String testResultsTemplateFileName;
102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Platform specific template and output list (colon separated) in the following format:
104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// <descriptor, ie. OS name>,path to template file, path to output file
105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String platformSpecificTemplateList="";
106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Location and name of the template drop index.php file.
108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String dropTemplateFileName;
109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Name of the generated index php file.
111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String testResultsHtmlFileName;
112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Name of the generated drop index php file;
114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String dropHtmlFileName;
115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Arbitrary path used in the index.php page to href the
117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// generated .html files.
118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String hrefTestResultsTargetPath;
119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Aritrary path used in the index.php page to reference the compileLogs
121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String hrefCompileLogsTargetPath;
122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Location of compile logs base directory
124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String compileLogsDirectoryName;
125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// Location and name of test manifest file
127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String testManifestFileName;
128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//Initialize the prefix to a default string
130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String prefix = "default";
131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String testShortName = "";
132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int counter = 0;
133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//The four configurations, add new configurations to test results here + update
134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//testResults.php.template for changes
135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String[] testsConfig = {"linux.gtk.x86.xml",
136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"linux.gtk.x86_6.0.xml",
137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"macosx.cocoa.x86_5.0.xml",
138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"win32.win32.x86.xml",
139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"win32.win32.x86_6.0.xml"};
140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public static void main(String[] args) {
143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		TestResultsGenerator test = new TestResultsGenerator();
144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setDropTokenList(
145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"%sdk%,%tests%,%example%,%rcpruntime%,%rcpsdk%,%deltapack%,%icubase%,%runtime%,%platformsdk%,%jdt%,%jdtsdk%,%pde%,%pdesdk%,%cvs%,%cvssdk%,%teamextras%,%swt%,%relengtools%");
146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setPlatformIdentifierToken("%platform%");
147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.getDropTokensFromList(test.dropTokenList);
148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setIsBuildTested(true);
149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setXmlDirectoryName("C:\\junk\\testresults\\xml");
150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setHtmlDirectoryName("C:\\junk\\testresults");
151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setDropDirectoryName("C:\\junk");
152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setTestResultsTemplateFileName(
153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"C:\\junk\\templateFiles\\testResults.php.template");
154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setPlatformSpecificTemplateList(
155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"Windows,C:\\junk\\templateFiles\\platform.php.template,winPlatform.php;Linux,C:\\junk\\templateFiles\\platform.php.template,linPlatform.php;Solaris,C:\\junk\\templateFiles\\platform.php.template,solPlatform.php;AIX,C:\\junk\\templateFiles\\platform.php.template,aixPlatform.php;Macintosh,C:\\junk\\templateFiles\\platform.php.template,macPlatform.php;Source Build,C:\\junk\\templateFiles\\sourceBuilds.php.template,sourceBuilds.php");
156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setDropTemplateFileName(
157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"C:\\junk\\templateFiles\\index.php.template");
158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setTestResultsHtmlFileName("testResults.php");
159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//test.setDropHtmlFileName("index.php");
160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setDropHtmlFileName("index.html");
161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setHrefTestResultsTargetPath("testresults");
163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setCompileLogsDirectoryName(
164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"C:\\junk\\compilelogs\\plugins");
165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setHrefCompileLogsTargetPath("compilelogs");
166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.setTestManifestFileName("C:\\junk\\testManifest.xml");
167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		test.execute();
168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void execute() {
171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		anErrorTracker = new ErrorTracker();
173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		platformDescription = new Vector();
174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		platformTemplateString = new Vector();
175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		platformDropFileName = new Vector();
176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		anErrorTracker.loadFile(testManifestFileName);
177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		getDropTokensFromList(dropTokenList);
178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		testResultsTemplateString = readFile(testResultsTemplateFileName);
179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		dropTemplateString = readFile(dropTemplateFileName);
180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//Specific to the platform build-page
182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if(platformSpecificTemplateList!="") {
183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String description, platformTemplateFile, platformDropFile;
184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//Retrieve the different platforms and their info
185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			getDifferentPlatformsFromList(platformSpecificTemplateList);
186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//Parses the platform info and retrieves the platform name,
187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//template file, and drop file
188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			for(int i=0; i<differentPlatforms.size(); i++) {
189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				getPlatformSpecsFromList(differentPlatforms.get(i).toString());
190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				description = platformSpecs.get(0).toString();
191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				platformTemplateFile = platformSpecs.get(1).toString();
192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				platformDropFile = platformSpecs.get(2).toString();
193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				platformDescription.add(description);
194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				platformTemplateString.add(readFile(platformTemplateFile));
195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				platformDropFileName.add(platformDropFile);
196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("Begin: Generating test results index page");
202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("Parsing XML files");
203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		parseXml();
204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("Parsing compile logs");
205402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		parseCompileLogs();
206402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("End: Generating test results index page");
207402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		writeTestResultsFile();
208402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//For the platform build-page, write platform files, in addition to the index file
209402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if(platformSpecificTemplateList!="") {
210402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			writeDropFiles();
211402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
212402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		else {
213402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			writeDropIndexFile();
214402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
215402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
216402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
217402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void parseCompileLogs() {
218402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
219402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringBuffer compilerString = new StringBuffer();
220402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringBuffer accessesString = new StringBuffer();
221402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		processCompileLogsDirectory(
222402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			compileLogsDirectoryName,
223402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			compilerString,
224402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			accessesString);
225402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (compilerString.length() == 0) {
226402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			compilerString.append("None");
227402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
228402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (accessesString.length() == 0) {
229402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			accessesString.append("None");
230402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
231402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		testResultsTemplateString =
232402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			replace(testResultsTemplateString, compileLogsToken, String.valueOf(compilerString));
233402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
234402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		testResultsTemplateString =
235402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			replace(testResultsTemplateString, accessesLogsToken, String.valueOf(accessesString));
236402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
237402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
238402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void processCompileLogsDirectory(String directoryName, StringBuffer compilerLog, StringBuffer accessesLog) {
239402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		File sourceDirectory = new File(directoryName);
240402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (sourceDirectory.isFile()) {
241402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (sourceDirectory.getName().endsWith(".log"))
242402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				readCompileLog(sourceDirectory.getAbsolutePath(), compilerLog, accessesLog);
243402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (sourceDirectory.getName().endsWith(".xml"))
244402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				parseCompileLog(sourceDirectory.getAbsolutePath(), compilerLog, accessesLog);
245402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
246402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (sourceDirectory.isDirectory()) {
247402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File[] logFiles = sourceDirectory.listFiles();
248402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Arrays.sort(logFiles);
249402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			for (int j = 0; j < logFiles.length; j++) {
250402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				processCompileLogsDirectory(logFiles[j].getAbsolutePath(), compilerLog, accessesLog);
251402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
252402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
253402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
254402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
255402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void readCompileLog(String log, StringBuffer compilerLog, StringBuffer accessesLog) {
256402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String fileContents = readFile(log);
257402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
258402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int errorCount = countCompileErrors(fileContents);
259402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int warningCount = countCompileWarnings(fileContents);
260402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int forbiddenWarningCount = countForbiddenWarnings(fileContents);
261402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int discouragedWarningCount = countDiscouragedWarnings(fileContents);
262402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (errorCount != 0) {
263402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//use wildcard in place of version number on directory names
264402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String logName =
265402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				log.substring(getCompileLogsDirectoryName().length() + 1);
266402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			StringBuffer stringBuffer = new StringBuffer(logName);
267402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			stringBuffer.replace(
268402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				logName.indexOf("_") + 1,
269402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				logName.indexOf(File.separator, logName.indexOf("_") + 1),
270402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"*");
271402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			logName = new String(stringBuffer);
272402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
273402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			anErrorTracker.registerError(logName);
274402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
275402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		formatCompileErrorRow(log, errorCount, warningCount, compilerLog);
276402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		formatAccessesErrorRow(log, forbiddenWarningCount, discouragedWarningCount, accessesLog);
277402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
278402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
279402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void parseCompileLog(String log, StringBuffer compilerLog, StringBuffer accessesLog) {
280402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int errorCount = 0;
281402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int warningCount = 0;
282402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int forbiddenWarningCount = 0;
283402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int discouragedWarningCount = 0;
284402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
285402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		File file=new File(log);
286402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Document aDocument=null;
287402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		BufferedReader reader = null;
288402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
289402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			reader = new BufferedReader(new FileReader(file));
290402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			InputSource inputSource = new InputSource(reader);
291402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
292402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			DocumentBuilder builder = factory.newDocumentBuilder();
293402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			aDocument = builder.parse(inputSource);
294402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (SAXException e) {
295402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
296402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e) {
297402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
298402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (ParserConfigurationException e) {
299402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
300402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} finally {
301402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (reader != null) {
302402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				try {
303402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					reader.close();
304402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} catch(IOException e) {
305402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// ignore
306402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
307402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
308402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
309402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
310402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (aDocument == null) return;
311402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// Get summary of problems
312402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		NodeList nodeList = aDocument.getElementsByTagName("problem");
313402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (nodeList == null ||nodeList.getLength()==0)
314402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return;
315402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
316402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int length = nodeList.getLength();
317402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for (int i = 0; i < length; i++) {
318402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Node problemNode = nodeList.item(i);
319402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			NamedNodeMap aNamedNodeMap = problemNode.getAttributes();
320402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Node severityNode = aNamedNodeMap.getNamedItem("severity");
321402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Node idNode = aNamedNodeMap.getNamedItem("id");
322402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (severityNode != null) {
323402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				String severityNodeValue = severityNode.getNodeValue();
324402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (WARNING_SEVERITY.equals(severityNodeValue)) {
325402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// this is a warning
326402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// need to check the id
327402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					String nodeValue = idNode.getNodeValue();
328402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if (ForbiddenReferenceID.equals(nodeValue)) {
329402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						forbiddenWarningCount++;
330402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					} else if (DiscouragedReferenceID.equals(nodeValue)) {
331402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						discouragedWarningCount++;
332402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					} else {
333402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						warningCount++;
334402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
335402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} else if (ERROR_SEVERITY.equals(severityNodeValue)) {
336402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// this is an error
337402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					errorCount++;
338402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
339402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
340402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
341402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (errorCount != 0) {
342402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//use wildcard in place of version number on directory names
343402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//System.out.println(log + "/n");
344402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String logName =
345402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				log.substring(getCompileLogsDirectoryName().length() + 1);
346402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			StringBuffer buffer = new StringBuffer(logName);
347402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			buffer.replace(
348402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				logName.indexOf("_") + 1,
349402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				logName.indexOf(File.separator, logName.indexOf("_") + 1),
350402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"*");
351402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			logName = new String(buffer);
352402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
353402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			anErrorTracker.registerError(logName);
354402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
355402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String logName = log.replaceAll(".xml", ".html");
356402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		formatCompileErrorRow(
357402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				logName,
358402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				errorCount,
359402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				warningCount,
360402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				compilerLog);
361402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		formatAccessesErrorRow(
362402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				logName,
363402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				forbiddenWarningCount,
364402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				discouragedWarningCount,
365402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				accessesLog);
366402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
367402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
368402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public static byte[] getFileByteContent(String fileName) throws IOException {
369402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		InputStream stream = null;
370402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
371402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File file = new File(fileName);
372402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			stream = new FileInputStream(file);
373402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return getInputStreamAsByteArray(stream, (int) file.length());
374402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} finally {
375402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (stream != null) {
376402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				try {
377402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					stream.close();
378402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} catch (IOException e) {
379402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// ignore
380402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
381402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
382402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
383402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
384402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
385402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
386402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Returns the given input stream's contents as a byte array.
387402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * If a length is specified (ie. if length != -1), only length bytes
388402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * are returned. Otherwise all bytes in the stream are returned.
389402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Note this doesn't close the stream.
390402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @throws IOException if a problem occured reading the stream.
391402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
392402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public static byte[] getInputStreamAsByteArray(InputStream stream, int length)
393402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		throws IOException {
394402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		byte[] contents;
395402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (length == -1) {
396402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			contents = new byte[0];
397402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int contentsLength = 0;
398402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int amountRead = -1;
399402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			do {
400402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				int amountRequested = Math.max(stream.available(), DEFAULT_READING_SIZE);  // read at least 8K
401402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
402402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// resize contents if needed
403402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (contentsLength + amountRequested > contents.length) {
404402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					System.arraycopy(
405402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						contents,
406402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						0,
407402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						contents = new byte[contentsLength + amountRequested],
408402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						0,
409402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						contentsLength);
410402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
411402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
412402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// read as many bytes as possible
413402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				amountRead = stream.read(contents, contentsLength, amountRequested);
414402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
415402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (amountRead > 0) {
416402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// remember length of contents
417402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					contentsLength += amountRead;
418402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
419402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} while (amountRead != -1);
420402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
421402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// resize contents if necessary
422402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (contentsLength < contents.length) {
423402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				System.arraycopy(
424402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					contents,
425402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					0,
426402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					contents = new byte[contentsLength],
427402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					0,
428402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					contentsLength);
429402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
430402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else {
431402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			contents = new byte[length];
432402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int len = 0;
433402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int readSize = 0;
434402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			while ((readSize != -1) && (len != length)) {
435402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// See PR 1FMS89U
436402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// We record first the read size. In this case len is the actual read size.
437402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				len += readSize;
438402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				readSize = stream.read(contents, len, length - len);
439402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
440402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
441402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
442402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return contents;
443402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
444402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
445402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String readFile(String fileName) {
446402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		byte[] aByteArray = null;
447402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
448402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			aByteArray = getFileByteContent(fileName);
449402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e) {
450402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
451402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
452402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (aByteArray == null) {
453402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return "";
454402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
455402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return new String(aByteArray);
456402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
457402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
458402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int countCompileErrors(String aString) {
459402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return extractNumber(aString, "error");
460402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
461402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
462402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int countCompileWarnings(String aString) {
463402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return extractNumber(aString, "warning");
464402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
465402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
466402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int countForbiddenWarnings(String aString) {
467402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return extractNumber(aString, "Access restriction:");
468402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
469402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
470402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int countDiscouragedWarnings(String aString) {
471402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return extractNumber(aString, "Discouraged access:");
472402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
473402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
474402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int extractNumber(String aString, String endToken) {
475402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int endIndex = aString.lastIndexOf(endToken);
476402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (endIndex == -1) {
477402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return 0;
478402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
479402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
480402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int startIndex = endIndex;
481402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (startIndex >= 0
482402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			&& aString.charAt(startIndex) != '('
483402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			&& aString.charAt(startIndex) != ',') {
484402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			startIndex--;
485402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
486402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
487402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String count = aString.substring(startIndex + 1, endIndex).trim();
488402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
489402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return Integer.parseInt(count);
490402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (NumberFormatException e) {
491402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return 0;
492402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
493402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
494402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
495402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
496402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int missingCount = 0;
497402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String verifyAllTestsRan(String directory) {
498402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Enumeration enumeration = (anErrorTracker.getTestLogs()).elements();
499402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
500402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String replaceString="";
501402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (enumeration.hasMoreElements()) {
502402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String testLogName = enumeration.nextElement().toString();
503402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
504402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (new File(directory + File.separator + testLogName)
505402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				.exists())
506402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				continue;
507402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
508402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			anErrorTracker.registerError(testLogName);
509402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String tmp=((platformSpecificTemplateList.equals(""))?formatRow(testLogName, -1, false):formatRowReleng(testLogName, -1, false));
510402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if(missingCount==0) {
511402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				replaceString=replaceString+"</table></br>"+"\n"+
512402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"<table width=\"65%\" border=\"1\" bgcolor=\"#EEEEEE\" rules=\"groups\" align=\"center\">"+
513402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"<tr bgcolor=\"#9999CC\"> <th width=\"80%\" align=\"center\"> Missing Files </th><th  align=\"center\"> Status </th></tr>";
514402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
515402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			replaceString=replaceString+tmp;
516402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			testResultsWithProblems=testResultsWithProblems.concat("\n" + testLogName.substring(0,testLogName.length()-4) +" (file missing)");
517402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			missingCount++;
518402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
519402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return replaceString;
520402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
521402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
522402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void parseXml() {
523402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
524402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		File sourceDirectory = new File(xmlDirectoryName);
525402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
526402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (sourceDirectory.exists()) {
527402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
528402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String replaceString = "";
529402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
530402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File[] xmlFileNames = sourceDirectory.listFiles();
531402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Arrays.sort(xmlFileNames)	;
532402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
533402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File sourceDirectoryParent = sourceDirectory.getParentFile();
534402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (sourceDirectoryParent != null) {
535402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				sourceDirectoryParent = sourceDirectoryParent.getParentFile();
536402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
537402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String sourceDirectoryCanonicalPath = null;
538402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			try {
539402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				sourceDirectoryCanonicalPath = sourceDirectoryParent.getCanonicalPath();
540402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} catch (IOException e) {
541402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// ignore
542402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
543402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			for (int i = 0; i < xmlFileNames.length; i++) {
544402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (xmlFileNames[i].getPath().endsWith(".xml")) {
545402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					String fullName = xmlFileNames[i].getPath();
546402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					int errorCount = countErrors(fullName);
547402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if (errorCount != 0) {
548402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						String testName =
549402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							xmlFileNames[i].getName().substring(
550402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll								0,
551402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll								xmlFileNames[i].getName().length() - 4);
552402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						testResultsWithProblems =
553402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							testResultsWithProblems.concat("\n" + testName);
554402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						testResultsXmlUrls =
555402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							testResultsXmlUrls.concat("\n" + extractXmlRelativeFileName(sourceDirectoryCanonicalPath, xmlFileNames[i]));
556402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						anErrorTracker.registerError(
557402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							fullName.substring(
558402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll								getXmlDirectoryName().length() + 1));
559402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
560402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
561402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
562402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					String tmp=((platformSpecificTemplateList.equals(""))?formatRow(xmlFileNames[i].getPath(), errorCount,true):formatRowReleng(xmlFileNames[i].getPath(), errorCount,true));
563402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					replaceString=replaceString+tmp;
564402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
565402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
566402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
567402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
568402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//check for missing test logs
569402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			replaceString=replaceString+verifyAllTestsRan(xmlDirectoryName);
570402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
571402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			testResultsTemplateString =
572402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				replace(
573402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					testResultsTemplateString,
574402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					testResultsToken,
575402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					replaceString);
576402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			testsRan = true;
577402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
578402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else {
579402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			testsRan = false;
580402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println(
581402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"Test results not found in "
582402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ sourceDirectory.getAbsolutePath());
583402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
584402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
585402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
586402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private static String extractXmlRelativeFileName(String rootCanonicalPath, File xmlFile) {
587402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (rootCanonicalPath != null) {
588402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String xmlFileCanonicalPath = null;
589402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			try {
590402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				xmlFileCanonicalPath = xmlFile.getCanonicalPath();
591402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} catch (IOException e) {
592402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// ignore
593402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
594402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (xmlFileCanonicalPath != null) {
595402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// + 1 to remove the '\'
596402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				return xmlFileCanonicalPath.substring(rootCanonicalPath.length() + 1).replace('\\', '/');
597402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
598402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
599402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return "";
600402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
601402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String replace(
602402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String source,
603402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String original,
604402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String replacement) {
605402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
606402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int replaceIndex = source.indexOf(original);
607402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (replaceIndex > -1) {
608402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String resultString = source.substring(0, replaceIndex);
609402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			resultString = resultString + replacement;
610402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			resultString =
611402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				resultString
612402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ source.substring(replaceIndex + original.length());
613402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return resultString;
614402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else {
615402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println("Could not find token: " + original);
616402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return source;
617402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
618402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
619402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
620402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
621402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected void writeDropFiles() {
622402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		writeDropIndexFile();
623402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//Write all the platform files
624402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for(int i=0; i<platformDescription.size(); i++) {
625402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			writePlatformFile(platformDescription.get(i).toString(), platformTemplateString.get(i).toString(), platformDropFileName.get(i).toString());
626402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
627402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
628402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
629402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected void writeDropIndexFile() {
630402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
631402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String[] types = anErrorTracker.getTypes();
632402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for (int i = 0; i < types.length; i++) {
633402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			PlatformStatus[] platforms = anErrorTracker.getPlatforms(types[i]);
634402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String replaceString = processDropRows(platforms);
635402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			dropTemplateString =
636402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				replace(
637402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dropTemplateString,
638402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dropTokens.get(i).toString(),
639402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					replaceString);
640402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
641402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//Replace the token %testsStatus% with the status of the test results
642402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		dropTemplateString = replace(dropTemplateString,"%testsStatus%",testResultsStatus);
643402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String outputFileName =
644402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			dropDirectoryName + File.separator + dropHtmlFileName;
645402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		writeFile(outputFileName, dropTemplateString);
646402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
647402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
648402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//Writes the platform file (dropFileName) specific to "desiredPlatform"
649402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected void writePlatformFile(String desiredPlatform, String templateString, String dropFileName) {
650402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
651402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String[] types = anErrorTracker.getTypes();
652402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for (int i = 0; i < types.length; i++) {
653402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			PlatformStatus[] platforms = anErrorTracker.getPlatforms(types[i]);
654402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//Call processPlatformDropRows passing the platform's name
655402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String replaceString = processPlatformDropRows(platforms, desiredPlatform);
656402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			templateString =
657402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				replace(
658402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					templateString,
659402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					dropTokens.get(i).toString(),
660402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					replaceString);
661402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
662402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//Replace the platformIdentifierToken with the platform's name and the testsStatus
663402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//token with the status of the test results
664402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		templateString = replace(templateString, platformIdentifierToken, desiredPlatform);
665402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		templateString = replace(templateString,"%testsStatus%",testResultsStatus);
666402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String outputFileName =
667402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			dropDirectoryName + File.separator + dropFileName;
668402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		writeFile(outputFileName, templateString);
669402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
670402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
671402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//Process drop rows specific to each of the platforms
672402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected String processPlatformDropRows(PlatformStatus[] platforms, String name) {
673402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
674402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String result = "";
675402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		boolean found = false;
676402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for (int i = 0; i < platforms.length; i++) {
677402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//If the platform description indicates the platform's name, or "All",
678402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//call processDropRow
679402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if(platforms[i].getName().startsWith(name.substring(0, 3)) || platforms[i].getName().equals("All")) {
680402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				result = result + processDropRow(platforms[i]);
681402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				found = true;
682402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
683402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//If the platform description indicates "All Other Platforms", process
684402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//the row locally
685402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else if(platforms[i].getName().equals("All Other Platforms") && !found)
686402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			{
687402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				String imageName = "";
688402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
689402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (platforms[i].hasErrors()) {
690402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					imageName =
691402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						"<a href=\"" + getTestResultsHtmlFileName() + "\"><img src = \"FAIL.gif\" width=19 height=23></a>";
692402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} else {
693402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if (testsRan) {
694402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						imageName = "<img src = \"OK.gif\" width=19 height=23>";
695402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					} else {
696402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						if (isBuildTested) {
697402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							imageName =
698402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll								"<font size=\"-1\" color=\"#FF0000\">pending</font>";
699402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						} else {
700402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							imageName = "<img src = \"OK.gif\" width=19 height=23>";
701402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						}
702402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
703402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
704402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
705402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				result = result + "<tr>";
706402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				result = result + "<td><div align=left>" + imageName + "</div></td>\n";
707402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				result = result + "<td>All " + name + "</td>";
708402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				//generate http, md5 and sha1 links by calling php functions in the template
709402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				result = result + "<td><?php genLinks($_SERVER[\"SERVER_NAME\"],\"@buildlabel@\",\"" + platforms[i].getFileName() +"\"); ?></td>\n";
710402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				result = result + "</tr>\n";
711402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
712402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
713402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
714402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return result;
715402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
716402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
717402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected String processDropRows(PlatformStatus[] platforms) {
718402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
719402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String result = "";
720402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for (int i = 0; i < platforms.length; i++) {
721402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			result = result + processDropRow(platforms[i]);
722402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
723402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
724402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return result;
725402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
726402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
727402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected String processDropRow(PlatformStatus aPlatform) {
728402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
729402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String imageName = "";
730402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
731402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (aPlatform.hasErrors()) {
732402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			imageName =
733402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"<a href=\"" + getTestResultsHtmlFileName()+ "\"><img src = \"FAIL.gif\" width=19 height=23></a>";
734402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//Failure in tests
735402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			testResultsStatus = "failed";
736402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else {
737402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (testsRan) {
738402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				imageName = "<img src = \"OK.gif\" width=19 height=23>";
739402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} else {
740402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (isBuildTested) {
741402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					imageName =
742402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						"<font size=\"-1\" color=\"#FF0000\">pending</font>";
743402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Tests are pending
744402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					testResultsStatus = "pending";
745402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} else {
746402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					imageName = "<img src = \"OK.gif\" width=19 height=23>";
747402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
748402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
749402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
750402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
751402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String result = "<tr>";
752402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
753402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		result = result + "<td><div align=left>" + imageName + "</div></td>\n";
754402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		result = result + "<td>" + aPlatform.getName() + "</td>";
755402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		result = result + "<td>" + aPlatform.getFileName() + "</td>\n";
756402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		result = result + "</tr>\n";
757402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
758402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return result;
759402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
760402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
761402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void writeTestResultsFile() {
762402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
763402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String outputFileName =
764402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			dropDirectoryName + File.separator + testResultsHtmlFileName;
765402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		writeFile(outputFileName, testResultsTemplateString);
766402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
767402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
768402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void writeFile(String outputFileName, String contents) {
769402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		FileOutputStream outputStream = null;
770402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
771402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			outputStream = new FileOutputStream(outputFileName);
772402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			outputStream.write(contents.getBytes());
773402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (FileNotFoundException e) {
774402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println(
775402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"File not found exception writing: " + outputFileName);
776402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e) {
777402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println("IOException writing: " + outputFileName);
778402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} finally {
779402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (outputStream != null) {
780402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				try {
781402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					outputStream.close();
782402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} catch(IOException e) {
783402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// ignore
784402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
785402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
786402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
787402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
788402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
789402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setTestResultsHtmlFileName(String aString) {
790402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		testResultsHtmlFileName = aString;
791402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
792402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
793402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getTestResultsHtmlFileName() {
794402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return testResultsHtmlFileName;
795402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
796402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
797402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setTestResultsTemplateFileName(String aString) {
798402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		testResultsTemplateFileName = aString;
799402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
800402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
801402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getTestResultsTemplateFileName() {
802402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return testResultsTemplateFileName;
803402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
804402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
805402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setXmlDirectoryName(String aString) {
806402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		xmlDirectoryName = aString;
807402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
808402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
809402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getXmlDirectoryName() {
810402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return xmlDirectoryName;
811402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
812402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
813402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setHtmlDirectoryName(String aString) {
814402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		htmlDirectoryName = aString;
815402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
816402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
817402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getHtmlDirectoryName() {
818402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return htmlDirectoryName;
819402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
820402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
821402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setDropDirectoryName(String aString) {
822402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		dropDirectoryName = aString;
823402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
824402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
825402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getDropDirectoryName() {
826402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return dropDirectoryName;
827402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
828402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
829402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void formatCompileErrorRow(
830402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String fileName,
831402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int errorCount,
832402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int warningCount,
833402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringBuffer buffer) {
834402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
835402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (errorCount == 0 && warningCount == 0) {
836402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return;
837402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
838402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
839402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String hrefCompileLogsTargetPath2 = getHrefCompileLogsTargetPath();
840402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int i = fileName.indexOf(hrefCompileLogsTargetPath2);
841402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
842402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String shortName =
843402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			fileName.substring(i + hrefCompileLogsTargetPath2.length());
844402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
845402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		buffer
846402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<tr>\n<td>\n")
847402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<a href=")
848402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\"")
849402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(hrefCompileLogsTargetPath2)
850402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
851402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\">")
852402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
853402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</a>")
854402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</td>\n")
855402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<td align=\"center\">")
856402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<a href=")
857402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\"")
858402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(hrefCompileLogsTargetPath2)
859402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
860402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("#ERRORS")
861402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\">")
862402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(errorCount)
863402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</a>")
864402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</td>\n")
865402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<td align=\"center\">")
866402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<a href=")
867402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\"")
868402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(hrefCompileLogsTargetPath2)
869402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
870402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("#OTHER_WARNINGS")
871402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\">")
872402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(warningCount)
873402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</a>")
874402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</td>\n")
875402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</tr>\n");
876402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
877402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
878402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void formatAccessesErrorRow(
879402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String fileName,
880402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int forbiddenAccessesWarningsCount,
881402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int discouragedAccessesWarningsCount,
882402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			StringBuffer buffer) {
883402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
884402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (forbiddenAccessesWarningsCount == 0 && discouragedAccessesWarningsCount == 0) {
885402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return;
886402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
887402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
888402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String hrefCompileLogsTargetPath2 = getHrefCompileLogsTargetPath();
889402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int i = fileName.indexOf(hrefCompileLogsTargetPath2);
890402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
891402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String shortName =
892402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			fileName.substring(i + hrefCompileLogsTargetPath2.length());
893402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
894402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		buffer
895402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<tr>\n<td>\n")
896402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<a href=")
897402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\"")
898402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(hrefCompileLogsTargetPath2)
899402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
900402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\">")
901402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
902402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</a>")
903402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</td>\n")
904402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<td align=\"center\">")
905402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<a href=")
906402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\"")
907402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(hrefCompileLogsTargetPath2)
908402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
909402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("#FORBIDDEN_WARNINGS")
910402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\">")
911402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(forbiddenAccessesWarningsCount)
912402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</a>")
913402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</td>\n")
914402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<td align=\"center\">")
915402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("<a href=")
916402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\"")
917402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(hrefCompileLogsTargetPath2)
918402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(shortName)
919402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("#DISCOURAGED_WARNINGS")
920402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("\">")
921402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append(discouragedAccessesWarningsCount)
922402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</a>")
923402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</td>\n")
924402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			.append("</tr>\n");
925402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
926402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
927402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String formatRow(String fileName, int errorCount, boolean link) {
928402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
929402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// replace .xml with .html
930402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
931402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String aString = "";
932402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (!link) {
933402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return "<tr><td>" + fileName + " (missing)" + "</td><td>" + "DNF";
934402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
935402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
936402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (fileName.endsWith(".xml")) {
937402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
938402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int begin = fileName.lastIndexOf(File.separatorChar);
939402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int end = fileName.lastIndexOf(".xml");
940402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
941402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String shortName = fileName.substring(begin + 1, end);
942402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String displayName = shortName;
943402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (errorCount != 0)
944402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			   aString = aString + "<tr><td><b>";
945402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else
946402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString = aString + "<tr><td>";
947402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
948402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
949402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (errorCount!=0){
950402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				displayName="<font color=\"#ff0000\">"+displayName+"</font>";
951402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
952402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (errorCount==-1){
953402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString=aString.concat(displayName);
954402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}else {
955402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString=aString
956402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ "<a href="
957402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ "\""
958402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ hrefTestResultsTargetPath
959402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ "/"
960402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ shortName
961402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ ".html"
962402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ "\">"
963402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ displayName
964402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					+ "</a>";
965402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
966402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (errorCount > 0)
967402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				   aString = aString + "</td><td><b>";
968402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else
969402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString = aString + "</td><td>";
970402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
971402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (errorCount == -1)
972402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString = aString + "<font color=\"#ff0000\">DNF";
973402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
974402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else if (errorCount >0)
975402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString = aString + "<font color=\"#ff0000\">"+String.valueOf(errorCount);
976402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else
977402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString = aString +String.valueOf(errorCount);
978402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
979402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (errorCount != 0)
980402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString = aString + "</font></b></td></tr>";
981402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else
982402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aString = aString + "</td></tr>";
983402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
984402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
985402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return aString;
986402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
987402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
988402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
989402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//Specific to the RelEng test results page
990402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String formatRowReleng(String fileName, int errorCount, boolean link) {
991402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
992402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//If the file name doesn't end with any of the set test configurations, do nothing
993402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		boolean endsWithConfig = false;
994402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int card = testsConfig.length;
995402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		for(int i=0; i<card; i++) {
996402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if(fileName.endsWith(testsConfig[i]))
997402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				endsWithConfig = true;
998402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
999402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if(!endsWithConfig)
1000402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return "";
1001402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1002402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String aString = "";
1003402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (!link) {
1004402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return "<tr><td>" + fileName + "</td><td align=\"center\">" + "DNF </tr>";
1005402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
1006402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1007402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (fileName.endsWith(".xml")) {
1008402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1009402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int begin = fileName.lastIndexOf(File.separatorChar);
1010402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1011402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//Get org.eclipse. out of the component name
1012402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String shortName = fileName.substring(begin + 13, fileName.indexOf('_'));
1013402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String displayName = shortName;
1014402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1015402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//If the short name does not start with this prefix
1016402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if(!shortName.startsWith(prefix)) {
1017402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				//If the prefix is not yet set
1018402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if(prefix=="default"){
1019402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Set the testShortName variable to the current short name
1020402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					testShortName = shortName;
1021402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					counter=0;
1022402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Set new prefix
1023402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					prefix = shortName.substring(0, shortName.indexOf(".tests") + 6);
1024402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "<tbody><tr><td><b>" + prefix + ".*" + "</b><td><td><td><td>";
1025402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "<tr><td><P>" + shortName;
1026402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1027402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Loop until the matching string postfix(test config.) is found
1028402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					while(counter<card && !fileName.endsWith(testsConfig[counter])) {
1029402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<td align=\"center\">-</td>";
1030402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						counter++;
1031402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
1032402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
1033402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				else {
1034402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Set new prefix
1035402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					prefix = shortName.substring(0, shortName.indexOf(".tests") + 6);
1036402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1037402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Loop until the matching string postfix(test config.) is found
1038402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					while(counter<card && !fileName.endsWith(testsConfig[counter])) {
1039402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<td align=\"center\">-</td>";
1040402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						counter++;
1041402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
1042402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1043402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//In this case, the new prefix should be set with the short name under it,
1044402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//since this would mean that the team has more than one component test
1045402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if(!shortName.endsWith("tests")) {
1046402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<tbody><tr><td><b>" + prefix + ".*" + "</b><td><td><td><td>";
1047402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<tr><td><P>" + shortName;
1048402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
1049402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//The team has only one component test
1050402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					else
1051402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<tbody><tr><td><b>" + shortName;
1052402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					testShortName = shortName;
1053402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1054402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					counter = 0;
1055402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
1056402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
1057402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//If the file's short name starts with the current prefix
1058402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if(shortName.startsWith(prefix)) {
1059402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				//If the new file has a different short name than the current one
1060402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if(!shortName.equals(testShortName)){
1061402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Fill the remaining cells with '-'. These files will later be listed as
1062402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//missing
1063402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					while(counter<card) {
1064402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<td align=\"center\">-</td>";
1065402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						counter++;
1066402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
1067402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					counter = 0;
1068402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Print the component name
1069402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "<tr><td><P>" + shortName;
1070402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Loop until the matching string postfix(test config.) is found
1071402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					while(counter<card && !fileName.endsWith(testsConfig[counter])) {
1072402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<td align=\"center\">-</td>";
1073402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						counter++;
1074402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
1075402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
1076402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				else {
1077402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//Loop until the matching string postfix(test config.) is found
1078402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					while(counter<card && !fileName.endsWith(testsConfig[counter])) {
1079402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<td align=\"center\">-</td>";
1080402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						counter++;
1081402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
1082402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					//If the previous component has no more test files left
1083402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					if(counter==card) {
1084402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						counter = 0;
1085402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						//Print the new component name
1086402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						aString = aString + "<tr><td><P>" + shortName;
1087402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						//Loop until the matching string postfix(test config.) is found
1088402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						while(counter<card && !fileName.endsWith(testsConfig[counter])) {
1089402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							aString = aString + "<td align=\"center\">-</td>";
1090402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll							counter++;
1091402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						}
1092402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					}
1093402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
1094402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1095402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				testShortName = shortName;
1096402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1097402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (errorCount != 0)
1098402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "<td align=\"center\"><b>";
1099402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				else
1100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "<td align=\"center\">";
1101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				//Print number of errors
1103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (errorCount!=0){
1104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					displayName="<font color=\"#ff0000\">"+ "(" + String.valueOf(errorCount) + ")" +"</font>";
1105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
1106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				else {
1107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					displayName="(0)";
1108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
1109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				//Reference
1111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (errorCount==-1){
1112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString=aString.concat(displayName);
1113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}else {
1114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString=aString
1115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ "<a href="
1116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ "\""
1117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ hrefTestResultsTargetPath
1118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ "/"
1119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ fileName.substring(begin+1, fileName.length()-4)
1120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ ".html"
1121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ "\">"
1122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ displayName
1123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll						+ "</a>";
1124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
1125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (errorCount == -1)
1127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "<font color=\"#ff0000\">DNF";
1128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (errorCount != 0)
1130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "</font></b></td>";
1131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				else
1132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					aString = aString + "</td>";
1133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				counter++;
1134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
1135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
1136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return aString;
1138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private int countErrors(String fileName) {
1141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		int errorCount = 0;
1142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (new File(fileName).length()==0)
1144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return -1;
1145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
1147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
1148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			parser=docBuilderFactory.newDocumentBuilder();
1149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			Document document = parser.parse(fileName);
1151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			NodeList elements = document.getElementsByTagName(elementName);
1152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			int elementCount = elements.getLength();
1154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (elementCount == 0)
1155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				return -1;
1156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			for (int i = 0; i < elementCount; i++) {
1157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				Element element = (Element) elements.item(i);
1158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				NamedNodeMap attributes = element.getAttributes();
1159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				Node aNode = attributes.getNamedItem("errors");
1160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				errorCount =
1161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					errorCount + Integer.parseInt(aNode.getNodeValue());
1162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				aNode = attributes.getNamedItem("failures");
1163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				errorCount =
1164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					errorCount + Integer.parseInt(aNode.getNodeValue());
1165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
1167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e) {
1169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println("IOException: " + fileName);
1170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// e.printStackTrace();
1171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return 0;
1172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (SAXException e) {
1173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println("SAXException: " + fileName);
1174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// e.printStackTrace();
1175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return 0;
1176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (ParserConfigurationException e) {
1177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
1178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
1179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return errorCount;
1180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the hrefTestResultsTargetPath.
1186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
1187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getHrefTestResultsTargetPath() {
1189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return hrefTestResultsTargetPath;
1190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the hrefTestResultsTargetPath.
1194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param hrefTestResultsTargetPath The hrefTestResultsTargetPath to set
1195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setHrefTestResultsTargetPath(String htmlTargetPath) {
1197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.hrefTestResultsTargetPath = htmlTargetPath;
1198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the compileLogsDirectoryName.
1202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
1203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getCompileLogsDirectoryName() {
1205402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return compileLogsDirectoryName;
1206402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1207402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1208402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1209402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the compileLogsDirectoryName.
1210402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param compileLogsDirectoryName The compileLogsDirectoryName to set
1211402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1212402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setCompileLogsDirectoryName(String compileLogsDirectoryName) {
1213402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.compileLogsDirectoryName = compileLogsDirectoryName;
1214402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1215402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1216402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1217402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the hrefCompileLogsTargetPath.
1218402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
1219402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1220402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getHrefCompileLogsTargetPath() {
1221402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return hrefCompileLogsTargetPath;
1222402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1223402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1224402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1225402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the hrefCompileLogsTargetPath.
1226402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param hrefCompileLogsTargetPath The hrefCompileLogsTargetPath to set
1227402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1228402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setHrefCompileLogsTargetPath(String hrefCompileLogsTargetPath) {
1229402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.hrefCompileLogsTargetPath = hrefCompileLogsTargetPath;
1230402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1231402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1232402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1233402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the testManifestFileName.
1234402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
1235402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1236402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getTestManifestFileName() {
1237402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return testManifestFileName;
1238402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1239402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1240402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1241402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the testManifestFileName.
1242402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param testManifestFileName The testManifestFileName to set
1243402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1244402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setTestManifestFileName(String testManifestFileName) {
1245402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.testManifestFileName = testManifestFileName;
1246402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1247402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1248402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1249402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the dropHtmlFileName.
1250402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
1251402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1252402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getDropHtmlFileName() {
1253402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return dropHtmlFileName;
1254402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1255402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1256402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1257402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the dropHtmlFileName.
1258402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param dropHtmlFileName The dropHtmlFileName to set
1259402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1260402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setDropHtmlFileName(String dropHtmlFileName) {
1261402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.dropHtmlFileName = dropHtmlFileName;
1262402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1263402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1264402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1265402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the dropTemplateFileName.
1266402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
1267402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1268402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getDropTemplateFileName() {
1269402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return dropTemplateFileName;
1270402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1271402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1272402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1273402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the dropTemplateFileName.
1274402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param dropTemplateFileName The dropTemplateFileName to set
1275402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1276402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setDropTemplateFileName(String dropTemplateFileName) {
1277402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.dropTemplateFileName = dropTemplateFileName;
1278402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1279402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1280402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected void getDropTokensFromList(String list) {
1281402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringTokenizer tokenizer = new StringTokenizer(list, ",");
1282402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		dropTokens = new Vector();
1283402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1284402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (tokenizer.hasMoreTokens()) {
1285402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			dropTokens.add(tokenizer.nextToken());
1286402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
1287402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1288402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1289402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected void getDifferentPlatformsFromList(String list) {
1290402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringTokenizer tokenizer = new StringTokenizer(list, ";");
1291402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		differentPlatforms = new Vector();
1292402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1293402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (tokenizer.hasMoreTokens()) {
1294402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			differentPlatforms.add(tokenizer.nextToken());
1295402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
1296402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1297402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1298402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	protected void getPlatformSpecsFromList(String list) {
1299402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringTokenizer tokenizer = new StringTokenizer(list, ",");
1300402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		platformSpecs = new Vector();
1301402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1302402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (tokenizer.hasMoreTokens()) {
1303402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			platformSpecs.add(tokenizer.nextToken());
1304402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
1305402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1306402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1307402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getDropTokenList() {
1308402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return dropTokenList;
1309402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1310402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1311402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setDropTokenList(String dropTokenList) {
1312402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.dropTokenList = dropTokenList;
1313402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1314402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1315402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public boolean isBuildTested() {
1316402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return isBuildTested;
1317402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1318402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1319402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setIsBuildTested(boolean isBuildTested) {
1320402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.isBuildTested = isBuildTested;
1321402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1322402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1323402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1324402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1325402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return
1326402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1327402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public boolean testsRan() {
1328402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return testsRan;
1329402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1330402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1331402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1332402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param b
1333402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1334402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setTestsRan(boolean b) {
1335402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		testsRan = b;
1336402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1337402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1338402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1339402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return
1340402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1341402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public Vector getDropTokens() {
1342402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return dropTokens;
1343402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1344402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1345402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1346402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param vector
1347402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1348402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setDropTokens(Vector vector) {
1349402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		dropTokens = vector;
1350402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1351402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1352402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1353402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return
1354402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1355402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getTestResultsWithProblems() {
1356402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return testResultsWithProblems;
1357402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1358402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1359402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1360402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return
1361402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1362402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getTestResultsXmlUrls() {
1363402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return testResultsXmlUrls;
1364402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1365402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1366402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
1367402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param string
1368402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
1369402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setTestResultsWithProblems(String string) {
1370402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		testResultsWithProblems = string;
1371402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1372402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1373402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getBuildType() {
1374402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return buildType;
1375402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1376402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1377402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setBuildType(String buildType) {
1378402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.buildType = buildType;
1379402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1380402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1381402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getPlatformSpecificTemplateList() {
1382402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return platformSpecificTemplateList;
1383402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1384402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1385402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setPlatformSpecificTemplateList(String platformSpecificTemplateList) {
1386402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.platformSpecificTemplateList = platformSpecificTemplateList;
1387402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1388402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1389402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setPlatformIdentifierToken(String platformIdentifierToken) {
1390402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.platformIdentifierToken = platformIdentifierToken;
1391402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1392402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1393402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getPlatformIdentifierToken() {
1394402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return platformIdentifierToken;
1395402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
1396402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
1397402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
1398