| /******************************************************************************* |
| * Copyright (c) 2000, 2007 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.build.tools.convert.ant; |
| |
| import java.io.File; |
| import java.io.FileFilter; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.ParserConfigurationException; |
| |
| import org.eclipse.releng.build.tools.convert.dom.AbstractDOMConverter; |
| import org.eclipse.releng.build.tools.convert.dom.IDOMConverter; |
| import org.eclipse.releng.build.tools.convert.dom.LogDocumentNode; |
| import org.eclipse.releng.build.tools.convert.dom.ProblemNode; |
| import org.eclipse.releng.build.tools.convert.dom.ProblemSummaryNode; |
| import org.eclipse.releng.build.tools.convert.dom.ProblemsNode; |
| import org.w3c.dom.Document; |
| 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; |
| import org.xml.sax.SAXParseException; |
| import org.xml.sax.helpers.DefaultHandler; |
| |
| public class Converter { |
| |
| private static final String HTML_EXTENSION = ".html"; //$NON-NLS-1$ |
| |
| private static final String TXT_EXTENSION = ".txt"; //$NON-NLS-1$ |
| |
| private static final String XML_EXTENSION = ".xml"; //$NON-NLS-1$ |
| |
| public static final String INPUT_SOURCE = "inputSource"; //$NON-NLS-1$ |
| |
| public static final String CONVERTER_ID = "converterID"; //$NON-NLS-1$ |
| |
| public static final String OUTPUT_FILE_NAME = "outputFileName"; //$NON-NLS-1$ |
| |
| public static final String ENABLE_VALIDATION = "enableValidation"; //$NON-NLS-1$ |
| |
| public static final String RECURSIVE = "recurse"; //$NON-NLS-1$ |
| |
| public static final int FORMAT_VERSION_2 = 2; |
| |
| public static final int CURRENT_FORMAT_VERSION = FORMAT_VERSION_2; |
| |
| private static final FileFilter XML_FILTER = new FileFilter() { |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see |
| * java.io.FileFilter |
| * # |
| * accept(java.io |
| * .File) |
| */ |
| public boolean accept(final File pathname) { |
| final String path = pathname.getAbsolutePath().toLowerCase(); |
| return path.endsWith(XML_EXTENSION) || pathname.isDirectory(); |
| } |
| }; |
| |
| private static void collectAllFiles(final File root, final ArrayList collector, final FileFilter fileFilter) { |
| final File[] files = root.listFiles(fileFilter); |
| for (int i = 0; i < files.length; i++) { |
| final File currentFile = files[i]; |
| if (currentFile.isDirectory()) { |
| collectAllFiles(currentFile, collector, fileFilter); |
| } else { |
| collector.add(currentFile); |
| } |
| } |
| } |
| |
| public static File[] getAllFiles(final File root, final FileFilter fileFilter) { |
| final ArrayList files = new ArrayList(); |
| if (root.isDirectory()) { |
| collectAllFiles(root, files, fileFilter); |
| final File[] result = new File[files.size()]; |
| files.toArray(result); |
| return result; |
| } |
| return null; |
| } |
| |
| public static void main(final String[] args) { |
| try { |
| run(args); |
| } |
| catch (final ParserConfigurationException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| public static void run(final String[] args) throws ParserConfigurationException { |
| final Converter converter = new Converter(); |
| converter.configure(args); |
| converter.parse2(); |
| } |
| |
| private final HashMap options; |
| |
| public Converter() { |
| options = new HashMap(); |
| } |
| |
| public void configure(final String[] args) { |
| if ((args == null) || (args.length == 0)) { |
| throw new IllegalArgumentException("Arguments cannot be empty");//$NON-NLS-1$ |
| } |
| |
| // set default options |
| options.put(ENABLE_VALIDATION, "false"); //$NON-NLS-1$ |
| int converterID = ConverterFactory.HTML; |
| |
| final int argCount = args.length; |
| int index = 0; |
| boolean setOutputFile = false; |
| boolean setValidation = false; |
| boolean setInputFile = false; |
| |
| final int DEFAULT_MODE = 0; |
| final int OUTPUT_FILE_MODE = 1; |
| final int INPUT_FILE_MODE = 2; |
| |
| int mode = DEFAULT_MODE; |
| |
| loop: while (index < argCount) { |
| final String currentArg = args[index++]; |
| |
| switch (mode) { |
| case INPUT_FILE_MODE: |
| options.put(INPUT_SOURCE, currentArg); |
| mode = DEFAULT_MODE; |
| break; |
| case OUTPUT_FILE_MODE: |
| if (currentArg.toLowerCase().endsWith(TXT_EXTENSION)) { |
| converterID = ConverterFactory.TXT; |
| } |
| options.put(OUTPUT_FILE_NAME, currentArg); |
| mode = DEFAULT_MODE; |
| continue loop; |
| case DEFAULT_MODE: |
| if (currentArg.equals("-v")) { //$NON-NLS-1$ |
| if (setValidation) { |
| throw new IllegalArgumentException("Duplicate validation flag"); //$NON-NLS-1$ |
| } |
| setValidation = true; |
| options.put(ENABLE_VALIDATION, "true"); //$NON-NLS-1$ |
| mode = DEFAULT_MODE; |
| continue loop; |
| } |
| if (currentArg.equals("-o")) { //$NON-NLS-1$ |
| if (setOutputFile) { |
| throw new IllegalArgumentException("Duplicate output file"); //$NON-NLS-1$ |
| } |
| setOutputFile = true; |
| mode = OUTPUT_FILE_MODE; |
| continue loop; |
| } |
| if (currentArg.equals("-i")) { //$NON-NLS-1$ |
| if (setInputFile) { |
| throw new IllegalArgumentException("Duplicate input file"); //$NON-NLS-1$ |
| } |
| setInputFile = true; |
| mode = INPUT_FILE_MODE; |
| continue loop; |
| } |
| if (currentArg.equals("-r")) { //$NON-NLS-1$ |
| options.put(RECURSIVE, "true"); //$NON-NLS-1$ |
| mode = DEFAULT_MODE; |
| continue loop; |
| } |
| } |
| } |
| final String input = (String) options.get(INPUT_SOURCE); |
| if (input == null) { |
| throw new IllegalArgumentException("An input file or directorty is required"); //$NON-NLS-1$ |
| } |
| if (options.get(RECURSIVE) == null) { |
| if (!input.toLowerCase().endsWith(".xml")) { //$NON-NLS-1$ |
| throw new IllegalArgumentException("Input file must be an xml file"); //$NON-NLS-1$ |
| } |
| } |
| options.put(CONVERTER_ID, String.valueOf(converterID)); |
| } |
| |
| private void dump(final LogDocumentNode documentNode) { |
| final IDOMConverter converter = ConverterFactory.createDOMConverter(Integer.parseInt((String) options |
| .get(Converter.CONVERTER_ID))); |
| converter.dump(CURRENT_FORMAT_VERSION, options, documentNode); |
| } |
| |
| private String extractNameFrom(final String inputFileName) { |
| final int index = inputFileName.lastIndexOf('.'); |
| switch (Integer.parseInt((String) options.get(Converter.CONVERTER_ID))) { |
| case ConverterFactory.TXT: |
| return inputFileName.substring(0, index) + TXT_EXTENSION; |
| case ConverterFactory.HTML: |
| return inputFileName.substring(0, index) + HTML_EXTENSION; |
| default: |
| return inputFileName.substring(0, index) + HTML_EXTENSION; |
| } |
| } |
| |
| public void parse2() throws ParserConfigurationException { |
| final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); |
| final boolean validation = Boolean.valueOf((String) options.get(ENABLE_VALIDATION)).booleanValue(); |
| factory.setValidating(validation); |
| factory.setIgnoringElementContentWhitespace(true); |
| final DocumentBuilder builder = factory.newDocumentBuilder(); |
| |
| final String inputSourceOption = (String) options.get(INPUT_SOURCE); |
| if (options.get(RECURSIVE) != null) { |
| // collect all xml files and iterate over them |
| final File sourceDir = new File(inputSourceOption); |
| if (!sourceDir.exists()) { |
| throw new IllegalArgumentException("Directory " + inputSourceOption + " doesn't exist");//$NON-NLS-1$//$NON-NLS-2$ |
| } |
| if (!sourceDir.isDirectory()) { |
| throw new IllegalArgumentException(inputSourceOption + " must be a directory in recursive mode");//$NON-NLS-1$ |
| } |
| final File[] xmlFiles = getAllFiles(sourceDir, XML_FILTER); |
| for (int i = 0, max = xmlFiles.length; i < max; i++) { |
| final String inputFileName = xmlFiles[i].getAbsolutePath(); |
| final InputSource inputSource = new InputSource(inputFileName); |
| final String outputFileName = extractNameFrom(inputFileName); |
| options.put(INPUT_SOURCE, inputFileName); |
| options.put(OUTPUT_FILE_NAME, outputFileName); |
| try { |
| builder.setErrorHandler(new DefaultHandler() { |
| |
| @Override |
| public void error(final SAXParseException e) throws SAXException { |
| reportError(inputFileName, e); |
| throw e; |
| } |
| }); |
| final Document document = builder.parse(inputSource); |
| final LogDocumentNode documentNode = process(document); |
| dump(documentNode); |
| } |
| catch (final SAXException e) { |
| System.out.println(e); |
| } |
| catch (final IOException e) { |
| // ignore |
| } |
| } |
| } else { |
| // Parse |
| if (inputSourceOption != null) { |
| final InputSource inputSource = new InputSource(inputSourceOption); |
| if (options.get(OUTPUT_FILE_NAME) == null) { |
| options.put(OUTPUT_FILE_NAME, extractNameFrom(inputSourceOption)); |
| } |
| try { |
| builder.setErrorHandler(new DefaultHandler() { |
| |
| @Override |
| public void error(final SAXParseException e) throws SAXException { |
| reportError(inputSourceOption, e); |
| throw e; |
| } |
| }); |
| final Document document = builder.parse(inputSource); |
| final LogDocumentNode documentNode = process(document); |
| dump(documentNode); |
| } |
| catch (final SAXException e) { |
| // ignore |
| } |
| catch (final IOException e) { |
| // ignore |
| } |
| } |
| } |
| } |
| |
| 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(); |
| documentNode.setProblemSummary(summaryNode); |
| summaryNode.numberOfProblems = Integer.parseInt(problemSummaryMap.getNamedItem("problems").getNodeValue()); //$NON-NLS-1$ |
| summaryNode.numberOfErrors = Integer.parseInt(problemSummaryMap.getNamedItem("errors").getNodeValue()); //$NON-NLS-1$ |
| summaryNode.numberOfWarnings = Integer.parseInt(problemSummaryMap.getNamedItem("warnings").getNodeValue()); //$NON-NLS-1$ |
| } |
| |
| 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$ |
| |
| 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(); |
| final boolean isError = "ERROR".equals(severity);//$NON-NLS-1$ |
| problem.isError = isError; |
| problem.id = problemNodeMap.getNamedItem("id").getNodeValue();//$NON-NLS-1$ |
| if (isError) { |
| node.addError(problem); |
| } else if (AbstractDOMConverter.FILTERED_WARNINGS_IDS.contains(problem.id)) { |
| if (AbstractDOMConverter.FORBIDDEN_REFERENCE.equals(problem.id)) { |
| node.addForbiddenWarning(problem); |
| } else { |
| node.addDiscouragedWarning(problem); |
| } |
| } else { |
| node.addOtherWarning(problem); |
| } |
| 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; |
| } |
| |
| void reportError(final String 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()); |
| } |
| } |