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);
         }
-         */
     }
 }