/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 Maxence Bernard
*
* muCommander is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* muCommander is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander;
import com.mucommander.commons.file.AbstractFile;
import com.mucommander.commons.file.util.ResourceLoader;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
/**
* This test case checks all XML documents that are embedded with muCommander and ensures they are well-formed.
*
* @author Maxence Bernard
*/
public class XmlResourceTest {
/**
* This test case checks all XML documents that are embedded with muCommander and ensures they are well-formed.
* The test fails when an error is encountered in one of the XML files, even a recoverable one.
* All XML files located in muCommander's base classpath are tested, whether this test case is invoked from the
* application's JAR file or from a regular directory. Archive files found in the application's path will also be
* searched for XML files.
*
* @throws IOException if a file or a folder couldn't be accessed
* @throws SAXException if an error was found in one of the XML documents
* @throws ParserConfigurationException if 'a serious configuration error' occurred in the XML parser
*/
@Test
public void testXmlResources() throws SAXException, IOException, ParserConfigurationException {
testXMLFiles(ResourceLoader.getRootPackageAsFile(XmlResourceTest.class));
}
/////////////////////
// Support methods //
/////////////////////
/**
* Looks for XML files in the specified folder recursively and tests them for well-formedness.
* A <code>org.xml.sax.SAXException</code> is thrown when an error is encountered in one of the XML files,
* even a recoverable one. Any archive contained in the folder will be searched for XML files.
*
* @param folder the folder in which to look for XML files recursively.
* @throws IOException if a file or a folder couldn't be accessed
* @throws SAXException if an error was found in one of the XML documents
* @throws ParserConfigurationException if 'a serious configuration error' occurred in the XML parser
*/
private void testXMLFiles(AbstractFile folder) throws SAXException, IOException, ParserConfigurationException {
AbstractFile children[] = folder.ls();
for (AbstractFile bhild : children) {
if (bhild.isBrowsable())
testXMLFiles(bhild);
else if ("xml".equals(bhild.getExtension()))
testXMLDocument(bhild);
}
}
/**
* Checks the specified XML file that are embedded with muCommander for well-formedness. The test fails
* whenever an error is encountered in one of the XML files, even a recoverable one.
*
* @param file the file to parse and check for well-formedness.
* @throws IOException if there was an error reading the file
* @throws SAXException if an error was found in XML document
* @throws ParserConfigurationException 'a serious configuration error' occurred in the XML parser
*/
private void testXMLDocument(AbstractFile file) throws SAXException, IOException, ParserConfigurationException {
System.out.println("Parsing "+file.getAbsolutePath());
SAXParserFactory.newInstance().newSAXParser().parse(file.getInputStream(), new SAXErrorHandler());
}
/**
* This SAX handler reports errors that are found in the parsed XML document on the standard ouput and throws
* exceptions to the parser.
*/
private static class SAXErrorHandler extends DefaultHandler {
@Override
public void warning(SAXParseException e) throws SAXException {
printSAXError(e, "warning");
throw e;
}
@Override
public void error(SAXParseException e) throws SAXException {
printSAXError(e, "error");
throw e;
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
printSAXError(e, "fatal error");
throw e;
}
private void printSAXError(SAXParseException e, String errorType) {
System.out.println("SAX "+errorType+" at line "+e.getLineNumber()+", column "+e.getColumnNumber()+" : "+e);
}
}
}