diff --git a/JenkinsJobs/Builds/build.jenkinsfile b/JenkinsJobs/Builds/build.jenkinsfile index 8ca7b4d69fe..21a0b49ad0a 100644 --- a/JenkinsJobs/Builds/build.jenkinsfile +++ b/JenkinsJobs/Builds/build.jenkinsfile @@ -388,34 +388,15 @@ pipeline { # Gather compilelogs pushd ${AGG_DIR} - compilelogsDir=${DROP_DIR}/${BUILD_ID}/compilelogs/plugins - for log in $(find ${AGG_DIR} -name "compilelogs" -type d ); do + compilelogsDir=${DROP_DIR}/${BUILD_ID}/compilelogs + mkdir -p ${compilelogsDir} + for log in $(find . -name "compilelogs" -type d ); do targetDir=$( dirname $log ) - if [ ! -r $targetDir/MANIFEST.MF ]; then - echo "** Failed to process $log in $targetDir. Likely compile error. Will backup to source MANIFEST.MF in directory containing target." - targetDir=$( dirname $targetDir ) - if [ ! -r $targetDir/META-INF/MANIFEST.MF ]; then - echo "**Failed to process $log in $targetDir." - else - bundleId=$( grep Bundle-SymbolicName $targetDir/META-INF/MANIFEST.MF | cut -f2 -d" " | cut -f1 -d\\; | tr -d '\\f\\r\\n\\t' ) - bundleVersion=$( grep Bundle-Version $targetDir/META-INF/MANIFEST.MF | cut -f2 -d" " | tr -d '\\f\\r\\n\\t' ) - mkdir -p $compilelogsDir/${bundleId}_${bundleVersion} - rsync -vr $log/ $compilelogsDir/${bundleId}_${bundleVersion}/ - fi - else - bundleId=$( grep Bundle-SymbolicName $targetDir/MANIFEST.MF | cut -f2 -d" " | cut -f1 -d\\; | tr -d '\\f\\r\\n\\t' ) - bundleVersion=$( grep Bundle-Version $targetDir/MANIFEST.MF | cut -f2 -d" " | tr -d '\\f\\r\\n\\t' ) - mkdir -p $compilelogsDir/${bundleId}_${bundleVersion} - rsync -vr $log/ $compilelogsDir/${bundleId}_${bundleVersion}/ - fi + fullName=$(awk -F '[:;[:space:]]+' '/^Bundle-SymbolicName/ {name=$2} /^Bundle-Version/ {version=$2} END {print name "_" version}' $targetDir/MANIFEST.MF) + cp -r "${log}" "${compilelogsDir}/${fullName}/" done popd - # Verify compilelog - java \ - -Dinput=${DROP_DIR}/${BUILD_ID}/compilelogs/plugins \ - ${WORKSPACE}/scripts/releng/CompileLogConverter.java - # Generate repository reports $BASE_BUILDER_ECLIPSE_EXE \ -application org.eclipse.cbi.p2repo.analyzers.repoReport \ diff --git a/scripts/releng/CompileLogConverter.java b/scripts/releng/CompileLogConverter.java deleted file mode 100644 index 0ad3a2ae2bf..00000000000 --- a/scripts/releng/CompileLogConverter.java +++ /dev/null @@ -1,208 +0,0 @@ - -/******************************************************************************* - * Copyright (c) 2000, 2025 IBM Corporation and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * IBM Corporation - initial API and implementation - * Hannes Wellmann - Convert to plain Java scripts - *******************************************************************************/ - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.Locale; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import org.xml.sax.helpers.DefaultHandler; - -import log.converter.DOMHtmlConverter; -import log.converter.LogDocumentNode; -import log.converter.LogDocumentNode.ProblemSummaryNode; -import log.converter.ProblemNode; -import log.converter.ProblemNode.SeverityType; -import log.converter.ProblemsNode; -import utilities.OS; -import utilities.XmlProcessorFactoryRelEng; - -public class CompileLogConverter { - - private static final String HTML_EXTENSION = ".html"; //$NON-NLS-1$ - - private static final String XML_EXTENSION = ".xml"; //$NON-NLS-1$ - - private static List getAllFiles(Path root) throws IOException { - try (var files = Files.walk(root).filter(Files::isRegularFile)) { - return files.filter(f -> f.toString().toLowerCase(Locale.ROOT).endsWith(XML_EXTENSION)).toList(); - } - } - - public static void main(String[] args) throws IOException, ParserConfigurationException { - Path source = Path.of(OS.readProperty("input")); - CompileLogConverter converter = new CompileLogConverter(); - converter.parse2(source); - } - - private Path extractNameFrom(Path file) { - String inputFileName = file.getFileName().toString(); - final int index = inputFileName.lastIndexOf('.'); - return file.resolveSibling(inputFileName.substring(0, index) + HTML_EXTENSION); - } - - private void parse2(Path sourceDir) throws ParserConfigurationException, IOException { - DOMHtmlConverter converter = new DOMHtmlConverter(); - final DocumentBuilderFactory factory = XmlProcessorFactoryRelEng.createDocumentBuilderFactoryIgnoringDOCTYPE(); - factory.setValidating(true); - factory.setIgnoringElementContentWhitespace(true); - final DocumentBuilder builder = factory.newDocumentBuilder(); - // Commented due to - // https://github.com/eclipse-platform/eclipse.platform.releng.aggregator/issues/1943 - // builder.setEntityResolver((publicId, systemId) -> new InputSource(new - // ByteArrayInputStream(new byte[0]))); - if (true) { - // collect all xml files and iterate over them - if (!Files.exists(sourceDir)) { - throw new IllegalArgumentException("Directory " + sourceDir + " doesn't exist");//$NON-NLS-1$//$NON-NLS-2$ - } - if (!Files.isDirectory(sourceDir)) { - throw new IllegalArgumentException(sourceDir + " must be a directory in recursive mode");//$NON-NLS-1$ - } - List xmlFiles = getAllFiles(sourceDir); - for (Path xmlFile : xmlFiles) { - Path inputFile = xmlFile.toAbsolutePath(); - Path outputFile = extractNameFrom(inputFile); - try { - builder.setErrorHandler(new DefaultHandler() { - @Override - public void error(final SAXParseException e) throws SAXException { - reportError(inputFile, e); - throw e; - } - }); - Document document = builder.parse(inputFile.toFile()); - final LogDocumentNode documentNode = process(document); - converter.dump(inputFile, outputFile, documentNode); - } catch (final SAXException e) { - System.out.println(e); - } catch (final IOException e) { - e.printStackTrace(); - } - } - } - } - - private LogDocumentNode process(final Document document) { - final LogDocumentNode documentNode = new LogDocumentNode(); - NodeList nodeList = document.getElementsByTagName("problem_summary"); //$NON-NLS-1$ - if (nodeList.getLength() == 1) { - final Node problemSummaryNode = nodeList.item(0); - final NamedNodeMap problemSummaryMap = problemSummaryNode.getAttributes(); - final ProblemSummaryNode summaryNode = new ProblemSummaryNode( - Integer.parseInt(problemSummaryMap.getNamedItem("problems").getNodeValue()), - Integer.parseInt(problemSummaryMap.getNamedItem("errors").getNodeValue()), - Integer.parseInt(problemSummaryMap.getNamedItem("warnings").getNodeValue()), - Integer.parseInt(problemSummaryMap.getNamedItem("infos").getNodeValue())); - documentNode.setProblemSummary(summaryNode); - } - - nodeList = document.getElementsByTagName("problems"); //$NON-NLS-1$ - if (nodeList == null) { - return null; - } - - final int length = nodeList.getLength(); - int globalErrorNumber = 1; - for (int i = 0; i < length; i++) { - final Node problemsNode = nodeList.item(i); - final ProblemsNode node = new ProblemsNode(); - documentNode.addProblemsNode(node); - final Node sourceNode = problemsNode.getParentNode(); - final NamedNodeMap sourceNodeMap = sourceNode.getAttributes(); - final String sourceFileName = sourceNodeMap.getNamedItem("path").getNodeValue();//$NON-NLS-1$ - node.sourceFileName = sourceFileName; - final NamedNodeMap problemsNodeMap = problemsNode.getAttributes(); - node.numberOfErrors = Integer.parseInt(problemsNodeMap.getNamedItem("errors").getNodeValue());//$NON-NLS-1$ - node.numberOfWarnings = Integer.parseInt(problemsNodeMap.getNamedItem("warnings").getNodeValue());//$NON-NLS-1$ - node.numberOfProblems = Integer.parseInt(problemsNodeMap.getNamedItem("problems").getNodeValue());//$NON-NLS-1$ - node.numberOfInfos = Integer.parseInt(problemsNodeMap.getNamedItem("infos").getNodeValue());//$NON-NLS-1$ - - final NodeList children = problemsNode.getChildNodes(); - final int childrenLength = children.getLength(); - for (int j = 0; j < childrenLength; j++) { - final Node problemNode = children.item(j); - final NamedNodeMap problemNodeMap = problemNode.getAttributes(); - final String severity = problemNodeMap.getNamedItem("severity").getNodeValue();//$NON-NLS-1$ - final ProblemNode problem = new ProblemNode(); - problem.id = problemNodeMap.getNamedItem("id").getNodeValue();//$NON-NLS-1$ - switch (severity) { - case "ERROR": - problem.severityType = SeverityType.ERROR; - node.addError(problem); - break; - case "INFO": - problem.severityType = SeverityType.INFO; - node.addInfo(problem); - break; - case "WARNING": - problem.severityType = SeverityType.WARNING; - if (DOMHtmlConverter.FILTERED_WARNINGS_IDS.contains(problem.id)) { - if (DOMHtmlConverter.FORBIDDEN_REFERENCE.equals(problem.id)) { - node.addForbiddenWarning(problem); - } else { - node.addDiscouragedWarning(problem); - } - } else { - node.addOtherWarning(problem); - } - break; - } - problem.charStart = Integer.parseInt(problemNodeMap.getNamedItem("charStart").getNodeValue());//$NON-NLS-1$ - problem.charEnd = Integer.parseInt(problemNodeMap.getNamedItem("charEnd").getNodeValue());//$NON-NLS-1$ - problem.line = Integer.parseInt(problemNodeMap.getNamedItem("line").getNodeValue());//$NON-NLS-1$ - problem.globalProblemNumber = globalErrorNumber; - problem.problemNumber = j; - problem.sourceFileName = sourceFileName; - globalErrorNumber++; - final NodeList problemChildren = problemNode.getChildNodes(); - final int problemChildrenLength = problemChildren.getLength(); - for (int n = 0; n < problemChildrenLength; n++) { - final Node child = problemChildren.item(n); - final String nodeName = child.getNodeName(); - if ("message".equals(nodeName)) {//$NON-NLS-1$ - final NamedNodeMap childNodeMap = child.getAttributes(); - problem.message = childNodeMap.getNamedItem("value").getNodeValue();//$NON-NLS-1$ - } else if ("source_context".equals(nodeName)) {//$NON-NLS-1$ - final NamedNodeMap childNodeMap = child.getAttributes(); - problem.sourceStart = Integer.parseInt(childNodeMap.getNamedItem("sourceStart").getNodeValue());//$NON-NLS-1$ - problem.sourceEnd = Integer.parseInt(childNodeMap.getNamedItem("sourceEnd").getNodeValue());//$NON-NLS-1$ - problem.contextValue = childNodeMap.getNamedItem("value").getNodeValue();//$NON-NLS-1$ - } - } - } - } - return documentNode; - } - - private void reportError(final Path inputFileName, final SAXParseException e) { - System.err.println( - "Error in " + inputFileName + " at line " + e.getLineNumber() + " and column " + e.getColumnNumber()); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ - System.err.println(e.getMessage()); - } - -} diff --git a/scripts/releng/CompilerSummaryGenerator.java b/scripts/releng/CompilerSummaryGenerator.java index dc4a48a51a5..ec1ed3cc3e4 100644 --- a/scripts/releng/CompilerSummaryGenerator.java +++ b/scripts/releng/CompilerSummaryGenerator.java @@ -15,16 +15,15 @@ * Hannes Wellmann - split TestResultsGenerator and CompilerSummaryGenerator *******************************************************************************/ +import static utilities.XmlProcessorFactoryRelEng.elements; + import java.util.Map.Entry; -import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; +import org.w3c.dom.Element; import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; import org.xml.sax.SAXException; import utilities.JSON; @@ -33,16 +32,14 @@ /** @author Dean Roberts (circa 2000!) and David Williams (circa 2016) */ -final String HTML_EXTENSION = ".html"; final String XML_EXTENSION = ".xml"; final String COMPILER_SUMMARY_FILENAME = "compilerSummary.json"; -Path dropDirectory; Path compileLogsDirectory; // Location of compile logs base directory void main() throws Exception { - dropDirectory = Path.of(OS.readProperty("dropDirectory")).toRealPath(); - compileLogsDirectory = dropDirectory.resolve("compilelogs/plugins"); + Path dropDirectory = Path.of(OS.readProperty("dropDirectory")).toRealPath(); + compileLogsDirectory = dropDirectory.resolve("compilelogs"); IO.println("INFO: Processing compiler logs in"); IO.println("\t" + compileLogsDirectory); @@ -50,83 +47,38 @@ void main() throws Exception { parseCompileLogs(); } -String computeShortName(String name) { - // further shortening (may need to "back out", so left as separate step) - // we always expect the name to start with "org.eclipse." .. but, - // just in case that changes, we'll check and handle if not. - String commonnamespace = "org.eclipse."; - int start = name.startsWith(commonnamespace) ? commonnamespace.length() : 0; - // Similarly, we always expect the name to end with '_version', - // but just in case not. - int last = name.indexOf('_'); - return name.substring(start, last == -1 ? name.length() : last); -} - -final Pattern XML_EXTENSION_PATTERN = Pattern.compile(XML_EXTENSION + "$"); - void parseCompileLog(Path file, Map compilerLog) throws IOException, SAXException, ParserConfigurationException { - Document aDocument; - try (BufferedReader reader = Files.newBufferedReader(file)) { - DocumentBuilder builder = XmlProcessorFactoryRelEng.createDocumentBuilderIgnoringDOCTYPE(); - aDocument = builder.parse(new InputSource(reader)); - } - if (aDocument == null) { - return; - } + Document aDocument = XmlProcessorFactoryRelEng.parseDocumentIgnoringDOCTYPE(file); + int warnings = 0; + int accessWarnings = 0; + int infos = 0; // Get summary of problems - final NodeList nodeList = aDocument.getElementsByTagName("problem"); - if (nodeList == null || nodeList.getLength() == 0) { - return; - } - int errorCount = 0; - int warningCount = 0; - int forbiddenWarningCount = 0; - int discouragedWarningCount = 0; - int infoCount = 0; - - final int length = nodeList.getLength(); - for (int i = 0; i < length; i++) { - final Node problemNode = nodeList.item(i); - final NamedNodeMap aNamedNodeMap = problemNode.getAttributes(); - final Node severityNode = aNamedNodeMap.getNamedItem("severity"); - final Node idNode = aNamedNodeMap.getNamedItem("id"); - if (severityNode != null) { - switch (severityNode.getNodeValue()) { - case "WARNING" -> { - // this is a warning need to check the id - String value = idNode == null ? "" : idNode.getNodeValue(); - switch (value) { - case "ForbiddenReference" -> forbiddenWarningCount++; - case "DiscouragedReference" -> discouragedWarningCount++; - default -> warningCount++; - } - } - case "ERROR" -> errorCount++; // this is an error - case "INFO" -> infoCount++; // this is an info warning + NodeList problemList = aDocument.getElementsByTagName("problem"); + for (Element problem : elements(problemList)) { + String severity = problem.getAttribute("severity"); + switch (severity) { + case "WARNING" -> { + // this is a warning need to check the id + String value = problem.getAttribute("id"); + switch (value) { + case "ForbiddenReference", "DiscouragedReference" -> accessWarnings++; + default -> warnings++; } } + case "INFO" -> infos++; // this is an info warning + } } - if (errorCount == 0 && warningCount == 0 && forbiddenWarningCount == 0 && discouragedWarningCount == 0 - && infoCount == 0) { + if (warnings == 0 && accessWarnings == 0 && infos == 0) { return; } - - String relativePath = compileLogsDirectory.relativize(file).toString().replace(File.separatorChar, '/'); - // make sure '.xml' extension is "last thing" in string. (bug 490320) - String relativePathToHTML = XML_EXTENSION_PATTERN.matcher(relativePath).replaceAll(HTML_EXTENSION); - String pluginDirectoryName = file.getParent().getFileName().toString(); - String shortName = computeShortName(pluginDirectoryName); - + String path = compileLogsDirectory.relativize(file).toString().replace(File.separatorChar, '/'); JSON.Object issues = JSON.Object.create(); - issues.add("path", JSON.String.create(relativePathToHTML)); - addIfNonZero(issues, "errors", errorCount); - addIfNonZero(issues, "warnings", warningCount); - addIfNonZero(issues, "infos", infoCount); - addIfNonZero(issues, "forbidden", forbiddenWarningCount); - addIfNonZero(issues, "discouraged", discouragedWarningCount); - if (compilerLog.putIfAbsent(shortName, issues) != null) { - throw new IllegalStateException("Plugin already set: " + shortName + "\n" + compilerLog.get(shortName)); + addIfNonZero(issues, "warnings", warnings); + addIfNonZero(issues, "access", accessWarnings); + addIfNonZero(issues, "infos", infos); + if (compilerLog.putIfAbsent(path, issues) != null) { + throw new IllegalStateException("Plugin already set: " + path + "\n" + compilerLog.get(path)); } } @@ -137,7 +89,6 @@ void addIfNonZero(JSON.Object object, String key, int value) { } void parseCompileLogs() throws Exception { - Map compilerLog = new HashMap<>(); try (var xmlFiles = Files.walk(compileLogsDirectory).filter(f -> f.toString().endsWith(XML_EXTENSION)) .filter(Files::isRegularFile)) { @@ -145,15 +96,12 @@ void parseCompileLogs() throws Exception { parseCompileLog(file, compilerLog); } } - JSON.Object compilerSummary = JSON.Object.create(); - String note = "This file created by the CompilerSummaryGenerator Java script"; - compilerSummary.add("note", JSON.String.create(note)); compilerLog.entrySet().stream().sorted(Comparator.comparing(Entry::getKey)) .forEach(e -> compilerSummary.add(e.getKey(), e.getValue())); IO.println("INFO: Plug-ins containing compiler issues: " + compilerLog.size()); - Path file = dropDirectory.resolve(COMPILER_SUMMARY_FILENAME); + Path file = compileLogsDirectory.resolve(COMPILER_SUMMARY_FILENAME); IO.println("Write Compile log summary data to: " + file); JSON.write(compilerSummary, file); } diff --git a/scripts/releng/TestResultsGenerator.java b/scripts/releng/TestResultsGenerator.java index 40943fd3b96..b39bc4202d1 100644 --- a/scripts/releng/TestResultsGenerator.java +++ b/scripts/releng/TestResultsGenerator.java @@ -30,7 +30,6 @@ import java.util.TreeSet; import java.util.stream.Collectors; -import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; @@ -82,8 +81,7 @@ private void collectErrors(Path fileName, JSON.Object test) errorCount = -2; } else { try { - DocumentBuilder builder = XmlProcessorFactoryRelEng.createDocumentBuilderWithErrorOnDOCTYPE(); - Document document = builder.parse(fileName.toFile()); + Document document = XmlProcessorFactoryRelEng.parseDocumentWithErrorOnDOCTYPE(fileName); final NodeList elements = document.getElementsByTagName(elementName); final int elementCount = elements.getLength(); @@ -196,8 +194,7 @@ private Set loadExpectedTests(List foundConfigs) Set testLogsSet = new TreeSet<>(); - DocumentBuilder parser = XmlProcessorFactoryRelEng.createDocumentBuilderWithErrorOnDOCTYPE(); - Document document = parser.parse(testManifestFile.toFile()); + Document document = XmlProcessorFactoryRelEng.parseDocumentWithErrorOnDOCTYPE(testManifestFile); // store a list of the test logs expected after testing NodeList testLogList = document.getElementsByTagName("logFile"); diff --git a/scripts/releng/log/converter/DOMHtmlConverter.java b/scripts/releng/log/converter/DOMHtmlConverter.java deleted file mode 100644 index 5e825619b47..00000000000 --- a/scripts/releng/log/converter/DOMHtmlConverter.java +++ /dev/null @@ -1,154 +0,0 @@ - -/******************************************************************************* - * Copyright (c) 2006, 2025 IBM Corporation and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * IBM Corporation - initial API and implementation - * Hannes Wellmann - Convert to plain Java scripts - *******************************************************************************/ - -package log.converter; - -import java.io.IOException; -import java.io.Writer; -import java.nio.file.Files; -import java.nio.file.Path; -import java.text.ChoiceFormat; -import java.text.MessageFormat; -import java.util.List; -import java.util.ResourceBundle; -import java.util.Set; -import java.util.function.Function; -import java.util.function.ToIntFunction; - -import log.converter.LogDocumentNode.ProblemSummaryNode; - -public class DOMHtmlConverter { - - public static final String FORBIDDEN_REFERENCE = "ForbiddenReference"; //$NON-NLS-1$ - public static final String DISCOURAGED_REFERENCE = "DiscouragedReference"; //$NON-NLS-1$ - public static final Set FILTERED_WARNINGS_IDS = Set.of(FORBIDDEN_REFERENCE, DISCOURAGED_REFERENCE); - - private final ResourceBundle messages = ResourceBundle.getBundle("log.converter.html_messages"); //$NON-NLS-1$ - - private String convertToHTML(final String s) { - final StringBuilder buffer = new StringBuilder(); - for (int i = 0, max = s.length(); i < max; i++) { - final char c = s.charAt(i); - switch (c) { - case '<' -> buffer.append("<"); //$NON-NLS-1$ - case '>' -> buffer.append(">"); //$NON-NLS-1$ - case '\"' -> buffer.append("""); //$NON-NLS-1$ - case '&' -> buffer.append("&"); //$NON-NLS-1$ - case '^' -> buffer.append("∧"); //$NON-NLS-1$ - default -> buffer.append(c); - } - } - return buffer.toString(); - } - - private int globalErrorNumber; - - public void dump(Path inputFilename, Path outputFileName, LogDocumentNode documentNode) { - final ProblemSummaryNode summaryNode = documentNode.getSummaryNode(); - if ((summaryNode == null) || (summaryNode.numberOfProblems() == 0)) { - return; - } - try (Writer writer = Files.newBufferedWriter(outputFileName)) { - String pluginName = outputFileName.getParent().getFileName().toString(); - if (pluginName == null) { - writer.write(messages.getString("header")); //$NON-NLS-1$ - } else { - String pattern = messages.getString("dom_header"); //$NON-NLS-1$ - writer.write(MessageFormat.format(pattern, pluginName, inputFilename.getFileName().toString())); - } - writer.write(messages.getString("problem.summary.title_anchor"));//$NON-NLS-1$ - writer.write(MessageFormat.format(messages.getString("problem.summary"), // - summaryNode.numberOfProblems(), summaryNode.numberOfErrors(), summaryNode.numberOfWarnings(), - summaryNode.numberOfInfos())); - - writer.write(messages.getString("anchors.references.no_top"));//$NON-NLS-1$ - List problemsNodes = documentNode.getProblems(); - globalErrorNumber = 1; - // dump errors - writeIssueSection(writer, pluginName, problemsNodes, "error", "errors", ProblemsNode::getErrors, - n -> n.numberOfErrors); - // dump other warnings - writeIssueSection(writer, pluginName, problemsNodes, "warning", "other_warnings", - ProblemsNode::getOtherWarnings, n -> n.numberOfWarnings); - // dump infos - writeIssueSection(writer, pluginName, problemsNodes, "info", "infos", ProblemsNode::getInfos, - n -> n.numberOfInfos); - // dump forbidden accesses warnings - writeIssueSection(writer, pluginName, problemsNodes, "warning", "forbidden_warnings", - ProblemsNode::getForbiddenWarnings, n -> n.numberOfWarnings); - // dump discouraged accesses warnings - writeIssueSection(writer, pluginName, problemsNodes, "warning", "discouraged_warnings", - ProblemsNode::getDiscouragedWarnings, n -> n.numberOfWarnings); - - writer.write(messages.getString("footer")); //$NON-NLS-1$ - writer.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void writeIssueSection(Writer writer, String pluginName, List problemsNodes, String type, - String titleType, Function> getNodes, - ToIntFunction getNumberOfIssues) throws IOException { - writer.write(messages.getString(titleType + ".title_anchor"));//$NON-NLS-1$ - writer.write(messages.getString("anchors.references.no_" + titleType));//$NON-NLS-1$ - for (ProblemsNode problemsNode : problemsNodes) { - List problemNodes = getNodes.apply(problemsNode); - int numberOfIssues = getNumberOfIssues.applyAsInt(problemsNode); - if (problemNodes.isEmpty()) { - continue; - } - MessageFormat form = new MessageFormat(messages.getString(titleType + ".header")); - double[] warningsLimits = { 1, 2 }; - String[] warningParts = { messages.getString("one_" + type), //$NON-NLS-1$ - messages.getString("multiple_" + type + "s") //$NON-NLS-1$ - }; - ChoiceFormat warningForm = new ChoiceFormat(warningsLimits, warningParts); - String sourceFileName = extractRelativePath(problemsNode.sourceFileName, pluginName); - form.setFormatByArgumentIndex(1, warningForm); - Object[] arguments = new Object[] { sourceFileName, numberOfIssues }; - writer.write(form.format(arguments)); - for (int j = 0; j < problemNodes.size(); j++) { - ProblemNode problemNode = problemNodes.get(j); - String pattern = messages.getString(type + "s.entry." + ((j & 1) != 0 ? "odd" : "even")); - problemNode.setSources(); - writer.write(MessageFormat.format(pattern, sourceFileName, globalErrorNumber, j + 1, problemNode.id, - problemNode.line, convertToHTML(problemNode.message), - convertToHTML(problemNode.sourceCodeBefore), convertToHTML(problemNode.sourceCode), - convertToHTML(problemNode.sourceCodeAfter), "", problemNode.charStart, problemNode.charEnd)); - globalErrorNumber++; - } - writer.write(messages.getString(titleType + ".footer")); //$NON-NLS-1$ - } - } - - private String extractRelativePath(final String sourceFileName, final String pluginName) { - if (pluginName == null) { - return sourceFileName; - } - final int index = pluginName.indexOf('_'); - if (index == -1) { - return sourceFileName; - } - final String pluginShortName = pluginName.substring(0, index); - final int index2 = sourceFileName.indexOf(pluginShortName); - if (index2 == -1) { - return sourceFileName; - } - return sourceFileName.substring(index2 + pluginShortName.length(), sourceFileName.length()); - } - -} diff --git a/scripts/releng/log/converter/LogDocumentNode.java b/scripts/releng/log/converter/LogDocumentNode.java deleted file mode 100644 index 3a810f27575..00000000000 --- a/scripts/releng/log/converter/LogDocumentNode.java +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2025 IBM Corporation and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package log.converter; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class LogDocumentNode { - - public record ProblemSummaryNode(int numberOfProblems, int numberOfErrors, int numberOfWarnings, - int numberOfInfos) { - @Override - public String toString() { - return "problems : " + numberOfProblems // - + " errors : " + numberOfErrors // - + " warnings : " + numberOfWarnings // - + " infos : " + numberOfInfos; - } - } - - private final List problems = new ArrayList<>(); - private ProblemSummaryNode summaryNode; - - public void addProblemsNode(final ProblemsNode node) { - problems.add(node); - } - - public List getProblems() { - return Collections.unmodifiableList(problems); - } - - public ProblemSummaryNode getSummaryNode() { - return summaryNode; - } - - public void setProblemSummary(final ProblemSummaryNode node) { - summaryNode = node; - } -} diff --git a/scripts/releng/log/converter/ProblemNode.java b/scripts/releng/log/converter/ProblemNode.java deleted file mode 100644 index 694ecd7eec9..00000000000 --- a/scripts/releng/log/converter/ProblemNode.java +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2025 IBM Corporation and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package log.converter; - -public class ProblemNode { - - public enum SeverityType { - ERROR, WARNING, INFO; - } - - public SeverityType severityType; - public int charStart; - public int charEnd; - public int line; - public String id; - public String message; - public int sourceStart; - public int sourceEnd; - public String contextValue; - public int globalProblemNumber; - public int problemNumber; - public String sourceFileName; - - public String sourceCodeBefore; - public String sourceCodeAfter; - public String sourceCode; - - public void setSources() { - if ((sourceStart == -1) || (sourceEnd == -1)) { - sourceCodeBefore = ""; - sourceCode = contextValue; - sourceCodeAfter = ""; - } else { - final int length = contextValue.length(); - if (sourceStart < length) { - sourceCodeBefore = contextValue.substring(0, sourceStart); - final int end = sourceEnd + 1; - if (end < length) { - sourceCode = contextValue.substring(sourceStart, end); - sourceCodeAfter = contextValue.substring(end, length); - } else { - sourceCode = contextValue.substring(sourceStart, length); - sourceCodeAfter = ""; - } - } else { - sourceCodeBefore = ""; - sourceCode = ""; - sourceCodeAfter = ""; - } - } - } - - @Override - public String toString() { - final StringBuilder buffer = new StringBuilder(); - switch (severityType) { - case ERROR -> buffer.append("ERROR ");//$NON-NLS-1$ - case WARNING -> buffer.append("WARNING ");//$NON-NLS-1$ - case INFO -> buffer.append("INFO ");//$NON-NLS-1$ - } - buffer.append("line : ").append(line).append(" message = ").append(message);//$NON-NLS-1$//$NON-NLS-2$ - return buffer.toString(); - } -} diff --git a/scripts/releng/log/converter/ProblemsNode.java b/scripts/releng/log/converter/ProblemsNode.java deleted file mode 100644 index 92ef2765b87..00000000000 --- a/scripts/releng/log/converter/ProblemsNode.java +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2025 IBM Corporation and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package log.converter; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class ProblemsNode { - - public String sourceFileName; - public int numberOfProblems; - public int numberOfErrors; - public int numberOfWarnings; - public int numberOfInfos; - - private final List errorNodes = new ArrayList<>(); - private final List otherWarningNodes = new ArrayList<>(); - private final List discouragedWarningsNodes = new ArrayList<>(); - private final List forbiddenWarningsNodes = new ArrayList<>(); - private final List infoNodes = new ArrayList<>(); - - public void addDiscouragedWarning(final ProblemNode node) { - discouragedWarningsNodes.add(node); - } - - public void addError(final ProblemNode node) { - errorNodes.add(node); - } - - public void addForbiddenWarning(final ProblemNode node) { - forbiddenWarningsNodes.add(node); - } - - public void addOtherWarning(final ProblemNode node) { - otherWarningNodes.add(node); - } - - public void addInfo(final ProblemNode node) { - infoNodes.add(node); - } - - public List getDiscouragedWarnings() { - return Collections.unmodifiableList(discouragedWarningsNodes); - } - - public List getErrors() { - return Collections.unmodifiableList(errorNodes); - } - - public List getForbiddenWarnings() { - return Collections.unmodifiableList(forbiddenWarningsNodes); - } - - public List getOtherWarnings() { - return Collections.unmodifiableList(otherWarningNodes); - } - - public List getInfos() { - return Collections.unmodifiableList(infoNodes); - } -} diff --git a/scripts/releng/log/converter/html_messages.properties b/scripts/releng/log/converter/html_messages.properties deleted file mode 100644 index cc9cd77c342..00000000000 --- a/scripts/releng/log/converter/html_messages.properties +++ /dev/null @@ -1,271 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2017 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 -############################################################################### -# {0} plugin name -# {1} xml log file name -dom_header=\n\ -\n\ -\n\ -\ \ \ \n\ -\ \ \ Compiler log for {0}\n\ -\n\ -\n\ -

Compiler log for {0} : {1}

\n - -header=<\!doctype html public "-//w3c//dtd html 4.0 transitional//en">\n\ -\n\ -\n\ -\ \ \ \n\ -\ \ \ Compiler log\n\ -\n\ -\n - -footer=\n\n - -# {0] source file name -# {1} number of problems -# {2} number of errors -# {3} number of warnings -# {4} number of infos -problems.footer= - -errors.title_anchor=

ERRORS

\n - -# {0] source file name -# {1} number of errors -errors.header=

{0} : {1} :

\n\n -errors.footer=
\n - -other_warnings.title_anchor=

OTHER WARNINGS

\n - -# {0] source file name -# {1} number of warnings -other_warnings.header=

{0} : {1} :

\n\n\n -other_warnings.footer=
OTHER WARNINGS
\n - -forbidden_warnings.title_anchor=

FORBIDDEN ACCESS WARNINGS

\n -# {0] source file name -# {1} number of warnings -forbidden_warnings.header=

{0} : {1} :

\n\n\n -forbidden_warnings.footer=
FORBIDDEN ACCESS WARNINGS
\n - -discouraged_warnings.title_anchor=

DISCOURAGED ACCESS WARNINGS

\n -# {0] source file name -# {1} number of warnings -discouraged_warnings.header=

{0} : {1} :

\n\n\n -discouraged_warnings.footer=
DISCOURAGED ACCESS WARNINGS
\n - -infos.title_anchor=

INFO WARNINGS

\n -# {0] source file name -# {1} number of warnings -infos.header=

{0} : {1} :

\n\n\n -infos.footer=
INFO WARNINGS
\n - -# {0} source file name -# {1} global error number -# {2} error number -# {3} error id -# {4} line number of the error -# {5} error message -# {6} source code before this error -# {7} source code corresponding to this error -# {8} source code after this error -# {9} complement to underline the problem -# {10} starting position of the error -# {11} ending position of the error -errors.entry.even=\n\ -\ {2}. ERROR in {0}
\n\ -\  (at line {4})
\n\ -\ {6}{7}{8}
\n\ -\ {5}\n\ -\ \n\ -\\n - -# {0} source file name -# {1} global error number -# {2} error number -# {3} error id -# {4} line number of the error -# {5} error message -# {6} source code before this error -# {7} source code corresponding to this error -# {8} source code after this error -# {9} complement to underline the problem -# {10} starting position of the error -# {11} ending position of the error -errors.entry.odd=\n\ -\ {2}. ERROR in {0}
\n\ -\  (at line {4})
\n\ -\ {6}{7}{8}
\n\ -\ {5}\n\ -\ \n\ -\\n - -# {0} source file name -# {1} global error number -# {2} error number -# {3} error id -# {4} line number of the error -# {5} error message -# {6} source code before this error -# {7} source code corresponding to this error -# {8} source code after this error -# {9} complement to underline the problem -# {10} starting position of the error -# {11} ending position of the error -warnings.entry.even=\n\ -\ {2}. WARNING in {0}
\n\ -\  (at line {4})
\n\ -\ {6}{7}{8}
\n\ -\ {5}\n\ -\ \n\ -\\n - -# {0} source file name -# {1} global error number -# {2} error number -# {3} error id -# {4} line number of the error -# {5} error message -# {6} source code before this error -# {7} source code corresponding to this error -# {8} source code after this error -# {9} complement to underline the problem -# {10} starting position of the error -# {11} ending position of the error -warnings.entry.odd=\n\ -\ {2}. WARNING in {0}
\n\ -\  (at line {4})
\n\ -\ {6}{7}{8}
\n\ -\ {5}\n\ -\ \n\ -\\n - -# {0} source file name -# {1} global error number -# {2} error number -# {3} error id -# {4} line number of the error -# {5} error message -# {6} source code before this error -# {7} source code corresponding to this error -# {8} source code after this error -# {9} complement to underline the problem -# {10} starting position of the error -# {11} ending position of the error -infos.entry.even=\n\ -\ {2}. INFO in {0}
\n\ -\  (at line {4})
\n\ -\ {6}{7}{8}
\n\ -\ {5}\n\ -\ \n\ -\\n - -# {0} source file name -# {1} global error number -# {2} error number -# {3} error id -# {4} line number of the error -# {5} error message -# {6} source code before this error -# {7} source code corresponding to this error -# {8} source code after this error -# {9} complement to underline the problem -# {10} starting position of the error -# {11} ending position of the error -infos.entry.odd=\n\ -\ {2}. INFO in {0}
\n\ -\  (at line {4})
\n\ -\ {6}{7}{8}
\n\ -\ {5}\n\ -\ \n\ -\\n - -# {0} global number of problems -# {1} global number of errors -# {2} global number of warnings -# {3} global number of infos -problem.summary=

TOTAL : ERRORS: {1}, WARNINGS: {2}, INFOS: {3}

\n - -problem.summary.title_anchor=\n - -anchors.references.no_top=\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -
errorsothers warningsinfosforbidden warningsdiscouraged warnings
\n - -anchors.references.no_errors=\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -
topothers warningsinfosforbidden warningsdiscouraged warnings
\n - -anchors.references.no_other_warnings=\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -
toperrorsinfosforbidden warningsdiscouraged warnings
\n - -anchors.references.no_infos=\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -
errorsothers warningsforbidden warningsdiscouraged warnings
\n - -anchors.references.no_forbidden_warnings=\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -
toperrorsinfosothers warningsdiscouraged warnings
\n - -anchors.references.no_discouraged_warnings=\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -\n\ -
toperrorsinfosothers warningsforbidden warnings
\n - -one_warning=1 warning -multiple_warnings={1,number} warnings - -one_error=1 error -multiple_errors={1,number} errors - -one_info=1 info -multiple_infos={1,number} infos \ No newline at end of file diff --git a/scripts/releng/utilities/XmlProcessorFactoryRelEng.java b/scripts/releng/utilities/XmlProcessorFactoryRelEng.java index 2c793735bdc..8a982fe537c 100644 --- a/scripts/releng/utilities/XmlProcessorFactoryRelEng.java +++ b/scripts/releng/utilities/XmlProcessorFactoryRelEng.java @@ -14,16 +14,19 @@ package utilities; import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.file.Path; import java.util.stream.IntStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; -import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; +import org.xml.sax.SAXException; /** * XML processing which prohibits external entities. @@ -37,72 +40,45 @@ private XmlProcessorFactoryRelEng() { // using these factories is synchronized with creating & configuring them // potentially concurrently in another thread: - private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY_ERROR_ON_DOCTYPE = createDocumentBuilderFactoryWithErrorOnDOCTYPE(); - private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY_IGNORING_DOCTYPE = createDocumentBuilderFactoryIgnoringDOCTYPE(); + private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY_ERROR_ON_DOCTYPE; + private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY_IGNORING_DOCTYPE; - /** - * Creates DocumentBuilderFactory which throws SAXParseException when detecting - * external entities. It's magnitudes faster to call - * {@link #createDocumentBuilderWithErrorOnDOCTYPE()}. - * - * @return javax.xml.parsers.DocumentBuilderFactory - */ - private static synchronized DocumentBuilderFactory createDocumentBuilderFactoryWithErrorOnDOCTYPE() { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - // completely disable DOCTYPE declaration: + static { try { - factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); //$NON-NLS-1$ - } catch (ParserConfigurationException e) { - throw new RuntimeException(e.getMessage(), e); - } - return factory; - } + DocumentBuilderFactory factory1 = DocumentBuilderFactory.newInstance(); + // completely disable DOCTYPE declaration: + factory1.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); //$NON-NLS-1$ + DOCUMENT_BUILDER_FACTORY_ERROR_ON_DOCTYPE = factory1; - /** - * Creates DocumentBuilderFactory which ignores external entities. Beware: - * DocumentBuilder created with this Factory may load DTDs from a remote Host - - * which may be slow and a security risk. It's recommended to call - * DocumentBuilder.setEntityResolver(EntityResolver) with fixed DTDs.
- * It's magnitudes faster to call - * {@link #createDocumentBuilderIgnoringDOCTYPE()}. - * - * @return javax.xml.parsers.DocumentBuilderFactory - * @see javax.xml.parsers.DocumentBuilder#setEntityResolver(EntityResolver) - */ - public static synchronized DocumentBuilderFactory createDocumentBuilderFactoryIgnoringDOCTYPE() { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - try { + DocumentBuilderFactory factory2 = DocumentBuilderFactory.newInstance(); // completely disable external entities declarations: - factory.setFeature("http://xml.org/sax/features/external-general-entities", false); //$NON-NLS-1$ - factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); //$NON-NLS-1$ + factory2.setFeature("http://xml.org/sax/features/external-general-entities", false); //$NON-NLS-1$ + factory2.setFeature("http://xml.org/sax/features/external-parameter-entities", false); //$NON-NLS-1$ + DOCUMENT_BUILDER_FACTORY_IGNORING_DOCTYPE = factory2; } catch (ParserConfigurationException e) { throw new RuntimeException(e.getMessage(), e); } - return factory; } /** - * Creates DocumentBuilder which throws SAXParseException when detecting - * external entities. The builder is not thread safe. - * - * @return javax.xml.parsers.DocumentBuilder + * Parses the given XML files, throwing an SAXParseException when detecting + * external entities. */ - public static synchronized DocumentBuilder createDocumentBuilderWithErrorOnDOCTYPE() - throws ParserConfigurationException { - return DOCUMENT_BUILDER_FACTORY_ERROR_ON_DOCTYPE.newDocumentBuilder(); + public static synchronized Document parseDocumentWithErrorOnDOCTYPE(Path file) + throws ParserConfigurationException, IOException, SAXException { + DocumentBuilder builder = DOCUMENT_BUILDER_FACTORY_ERROR_ON_DOCTYPE.newDocumentBuilder(); + return builder.parse(file.toFile()); } /** - * Creates DocumentBuilder which ignores external entities and does not load - * remote DTDs. The builder is not thread safe. - * - * @return javax.xml.parsers.DocumentBuilder + * Parses the given XML files, ignoring external entities and not loading remote + * DTDs. */ - public static synchronized DocumentBuilder createDocumentBuilderIgnoringDOCTYPE() - throws ParserConfigurationException { + public static synchronized Document parseDocumentIgnoringDOCTYPE(Path file) + throws ParserConfigurationException, IOException, SAXException { DocumentBuilder builder = DOCUMENT_BUILDER_FACTORY_IGNORING_DOCTYPE.newDocumentBuilder(); builder.setEntityResolver((__, ___) -> new InputSource(new ByteArrayInputStream(new byte[0]))); - return builder; + return builder.parse((file.toFile())); } public static Iterable elements(NodeList list) { diff --git a/sites/eclipse/.gitignore b/sites/eclipse/.gitignore index a6c57f5fb2f..35ad603205a 100644 --- a/sites/eclipse/.gitignore +++ b/sites/eclipse/.gitignore @@ -1 +1,2 @@ *.json +**/compilelogs/**/*.xml diff --git a/sites/eclipse/README.md b/sites/eclipse/README.md index 446eedf8874..986f40c509f 100644 --- a/sites/eclipse/README.md +++ b/sites/eclipse/README.md @@ -7,11 +7,30 @@ or by the [Update Download Index](../../JenkinsJobs/Releng/updateIndex.jenkinsfi # Local testing +## Obtaining website data files + To locally create the full set of data (JSON) files for all websites, e.g. for local testing, one can run `./testDataFetch.sh ` That scripts fetches the data files of the build with specified identifier and places it at the expected location and allows to replicate the Eclipse and Equinox websites of that build and the current overview pages locally. Any I, Y, milestone, RC or release available at https://download.eclipse.org/eclipse/downloads/ may be specified. -Launch `jwebserver` from this repository (requires a JDK-18 or later on `PATH`) and open the localhost URL displayed on the console (by default `http://127.0.0.1:8000/`). +## Testing data file generation + +The data (JSON) files are generated by simple Java (source) programs during the build as explained above. +These Java programs read the files contained in an Eclipse respectivly Equinox drop. +Consequently these drop files are required to be present locally when running these programs. + +To obtain them, navigate to the desired build of the current I-build job in the Jenkins [Builds](https://ci.eclipse.org/releng/job/Builds) folder +and from the archived build artifacts download all files as ZIP-archive in the folders +- `cje-production/siteDir/eclipse/downloads/drops4` +- `cje-production/siteDir/equinox/drops` + +to get a full Eclipse respectivly Equinox drop locally. +Unzip the archives to a location of your choise and launch the RelEng Java programs with the corresponding System-properties pointing to these drop folders accordingly. + +## Launching a web-server + +Launch `jwebserver` from this or the parent folder (requires a JDK-18 or later on `PATH`) +and open the localhost URL displayed on the console (by default `http://127.0.0.1:8000/`). Run `jwebserver --help` for help and further options. diff --git a/sites/eclipse/build/tests.html b/sites/eclipse/build/tests.html index de498da1b46..ebf85d8bc35 100644 --- a/sites/eclipse/build/tests.html +++ b/sites/eclipse/build/tests.html @@ -54,39 +54,27 @@

Unit Test Results

-

Plugins containing compile errors or warnings

+

Plugins containing compile warnings or infos

- The table below shows the plugins in which errors or warnings were encountered. - Click on the jar file link to view its detailed report. + The table below shows the plugins in which warnings were encountered. + Click on the jar file's row to view its detailed report.

- +
- - + + + - -
Compile Logs (Jar Files)ErrorsWarningsGeneral WarningsAccess WarningsInfos
- -

Plugins containing access errors or warnings

- - - - - - - - - - +
Compile Logs (Jar Files)Forbidden AccessDiscouraged AccessInfo Warnings