aboutsummaryrefslogtreecommitdiff
path: root/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestResultsGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestResultsGenerator.java')
-rw-r--r--basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestResultsGenerator.java1397
1 files changed, 1397 insertions, 0 deletions
diff --git a/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestResultsGenerator.java b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestResultsGenerator.java
new file mode 100644
index 0000000..a0b261d
--- /dev/null
+++ b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestResultsGenerator.java
@@ -0,0 +1,1397 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.releng.generators;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import java.util.Enumeration;
+
+import org.apache.tools.ant.Task;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+
+/**
+ * @version 1.0
+ * @author Dean Roberts
+ */
+public class TestResultsGenerator extends Task {
+ private static final String WARNING_SEVERITY = "WARNING";
+ private static final String ERROR_SEVERITY = "ERROR";
+ private static final String ForbiddenReferenceID = "ForbiddenReference";
+ private static final String DiscouragedReferenceID = "DiscouragedReference";
+
+ private static final int DEFAULT_READING_SIZE = 8192;
+
+ static final String elementName = "testsuite";
+ static final String testResultsToken = "%testresults%";
+ static final String compileLogsToken = "%compilelogs%";
+ static final String accessesLogsToken = "%accesseslogs%";
+ public Vector dropTokens;
+ public Vector platformSpecs;
+ public Vector differentPlatforms;
+ public String testResultsWithProblems = "\n";
+ public String testResultsXmlUrls = "\n";
+
+ private DocumentBuilder parser =null;
+ public ErrorTracker anErrorTracker;
+ public String testResultsTemplateString = "";
+ public String dropTemplateString = "";
+
+ public Vector platformDescription;
+ public Vector platformTemplateString;
+ public Vector platformDropFileName;
+
+ //Status of tests results (pending, successful, failed), used to specify the color
+ //of the test Results link on the build pages (standard, green, red), once failures
+ //are encountered, this is set to failed
+ protected String testResultsStatus = "successful";
+ //assume tests ran. If no html files are found, this is set to false
+ private boolean testsRan = true;
+
+ // Parameters
+ // build runs JUnit automated tests
+ private boolean isBuildTested;
+
+ // buildType, I, N
+ public String buildType;
+
+ // Comma separated list of drop tokens
+ public String dropTokenList;
+
+ // Token in platform.php.template to be replaced by the desired platform ID
+ public String platformIdentifierToken;
+
+ // Location of the xml files
+ public String xmlDirectoryName;
+
+ // Location of the html files
+ public String htmlDirectoryName;
+
+ // Location of the resulting index.php file.
+ public String dropDirectoryName;
+
+ // Location and name of the template index.php file.
+ public String testResultsTemplateFileName;
+
+ // Platform specific template and output list (colon separated) in the following format:
+ // <descriptor, ie. OS name>,path to template file, path to output file
+ public String platformSpecificTemplateList="";
+
+ // Location and name of the template drop index.php file.
+ public String dropTemplateFileName;
+
+ // Name of the generated index php file.
+ public String testResultsHtmlFileName;
+
+ // Name of the generated drop index php file;
+ public String dropHtmlFileName;
+
+ // Arbitrary path used in the index.php page to href the
+ // generated .html files.
+ public String hrefTestResultsTargetPath;
+
+ // Aritrary path used in the index.php page to reference the compileLogs
+ public String hrefCompileLogsTargetPath;
+
+ // Location of compile logs base directory
+ public String compileLogsDirectoryName;
+
+ // Location and name of test manifest file
+ public String testManifestFileName;
+
+ //Initialize the prefix to a default string
+ private String prefix = "default";
+ private String testShortName = "";
+ private int counter = 0;
+ //The four configurations, add new configurations to test results here + update
+ //testResults.php.template for changes
+ private String[] testsConfig = {"linux.gtk.x86.xml",
+ "linux.gtk.x86_6.0.xml",
+ "macosx.cocoa.x86_5.0.xml",
+ "win32.win32.x86.xml",
+ "win32.win32.x86_6.0.xml"};
+
+
+ public static void main(String[] args) {
+ TestResultsGenerator test = new TestResultsGenerator();
+ test.setDropTokenList(
+ "%sdk%,%tests%,%example%,%rcpruntime%,%rcpsdk%,%deltapack%,%icubase%,%runtime%,%platformsdk%,%jdt%,%jdtsdk%,%pde%,%pdesdk%,%cvs%,%cvssdk%,%teamextras%,%swt%,%relengtools%");
+ test.setPlatformIdentifierToken("%platform%");
+ test.getDropTokensFromList(test.dropTokenList);
+ test.setIsBuildTested(true);
+ test.setXmlDirectoryName("C:\\junk\\testresults\\xml");
+ test.setHtmlDirectoryName("C:\\junk\\testresults");
+ test.setDropDirectoryName("C:\\junk");
+ test.setTestResultsTemplateFileName(
+ "C:\\junk\\templateFiles\\testResults.php.template");
+ test.setPlatformSpecificTemplateList(
+ "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");
+ test.setDropTemplateFileName(
+ "C:\\junk\\templateFiles\\index.php.template");
+ test.setTestResultsHtmlFileName("testResults.php");
+ //test.setDropHtmlFileName("index.php");
+ test.setDropHtmlFileName("index.html");
+
+ test.setHrefTestResultsTargetPath("testresults");
+ test.setCompileLogsDirectoryName(
+ "C:\\junk\\compilelogs\\plugins");
+ test.setHrefCompileLogsTargetPath("compilelogs");
+ test.setTestManifestFileName("C:\\junk\\testManifest.xml");
+ test.execute();
+ }
+
+ public void execute() {
+
+ anErrorTracker = new ErrorTracker();
+ platformDescription = new Vector();
+ platformTemplateString = new Vector();
+ platformDropFileName = new Vector();
+ anErrorTracker.loadFile(testManifestFileName);
+ getDropTokensFromList(dropTokenList);
+ testResultsTemplateString = readFile(testResultsTemplateFileName);
+ dropTemplateString = readFile(dropTemplateFileName);
+
+ //Specific to the platform build-page
+ if(platformSpecificTemplateList!="") {
+ String description, platformTemplateFile, platformDropFile;
+ //Retrieve the different platforms and their info
+ getDifferentPlatformsFromList(platformSpecificTemplateList);
+ //Parses the platform info and retrieves the platform name,
+ //template file, and drop file
+ for(int i=0; i<differentPlatforms.size(); i++) {
+ getPlatformSpecsFromList(differentPlatforms.get(i).toString());
+ description = platformSpecs.get(0).toString();
+ platformTemplateFile = platformSpecs.get(1).toString();
+ platformDropFile = platformSpecs.get(2).toString();
+ platformDescription.add(description);
+ platformTemplateString.add(readFile(platformTemplateFile));
+ platformDropFileName.add(platformDropFile);
+
+ }
+
+ }
+
+ System.out.println("Begin: Generating test results index page");
+ System.out.println("Parsing XML files");
+ parseXml();
+ System.out.println("Parsing compile logs");
+ parseCompileLogs();
+ System.out.println("End: Generating test results index page");
+ writeTestResultsFile();
+ //For the platform build-page, write platform files, in addition to the index file
+ if(platformSpecificTemplateList!="") {
+ writeDropFiles();
+ }
+ else {
+ writeDropIndexFile();
+ }
+ }
+
+ public void parseCompileLogs() {
+
+ StringBuffer compilerString = new StringBuffer();
+ StringBuffer accessesString = new StringBuffer();
+ processCompileLogsDirectory(
+ compileLogsDirectoryName,
+ compilerString,
+ accessesString);
+ if (compilerString.length() == 0) {
+ compilerString.append("None");
+ }
+ if (accessesString.length() == 0) {
+ accessesString.append("None");
+ }
+ testResultsTemplateString =
+ replace(testResultsTemplateString, compileLogsToken, String.valueOf(compilerString));
+
+ testResultsTemplateString =
+ replace(testResultsTemplateString, accessesLogsToken, String.valueOf(accessesString));
+ }
+
+ private void processCompileLogsDirectory(String directoryName, StringBuffer compilerLog, StringBuffer accessesLog) {
+ File sourceDirectory = new File(directoryName);
+ if (sourceDirectory.isFile()) {
+ if (sourceDirectory.getName().endsWith(".log"))
+ readCompileLog(sourceDirectory.getAbsolutePath(), compilerLog, accessesLog);
+ if (sourceDirectory.getName().endsWith(".xml"))
+ parseCompileLog(sourceDirectory.getAbsolutePath(), compilerLog, accessesLog);
+ }
+ if (sourceDirectory.isDirectory()) {
+ File[] logFiles = sourceDirectory.listFiles();
+ Arrays.sort(logFiles);
+ for (int j = 0; j < logFiles.length; j++) {
+ processCompileLogsDirectory(logFiles[j].getAbsolutePath(), compilerLog, accessesLog);
+ }
+ }
+ }
+
+ private void readCompileLog(String log, StringBuffer compilerLog, StringBuffer accessesLog) {
+ String fileContents = readFile(log);
+
+ int errorCount = countCompileErrors(fileContents);
+ int warningCount = countCompileWarnings(fileContents);
+ int forbiddenWarningCount = countForbiddenWarnings(fileContents);
+ int discouragedWarningCount = countDiscouragedWarnings(fileContents);
+ if (errorCount != 0) {
+ //use wildcard in place of version number on directory names
+ String logName =
+ log.substring(getCompileLogsDirectoryName().length() + 1);
+ StringBuffer stringBuffer = new StringBuffer(logName);
+ stringBuffer.replace(
+ logName.indexOf("_") + 1,
+ logName.indexOf(File.separator, logName.indexOf("_") + 1),
+ "*");
+ logName = new String(stringBuffer);
+
+ anErrorTracker.registerError(logName);
+ }
+ formatCompileErrorRow(log, errorCount, warningCount, compilerLog);
+ formatAccessesErrorRow(log, forbiddenWarningCount, discouragedWarningCount, accessesLog);
+ }
+
+ private void parseCompileLog(String log, StringBuffer compilerLog, StringBuffer accessesLog) {
+ int errorCount = 0;
+ int warningCount = 0;
+ int forbiddenWarningCount = 0;
+ int discouragedWarningCount = 0;
+
+ File file=new File(log);
+ Document aDocument=null;
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new FileReader(file));
+ InputSource inputSource = new InputSource(reader);
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ aDocument = builder.parse(inputSource);
+ } catch (SAXException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch(IOException e) {
+ // ignore
+ }
+ }
+ }
+
+ if (aDocument == null) return;
+ // Get summary of problems
+ NodeList nodeList = aDocument.getElementsByTagName("problem");
+ if (nodeList == null ||nodeList.getLength()==0)
+ return;
+
+ int length = nodeList.getLength();
+ for (int i = 0; i < length; i++) {
+ Node problemNode = nodeList.item(i);
+ NamedNodeMap aNamedNodeMap = problemNode.getAttributes();
+ Node severityNode = aNamedNodeMap.getNamedItem("severity");
+ Node idNode = aNamedNodeMap.getNamedItem("id");
+ if (severityNode != null) {
+ String severityNodeValue = severityNode.getNodeValue();
+ if (WARNING_SEVERITY.equals(severityNodeValue)) {
+ // this is a warning
+ // need to check the id
+ String nodeValue = idNode.getNodeValue();
+ if (ForbiddenReferenceID.equals(nodeValue)) {
+ forbiddenWarningCount++;
+ } else if (DiscouragedReferenceID.equals(nodeValue)) {
+ discouragedWarningCount++;
+ } else {
+ warningCount++;
+ }
+ } else if (ERROR_SEVERITY.equals(severityNodeValue)) {
+ // this is an error
+ errorCount++;
+ }
+ }
+ }
+ if (errorCount != 0) {
+ //use wildcard in place of version number on directory names
+ //System.out.println(log + "/n");
+ String logName =
+ log.substring(getCompileLogsDirectoryName().length() + 1);
+ StringBuffer buffer = new StringBuffer(logName);
+ buffer.replace(
+ logName.indexOf("_") + 1,
+ logName.indexOf(File.separator, logName.indexOf("_") + 1),
+ "*");
+ logName = new String(buffer);
+
+ anErrorTracker.registerError(logName);
+ }
+ String logName = log.replaceAll(".xml", ".html");
+ formatCompileErrorRow(
+ logName,
+ errorCount,
+ warningCount,
+ compilerLog);
+ formatAccessesErrorRow(
+ logName,
+ forbiddenWarningCount,
+ discouragedWarningCount,
+ accessesLog);
+ }
+
+ public static byte[] getFileByteContent(String fileName) throws IOException {
+ InputStream stream = null;
+ try {
+ File file = new File(fileName);
+ stream = new FileInputStream(file);
+ return getInputStreamAsByteArray(stream, (int) file.length());
+ } finally {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the given input stream's contents as a byte array.
+ * If a length is specified (ie. if length != -1), only length bytes
+ * are returned. Otherwise all bytes in the stream are returned.
+ * Note this doesn't close the stream.
+ * @throws IOException if a problem occured reading the stream.
+ */
+ public static byte[] getInputStreamAsByteArray(InputStream stream, int length)
+ throws IOException {
+ byte[] contents;
+ if (length == -1) {
+ contents = new byte[0];
+ int contentsLength = 0;
+ int amountRead = -1;
+ do {
+ int amountRequested = Math.max(stream.available(), DEFAULT_READING_SIZE); // read at least 8K
+
+ // resize contents if needed
+ if (contentsLength + amountRequested > contents.length) {
+ System.arraycopy(
+ contents,
+ 0,
+ contents = new byte[contentsLength + amountRequested],
+ 0,
+ contentsLength);
+ }
+
+ // read as many bytes as possible
+ amountRead = stream.read(contents, contentsLength, amountRequested);
+
+ if (amountRead > 0) {
+ // remember length of contents
+ contentsLength += amountRead;
+ }
+ } while (amountRead != -1);
+
+ // resize contents if necessary
+ if (contentsLength < contents.length) {
+ System.arraycopy(
+ contents,
+ 0,
+ contents = new byte[contentsLength],
+ 0,
+ contentsLength);
+ }
+ } else {
+ contents = new byte[length];
+ int len = 0;
+ int readSize = 0;
+ while ((readSize != -1) && (len != length)) {
+ // See PR 1FMS89U
+ // We record first the read size. In this case len is the actual read size.
+ len += readSize;
+ readSize = stream.read(contents, len, length - len);
+ }
+ }
+
+ return contents;
+ }
+
+ public String readFile(String fileName) {
+ byte[] aByteArray = null;
+ try {
+ aByteArray = getFileByteContent(fileName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ if (aByteArray == null) {
+ return "";
+ }
+ return new String(aByteArray);
+ }
+
+ private int countCompileErrors(String aString) {
+ return extractNumber(aString, "error");
+ }
+
+ private int countCompileWarnings(String aString) {
+ return extractNumber(aString, "warning");
+ }
+
+ private int countForbiddenWarnings(String aString) {
+ return extractNumber(aString, "Access restriction:");
+ }
+
+ private int countDiscouragedWarnings(String aString) {
+ return extractNumber(aString, "Discouraged access:");
+ }
+
+ private int extractNumber(String aString, String endToken) {
+ int endIndex = aString.lastIndexOf(endToken);
+ if (endIndex == -1) {
+ return 0;
+ }
+
+ int startIndex = endIndex;
+ while (startIndex >= 0
+ && aString.charAt(startIndex) != '('
+ && aString.charAt(startIndex) != ',') {
+ startIndex--;
+ }
+
+ String count = aString.substring(startIndex + 1, endIndex).trim();
+ try {
+ return Integer.parseInt(count);
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+
+ }
+
+ private int missingCount = 0;
+ private String verifyAllTestsRan(String directory) {
+ Enumeration enumeration = (anErrorTracker.getTestLogs()).elements();
+
+ String replaceString="";
+ while (enumeration.hasMoreElements()) {
+ String testLogName = enumeration.nextElement().toString();
+
+ if (new File(directory + File.separator + testLogName)
+ .exists())
+ continue;
+
+ anErrorTracker.registerError(testLogName);
+ String tmp=((platformSpecificTemplateList.equals(""))?formatRow(testLogName, -1, false):formatRowReleng(testLogName, -1, false));
+ if(missingCount==0) {
+ replaceString=replaceString+"</table></br>"+"\n"+
+ "<table width=\"65%\" border=\"1\" bgcolor=\"#EEEEEE\" rules=\"groups\" align=\"center\">"+
+ "<tr bgcolor=\"#9999CC\"> <th width=\"80%\" align=\"center\"> Missing Files </th><th align=\"center\"> Status </th></tr>";
+ }
+ replaceString=replaceString+tmp;
+ testResultsWithProblems=testResultsWithProblems.concat("\n" + testLogName.substring(0,testLogName.length()-4) +" (file missing)");
+ missingCount++;
+ }
+ return replaceString;
+ }
+
+ public void parseXml() {
+
+ File sourceDirectory = new File(xmlDirectoryName);
+
+ if (sourceDirectory.exists()) {
+
+ String replaceString = "";
+
+ File[] xmlFileNames = sourceDirectory.listFiles();
+ Arrays.sort(xmlFileNames) ;
+
+ File sourceDirectoryParent = sourceDirectory.getParentFile();
+ if (sourceDirectoryParent != null) {
+ sourceDirectoryParent = sourceDirectoryParent.getParentFile();
+ }
+ String sourceDirectoryCanonicalPath = null;
+ try {
+ sourceDirectoryCanonicalPath = sourceDirectoryParent.getCanonicalPath();
+ } catch (IOException e) {
+ // ignore
+ }
+ for (int i = 0; i < xmlFileNames.length; i++) {
+ if (xmlFileNames[i].getPath().endsWith(".xml")) {
+ String fullName = xmlFileNames[i].getPath();
+ int errorCount = countErrors(fullName);
+ if (errorCount != 0) {
+ String testName =
+ xmlFileNames[i].getName().substring(
+ 0,
+ xmlFileNames[i].getName().length() - 4);
+ testResultsWithProblems =
+ testResultsWithProblems.concat("\n" + testName);
+ testResultsXmlUrls =
+ testResultsXmlUrls.concat("\n" + extractXmlRelativeFileName(sourceDirectoryCanonicalPath, xmlFileNames[i]));
+ anErrorTracker.registerError(
+ fullName.substring(
+ getXmlDirectoryName().length() + 1));
+ }
+
+
+ String tmp=((platformSpecificTemplateList.equals(""))?formatRow(xmlFileNames[i].getPath(), errorCount,true):formatRowReleng(xmlFileNames[i].getPath(), errorCount,true));
+ replaceString=replaceString+tmp;
+
+
+ }
+ }
+ //check for missing test logs
+ replaceString=replaceString+verifyAllTestsRan(xmlDirectoryName);
+
+ testResultsTemplateString =
+ replace(
+ testResultsTemplateString,
+ testResultsToken,
+ replaceString);
+ testsRan = true;
+
+ } else {
+ testsRan = false;
+ System.out.println(
+ "Test results not found in "
+ + sourceDirectory.getAbsolutePath());
+ }
+
+ }
+ private static String extractXmlRelativeFileName(String rootCanonicalPath, File xmlFile) {
+ if (rootCanonicalPath != null) {
+ String xmlFileCanonicalPath = null;
+ try {
+ xmlFileCanonicalPath = xmlFile.getCanonicalPath();
+ } catch (IOException e) {
+ // ignore
+ }
+ if (xmlFileCanonicalPath != null) {
+ // + 1 to remove the '\'
+ return xmlFileCanonicalPath.substring(rootCanonicalPath.length() + 1).replace('\\', '/');
+ }
+ }
+ return "";
+ }
+ private String replace(
+ String source,
+ String original,
+ String replacement) {
+
+ int replaceIndex = source.indexOf(original);
+ if (replaceIndex > -1) {
+ String resultString = source.substring(0, replaceIndex);
+ resultString = resultString + replacement;
+ resultString =
+ resultString
+ + source.substring(replaceIndex + original.length());
+ return resultString;
+ } else {
+ System.out.println("Could not find token: " + original);
+ return source;
+ }
+
+ }
+
+ protected void writeDropFiles() {
+ writeDropIndexFile();
+ //Write all the platform files
+ for(int i=0; i<platformDescription.size(); i++) {
+ writePlatformFile(platformDescription.get(i).toString(), platformTemplateString.get(i).toString(), platformDropFileName.get(i).toString());
+ }
+ }
+
+ protected void writeDropIndexFile() {
+
+ String[] types = anErrorTracker.getTypes();
+ for (int i = 0; i < types.length; i++) {
+ PlatformStatus[] platforms = anErrorTracker.getPlatforms(types[i]);
+ String replaceString = processDropRows(platforms);
+ dropTemplateString =
+ replace(
+ dropTemplateString,
+ dropTokens.get(i).toString(),
+ replaceString);
+ }
+ //Replace the token %testsStatus% with the status of the test results
+ dropTemplateString = replace(dropTemplateString,"%testsStatus%",testResultsStatus);
+ String outputFileName =
+ dropDirectoryName + File.separator + dropHtmlFileName;
+ writeFile(outputFileName, dropTemplateString);
+ }
+
+ //Writes the platform file (dropFileName) specific to "desiredPlatform"
+ protected void writePlatformFile(String desiredPlatform, String templateString, String dropFileName) {
+
+ String[] types = anErrorTracker.getTypes();
+ for (int i = 0; i < types.length; i++) {
+ PlatformStatus[] platforms = anErrorTracker.getPlatforms(types[i]);
+ //Call processPlatformDropRows passing the platform's name
+ String replaceString = processPlatformDropRows(platforms, desiredPlatform);
+ templateString =
+ replace(
+ templateString,
+ dropTokens.get(i).toString(),
+ replaceString);
+ }
+ //Replace the platformIdentifierToken with the platform's name and the testsStatus
+ //token with the status of the test results
+ templateString = replace(templateString, platformIdentifierToken, desiredPlatform);
+ templateString = replace(templateString,"%testsStatus%",testResultsStatus);
+ String outputFileName =
+ dropDirectoryName + File.separator + dropFileName;
+ writeFile(outputFileName, templateString);
+ }
+
+ //Process drop rows specific to each of the platforms
+ protected String processPlatformDropRows(PlatformStatus[] platforms, String name) {
+
+ String result = "";
+ boolean found = false;
+ for (int i = 0; i < platforms.length; i++) {
+ //If the platform description indicates the platform's name, or "All",
+ //call processDropRow
+ if(platforms[i].getName().startsWith(name.substring(0, 3)) || platforms[i].getName().equals("All")) {
+ result = result + processDropRow(platforms[i]);
+ found = true;
+ }
+ //If the platform description indicates "All Other Platforms", process
+ //the row locally
+ else if(platforms[i].getName().equals("All Other Platforms") && !found)
+ {
+ String imageName = "";
+
+ if (platforms[i].hasErrors()) {
+ imageName =
+ "<a href=\"" + getTestResultsHtmlFileName() + "\"><img src = \"FAIL.gif\" width=19 height=23></a>";
+ } else {
+ if (testsRan) {
+ imageName = "<img src = \"OK.gif\" width=19 height=23>";
+ } else {
+ if (isBuildTested) {
+ imageName =
+ "<font size=\"-1\" color=\"#FF0000\">pending</font>";
+ } else {
+ imageName = "<img src = \"OK.gif\" width=19 height=23>";
+ }
+ }
+ }
+
+ result = result + "<tr>";
+ result = result + "<td><div align=left>" + imageName + "</div></td>\n";
+ result = result + "<td>All " + name + "</td>";
+ //generate http, md5 and sha1 links by calling php functions in the template
+ result = result + "<td><?php genLinks($_SERVER[\"SERVER_NAME\"],\"@buildlabel@\",\"" + platforms[i].getFileName() +"\"); ?></td>\n";
+ result = result + "</tr>\n";
+ }
+ }
+
+ return result;
+ }
+
+ protected String processDropRows(PlatformStatus[] platforms) {
+
+ String result = "";
+ for (int i = 0; i < platforms.length; i++) {
+ result = result + processDropRow(platforms[i]);
+ }
+
+ return result;
+ }
+
+ protected String processDropRow(PlatformStatus aPlatform) {
+
+ String imageName = "";
+
+ if (aPlatform.hasErrors()) {
+ imageName =
+ "<a href=\"" + getTestResultsHtmlFileName()+ "\"><img src = \"FAIL.gif\" width=19 height=23></a>";
+ //Failure in tests
+ testResultsStatus = "failed";
+ } else {
+ if (testsRan) {
+ imageName = "<img src = \"OK.gif\" width=19 height=23>";
+ } else {
+ if (isBuildTested) {
+ imageName =
+ "<font size=\"-1\" color=\"#FF0000\">pending</font>";
+ //Tests are pending
+ testResultsStatus = "pending";
+ } else {
+ imageName = "<img src = \"OK.gif\" width=19 height=23>";
+ }
+ }
+ }
+
+ String result = "<tr>";
+
+ result = result + "<td><div align=left>" + imageName + "</div></td>\n";
+ result = result + "<td>" + aPlatform.getName() + "</td>";
+ result = result + "<td>" + aPlatform.getFileName() + "</td>\n";
+ result = result + "</tr>\n";
+
+ return result;
+ }
+
+ public void writeTestResultsFile() {
+
+ String outputFileName =
+ dropDirectoryName + File.separator + testResultsHtmlFileName;
+ writeFile(outputFileName, testResultsTemplateString);
+ }
+
+ private void writeFile(String outputFileName, String contents) {
+ FileOutputStream outputStream = null;
+ try {
+ outputStream = new FileOutputStream(outputFileName);
+ outputStream.write(contents.getBytes());
+ } catch (FileNotFoundException e) {
+ System.out.println(
+ "File not found exception writing: " + outputFileName);
+ } catch (IOException e) {
+ System.out.println("IOException writing: " + outputFileName);
+ } finally {
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch(IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ public void setTestResultsHtmlFileName(String aString) {
+ testResultsHtmlFileName = aString;
+ }
+
+ public String getTestResultsHtmlFileName() {
+ return testResultsHtmlFileName;
+ }
+
+ public void setTestResultsTemplateFileName(String aString) {
+ testResultsTemplateFileName = aString;
+ }
+
+ public String getTestResultsTemplateFileName() {
+ return testResultsTemplateFileName;
+ }
+
+ public void setXmlDirectoryName(String aString) {
+ xmlDirectoryName = aString;
+ }
+
+ public String getXmlDirectoryName() {
+ return xmlDirectoryName;
+ }
+
+ public void setHtmlDirectoryName(String aString) {
+ htmlDirectoryName = aString;
+ }
+
+ public String getHtmlDirectoryName() {
+ return htmlDirectoryName;
+ }
+
+ public void setDropDirectoryName(String aString) {
+ dropDirectoryName = aString;
+ }
+
+ public String getDropDirectoryName() {
+ return dropDirectoryName;
+ }
+
+ private void formatCompileErrorRow(
+ String fileName,
+ int errorCount,
+ int warningCount,
+ StringBuffer buffer) {
+
+ if (errorCount == 0 && warningCount == 0) {
+ return;
+ }
+
+ String hrefCompileLogsTargetPath2 = getHrefCompileLogsTargetPath();
+ int i = fileName.indexOf(hrefCompileLogsTargetPath2);
+
+ String shortName =
+ fileName.substring(i + hrefCompileLogsTargetPath2.length());
+
+ buffer
+ .append("<tr>\n<td>\n")
+ .append("<a href=")
+ .append("\"")
+ .append(hrefCompileLogsTargetPath2)
+ .append(shortName)
+ .append("\">")
+ .append(shortName)
+ .append("</a>")
+ .append("</td>\n")
+ .append("<td align=\"center\">")
+ .append("<a href=")
+ .append("\"")
+ .append(hrefCompileLogsTargetPath2)
+ .append(shortName)
+ .append("#ERRORS")
+ .append("\">")
+ .append(errorCount)
+ .append("</a>")
+ .append("</td>\n")
+ .append("<td align=\"center\">")
+ .append("<a href=")
+ .append("\"")
+ .append(hrefCompileLogsTargetPath2)
+ .append(shortName)
+ .append("#OTHER_WARNINGS")
+ .append("\">")
+ .append(warningCount)
+ .append("</a>")
+ .append("</td>\n")
+ .append("</tr>\n");
+ }
+
+ private void formatAccessesErrorRow(
+ String fileName,
+ int forbiddenAccessesWarningsCount,
+ int discouragedAccessesWarningsCount,
+ StringBuffer buffer) {
+
+ if (forbiddenAccessesWarningsCount == 0 && discouragedAccessesWarningsCount == 0) {
+ return;
+ }
+
+ String hrefCompileLogsTargetPath2 = getHrefCompileLogsTargetPath();
+ int i = fileName.indexOf(hrefCompileLogsTargetPath2);
+
+ String shortName =
+ fileName.substring(i + hrefCompileLogsTargetPath2.length());
+
+ buffer
+ .append("<tr>\n<td>\n")
+ .append("<a href=")
+ .append("\"")
+ .append(hrefCompileLogsTargetPath2)
+ .append(shortName)
+ .append("\">")
+ .append(shortName)
+ .append("</a>")
+ .append("</td>\n")
+ .append("<td align=\"center\">")
+ .append("<a href=")
+ .append("\"")
+ .append(hrefCompileLogsTargetPath2)
+ .append(shortName)
+ .append("#FORBIDDEN_WARNINGS")
+ .append("\">")
+ .append(forbiddenAccessesWarningsCount)
+ .append("</a>")
+ .append("</td>\n")
+ .append("<td align=\"center\">")
+ .append("<a href=")
+ .append("\"")
+ .append(hrefCompileLogsTargetPath2)
+ .append(shortName)
+ .append("#DISCOURAGED_WARNINGS")
+ .append("\">")
+ .append(discouragedAccessesWarningsCount)
+ .append("</a>")
+ .append("</td>\n")
+ .append("</tr>\n");
+ }
+
+ private String formatRow(String fileName, int errorCount, boolean link) {
+
+ // replace .xml with .html
+
+ String aString = "";
+ if (!link) {
+ return "<tr><td>" + fileName + " (missing)" + "</td><td>" + "DNF";
+ }
+
+ if (fileName.endsWith(".xml")) {
+
+ int begin = fileName.lastIndexOf(File.separatorChar);
+ int end = fileName.lastIndexOf(".xml");
+
+ String shortName = fileName.substring(begin + 1, end);
+ String displayName = shortName;
+ if (errorCount != 0)
+ aString = aString + "<tr><td><b>";
+ else
+ aString = aString + "<tr><td>";
+
+
+ if (errorCount!=0){
+ displayName="<font color=\"#ff0000\">"+displayName+"</font>";
+ }
+ if (errorCount==-1){
+ aString=aString.concat(displayName);
+ }else {
+ aString=aString
+ + "<a href="
+ + "\""
+ + hrefTestResultsTargetPath
+ + "/"
+ + shortName
+ + ".html"
+ + "\">"
+ + displayName
+ + "</a>";
+ }
+ if (errorCount > 0)
+ aString = aString + "</td><td><b>";
+ else
+ aString = aString + "</td><td>";
+
+ if (errorCount == -1)
+ aString = aString + "<font color=\"#ff0000\">DNF";
+
+ else if (errorCount >0)
+ aString = aString + "<font color=\"#ff0000\">"+String.valueOf(errorCount);
+ else
+ aString = aString +String.valueOf(errorCount);
+
+ if (errorCount != 0)
+ aString = aString + "</font></b></td></tr>";
+ else
+ aString = aString + "</td></tr>";
+ }
+
+ return aString;
+
+ }
+
+ //Specific to the RelEng test results page
+ private String formatRowReleng(String fileName, int errorCount, boolean link) {
+
+ //If the file name doesn't end with any of the set test configurations, do nothing
+ boolean endsWithConfig = false;
+ int card = testsConfig.length;
+ for(int i=0; i<card; i++) {
+ if(fileName.endsWith(testsConfig[i]))
+ endsWithConfig = true;
+ }
+ if(!endsWithConfig)
+ return "";
+
+ String aString = "";
+ if (!link) {
+ return "<tr><td>" + fileName + "</td><td align=\"center\">" + "DNF </tr>";
+ }
+
+ if (fileName.endsWith(".xml")) {
+
+ int begin = fileName.lastIndexOf(File.separatorChar);
+
+ //Get org.eclipse. out of the component name
+ String shortName = fileName.substring(begin + 13, fileName.indexOf('_'));
+ String displayName = shortName;
+
+ //If the short name does not start with this prefix
+ if(!shortName.startsWith(prefix)) {
+ //If the prefix is not yet set
+ if(prefix=="default"){
+ //Set the testShortName variable to the current short name
+ testShortName = shortName;
+ counter=0;
+ //Set new prefix
+ prefix = shortName.substring(0, shortName.indexOf(".tests") + 6);
+ aString = aString + "<tbody><tr><td><b>" + prefix + ".*" + "</b><td><td><td><td>";
+ aString = aString + "<tr><td><P>" + shortName;
+
+ //Loop until the matching string postfix(test config.) is found
+ while(counter<card && !fileName.endsWith(testsConfig[counter])) {
+ aString = aString + "<td align=\"center\">-</td>";
+ counter++;
+ }
+ }
+ else {
+ //Set new prefix
+ prefix = shortName.substring(0, shortName.indexOf(".tests") + 6);
+
+ //Loop until the matching string postfix(test config.) is found
+ while(counter<card && !fileName.endsWith(testsConfig[counter])) {
+ aString = aString + "<td align=\"center\">-</td>";
+ counter++;
+ }
+
+ //In this case, the new prefix should be set with the short name under it,
+ //since this would mean that the team has more than one component test
+ if(!shortName.endsWith("tests")) {
+ aString = aString + "<tbody><tr><td><b>" + prefix + ".*" + "</b><td><td><td><td>";
+ aString = aString + "<tr><td><P>" + shortName;
+ }
+ //The team has only one component test
+ else
+ aString = aString + "<tbody><tr><td><b>" + shortName;
+ testShortName = shortName;
+
+ counter = 0;
+ }
+ }
+ //If the file's short name starts with the current prefix
+ if(shortName.startsWith(prefix)) {
+ //If the new file has a different short name than the current one
+ if(!shortName.equals(testShortName)){
+ //Fill the remaining cells with '-'. These files will later be listed as
+ //missing
+ while(counter<card) {
+ aString = aString + "<td align=\"center\">-</td>";
+ counter++;
+ }
+ counter = 0;
+ //Print the component name
+ aString = aString + "<tr><td><P>" + shortName;
+ //Loop until the matching string postfix(test config.) is found
+ while(counter<card && !fileName.endsWith(testsConfig[counter])) {
+ aString = aString + "<td align=\"center\">-</td>";
+ counter++;
+ }
+ }
+ else {
+ //Loop until the matching string postfix(test config.) is found
+ while(counter<card && !fileName.endsWith(testsConfig[counter])) {
+ aString = aString + "<td align=\"center\">-</td>";
+ counter++;
+ }
+ //If the previous component has no more test files left
+ if(counter==card) {
+ counter = 0;
+ //Print the new component name
+ aString = aString + "<tr><td><P>" + shortName;
+ //Loop until the matching string postfix(test config.) is found
+ while(counter<card && !fileName.endsWith(testsConfig[counter])) {
+ aString = aString + "<td align=\"center\">-</td>";
+ counter++;
+ }
+ }
+ }
+
+ testShortName = shortName;
+
+ if (errorCount != 0)
+ aString = aString + "<td align=\"center\"><b>";
+ else
+ aString = aString + "<td align=\"center\">";
+
+ //Print number of errors
+ if (errorCount!=0){
+ displayName="<font color=\"#ff0000\">"+ "(" + String.valueOf(errorCount) + ")" +"</font>";
+ }
+ else {
+ displayName="(0)";
+ }
+
+ //Reference
+ if (errorCount==-1){
+ aString=aString.concat(displayName);
+ }else {
+ aString=aString
+ + "<a href="
+ + "\""
+ + hrefTestResultsTargetPath
+ + "/"
+ + fileName.substring(begin+1, fileName.length()-4)
+ + ".html"
+ + "\">"
+ + displayName
+ + "</a>";
+ }
+
+ if (errorCount == -1)
+ aString = aString + "<font color=\"#ff0000\">DNF";
+
+ if (errorCount != 0)
+ aString = aString + "</font></b></td>";
+ else
+ aString = aString + "</td>";
+ counter++;
+ }
+ }
+
+ return aString;
+ }
+
+ private int countErrors(String fileName) {
+ int errorCount = 0;
+
+ if (new File(fileName).length()==0)
+ return -1;
+
+ try {
+ DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
+ parser=docBuilderFactory.newDocumentBuilder();
+
+ Document document = parser.parse(fileName);
+ NodeList elements = document.getElementsByTagName(elementName);
+
+ int elementCount = elements.getLength();
+ if (elementCount == 0)
+ return -1;
+ for (int i = 0; i < elementCount; i++) {
+ Element element = (Element) elements.item(i);
+ NamedNodeMap attributes = element.getAttributes();
+ Node aNode = attributes.getNamedItem("errors");
+ errorCount =
+ errorCount + Integer.parseInt(aNode.getNodeValue());
+ aNode = attributes.getNamedItem("failures");
+ errorCount =
+ errorCount + Integer.parseInt(aNode.getNodeValue());
+
+ }
+
+ } catch (IOException e) {
+ System.out.println("IOException: " + fileName);
+ // e.printStackTrace();
+ return 0;
+ } catch (SAXException e) {
+ System.out.println("SAXException: " + fileName);
+ // e.printStackTrace();
+ return 0;
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ }
+ return errorCount;
+ }
+
+
+
+ /**
+ * Gets the hrefTestResultsTargetPath.
+ * @return Returns a String
+ */
+ public String getHrefTestResultsTargetPath() {
+ return hrefTestResultsTargetPath;
+ }
+
+ /**
+ * Sets the hrefTestResultsTargetPath.
+ * @param hrefTestResultsTargetPath The hrefTestResultsTargetPath to set
+ */
+ public void setHrefTestResultsTargetPath(String htmlTargetPath) {
+ this.hrefTestResultsTargetPath = htmlTargetPath;
+ }
+
+ /**
+ * Gets the compileLogsDirectoryName.
+ * @return Returns a String
+ */
+ public String getCompileLogsDirectoryName() {
+ return compileLogsDirectoryName;
+ }
+
+ /**
+ * Sets the compileLogsDirectoryName.
+ * @param compileLogsDirectoryName The compileLogsDirectoryName to set
+ */
+ public void setCompileLogsDirectoryName(String compileLogsDirectoryName) {
+ this.compileLogsDirectoryName = compileLogsDirectoryName;
+ }
+
+ /**
+ * Gets the hrefCompileLogsTargetPath.
+ * @return Returns a String
+ */
+ public String getHrefCompileLogsTargetPath() {
+ return hrefCompileLogsTargetPath;
+ }
+
+ /**
+ * Sets the hrefCompileLogsTargetPath.
+ * @param hrefCompileLogsTargetPath The hrefCompileLogsTargetPath to set
+ */
+ public void setHrefCompileLogsTargetPath(String hrefCompileLogsTargetPath) {
+ this.hrefCompileLogsTargetPath = hrefCompileLogsTargetPath;
+ }
+
+ /**
+ * Gets the testManifestFileName.
+ * @return Returns a String
+ */
+ public String getTestManifestFileName() {
+ return testManifestFileName;
+ }
+
+ /**
+ * Sets the testManifestFileName.
+ * @param testManifestFileName The testManifestFileName to set
+ */
+ public void setTestManifestFileName(String testManifestFileName) {
+ this.testManifestFileName = testManifestFileName;
+ }
+
+ /**
+ * Gets the dropHtmlFileName.
+ * @return Returns a String
+ */
+ public String getDropHtmlFileName() {
+ return dropHtmlFileName;
+ }
+
+ /**
+ * Sets the dropHtmlFileName.
+ * @param dropHtmlFileName The dropHtmlFileName to set
+ */
+ public void setDropHtmlFileName(String dropHtmlFileName) {
+ this.dropHtmlFileName = dropHtmlFileName;
+ }
+
+ /**
+ * Gets the dropTemplateFileName.
+ * @return Returns a String
+ */
+ public String getDropTemplateFileName() {
+ return dropTemplateFileName;
+ }
+
+ /**
+ * Sets the dropTemplateFileName.
+ * @param dropTemplateFileName The dropTemplateFileName to set
+ */
+ public void setDropTemplateFileName(String dropTemplateFileName) {
+ this.dropTemplateFileName = dropTemplateFileName;
+ }
+
+ protected void getDropTokensFromList(String list) {
+ StringTokenizer tokenizer = new StringTokenizer(list, ",");
+ dropTokens = new Vector();
+
+ while (tokenizer.hasMoreTokens()) {
+ dropTokens.add(tokenizer.nextToken());
+ }
+ }
+
+ protected void getDifferentPlatformsFromList(String list) {
+ StringTokenizer tokenizer = new StringTokenizer(list, ";");
+ differentPlatforms = new Vector();
+
+ while (tokenizer.hasMoreTokens()) {
+ differentPlatforms.add(tokenizer.nextToken());
+ }
+ }
+
+ protected void getPlatformSpecsFromList(String list) {
+ StringTokenizer tokenizer = new StringTokenizer(list, ",");
+ platformSpecs = new Vector();
+
+ while (tokenizer.hasMoreTokens()) {
+ platformSpecs.add(tokenizer.nextToken());
+ }
+ }
+
+ public String getDropTokenList() {
+ return dropTokenList;
+ }
+
+ public void setDropTokenList(String dropTokenList) {
+ this.dropTokenList = dropTokenList;
+ }
+
+ public boolean isBuildTested() {
+ return isBuildTested;
+ }
+
+ public void setIsBuildTested(boolean isBuildTested) {
+ this.isBuildTested = isBuildTested;
+ }
+
+
+ /**
+ * @return
+ */
+ public boolean testsRan() {
+ return testsRan;
+ }
+
+ /**
+ * @param b
+ */
+ public void setTestsRan(boolean b) {
+ testsRan = b;
+ }
+
+ /**
+ * @return
+ */
+ public Vector getDropTokens() {
+ return dropTokens;
+ }
+
+ /**
+ * @param vector
+ */
+ public void setDropTokens(Vector vector) {
+ dropTokens = vector;
+ }
+
+ /**
+ * @return
+ */
+ public String getTestResultsWithProblems() {
+ return testResultsWithProblems;
+ }
+
+ /**
+ * @return
+ */
+ public String getTestResultsXmlUrls() {
+ return testResultsXmlUrls;
+ }
+
+ /**
+ * @param string
+ */
+ public void setTestResultsWithProblems(String string) {
+ testResultsWithProblems = string;
+ }
+
+ public String getBuildType() {
+ return buildType;
+ }
+
+ public void setBuildType(String buildType) {
+ this.buildType = buildType;
+ }
+
+ public String getPlatformSpecificTemplateList() {
+ return platformSpecificTemplateList;
+ }
+
+ public void setPlatformSpecificTemplateList(String platformSpecificTemplateList) {
+ this.platformSpecificTemplateList = platformSpecificTemplateList;
+ }
+
+ public void setPlatformIdentifierToken(String platformIdentifierToken) {
+ this.platformIdentifierToken = platformIdentifierToken;
+ }
+
+ public String getPlatformIdentifierToken() {
+ return platformIdentifierToken;
+ }
+
+}