TILES-224
Merge from trunk to TILES_2_0_X branch.
Now loading an invalid Tiles definition file raises an exception, thanks to a specific error handler.
git-svn-id: https://svn.apache.org/repos/asf/tiles/framework/branches/TILES_2_0_X@585163 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java b/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java
index 3e95c75..25cf2f2 100644
--- a/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java
+++ b/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java
@@ -30,6 +30,7 @@
import org.apache.tiles.definition.DefinitionsFactoryException;
import org.apache.tiles.definition.DefinitionsReader;
import org.xml.sax.Attributes;
+import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import java.io.IOException;
@@ -37,6 +38,7 @@
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
+import org.xml.sax.SAXParseException;
/**
* Reads {@link Definition} objects from
@@ -190,6 +192,7 @@
digester.setValidating(validating);
digester.setNamespaceAware(true);
digester.setUseContextClassLoader(true);
+ digester.setErrorHandler(new ThrowingErrorHandler());
// Register our local copy of the DTDs that we can find
for (int i = 0; i < registrations.length; i += 2) {
@@ -351,4 +354,25 @@
public void addDefinition(Definition definition) {
definitions.put(definition.getName(), definition);
}
+
+ /**
+ * Error Handler that throws every exception it receives.
+ */
+ private static class ThrowingErrorHandler implements ErrorHandler {
+
+ /** {@inheritDoc} */
+ public void warning(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ /** {@inheritDoc} */
+ public void error(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ /** {@inheritDoc} */
+ public void fatalError(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+ }
}
diff --git a/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java b/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java
index 2779cf3..700a63c 100644
--- a/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java
+++ b/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java
@@ -198,16 +198,9 @@
* configuration file with invalid XML.
*/
public void testValidatingParameter() {
- /*
- * For some reason this test doesn't work. It throws a SAXParseException
- * but then the test failes saying "Should've thrown an exception.
- *
- * I don't know why DigesterDefinitionsReader doesn't catch the
- * SAXParseException or how it makes it to the "fail" statement below.
- *
try {
DefinitionsReader reader = new DigesterDefinitionsReader();
- Map params = new HashMap();
+ Map<String, String> params = new HashMap<String, String>();
params.put(DigesterDefinitionsReader.PARSER_VALIDATE_PARAMETER_NAME,
"true");
reader.init(params);
@@ -217,13 +210,15 @@
assertNotNull("Config file not found", configFile);
InputStream source = configFile.openStream();
- Map definitions = reader.read(source);
+ reader.read(source);
fail("Should've thrown an exception.");
} catch (DefinitionsFactoryException e) {
// correct.
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Exception caught, it is OK", e);
+ }
} catch (Exception e) {
fail("Exception reading configuration." + e);
}
- */
}
}