Author: germuska
Date: Sat Aug 6 01:12:10 2005
New Revision: 230537
URL: http://svn.apache.org/viewcvs?rev=230537&view=rev
Log:
Support use of global exception handlers in cases when no ActionConfig has yet
been identified, as in with "preprocessing" commands in a custom chain. In the
case when
there is no ActionConfig, the AbstractExceptionHandler will now call a new
method in ModuleConfig which provides similar logic for finding a globally
mapped exception handler
for the given exception class or any of its superclasses.
Modified:
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractExceptionHandler.java
struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java
struts/core/trunk/src/share/org/apache/struts/config/ModuleConfig.java
struts/core/trunk/src/share/org/apache/struts/config/impl/ModuleConfigImpl.java
Modified:
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractExceptionHandler.java
URL:
http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractExceptionHandler.java?rev=230537&r1=230536&r2=230537&view=diff
==============================================================================
---
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractExceptionHandler.java
(original)
+++
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractExceptionHandler.java
Sat Aug 6 01:12:10 2005
@@ -78,6 +78,9 @@
log.debug("See if actionConfig " + actionConfig + " has an
exceptionConfig for " + exception.getClass().getName());
exceptionConfig =
actionConfig.findException(exception.getClass());
+ } else if (moduleConfig != null) {
+ log.debug("No action yet, see if moduleConfig " + moduleConfig + "
has an exceptionConfig " + exception.getClass().getName());
+ exceptionConfig = moduleConfig.findException(exception.getClass());
}
// Handle the exception in the configured manner
Modified: struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java
URL:
http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java?rev=230537&r1=230536&r2=230537&view=diff
==============================================================================
--- struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java
(original)
+++ struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java Sat
Aug 6 01:12:10 2005
@@ -20,6 +20,8 @@
import org.apache.struts.util.RequestUtils;
import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import java.util.ArrayList;
import java.util.HashMap;
@@ -38,6 +40,7 @@
*/
public class ActionConfig extends BaseConfig {
+ private static final Log log = LogFactory.getLog(ActionConfig.class);
// ----------------------------------------------------- Instance Variables
@@ -859,12 +862,14 @@
// Check for a locally defined handler
String name = type.getName();
+ log.debug("findException: look locally for " + name);
config = findExceptionConfig(name);
if (config != null) {
return (config);
}
// Check for a globally defined handler
+ log.debug("findException: look globally for " + name);
config = getModuleConfig().findExceptionConfig(name);
if (config != null) {
return (config);
Modified: struts/core/trunk/src/share/org/apache/struts/config/ModuleConfig.java
URL:
http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/config/ModuleConfig.java?rev=230537&r1=230536&r2=230537&view=diff
==============================================================================
--- struts/core/trunk/src/share/org/apache/struts/config/ModuleConfig.java
(original)
+++ struts/core/trunk/src/share/org/apache/struts/config/ModuleConfig.java Sat
Aug 6 01:12:10 2005
@@ -192,6 +192,18 @@
ExceptionConfig findExceptionConfig(String type);
/**
+ * Perform a recursive search for an ExceptionConfig registered for this
class, or for any
+ * superclass. This should only be used in the case when an
<code>ActionConfig</code>
+ * is not available; otherwise, use
<code>ActionConfig.findException(Class)</code>
+ * to preserve the search order.
+ *
+ * @param type Exception class name to find a configuration for
+ * @see ActionConfig.findException(Class)
+ */
+ ExceptionConfig findException(Class type);
+
+
+ /**
* Return the exception configurations for this module. If there
* are none, a zero-length array is returned.
*/
Modified:
struts/core/trunk/src/share/org/apache/struts/config/impl/ModuleConfigImpl.java
URL:
http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/config/impl/ModuleConfigImpl.java?rev=230537&r1=230536&r2=230537&view=diff
==============================================================================
---
struts/core/trunk/src/share/org/apache/struts/config/impl/ModuleConfigImpl.java
(original)
+++
struts/core/trunk/src/share/org/apache/struts/config/impl/ModuleConfigImpl.java
Sat Aug 6 01:12:10 2005
@@ -347,6 +347,47 @@
}
+
+ /**
+ * <p>Find and return the <code>ExceptionConfig</code> instance defining
+ * how <code>Exceptions</code> of the specified type should be handled.
+ *
+ * <p>In original Struts usage, this was only available in
<code>ActionConfig</code>,
+ * but there are cases when an exception could be thrown before an
<code>ActionConfig</code>
+ * has been identified, where global exception handlers may still be
pertinent.</p>
+ *
+ * <p>TODO: Look for a way to share this logic with
<code>ActionConfig</code>, although
+ * there are subtle differences, and it certainly doesn't seem like it
should be done with
+ * inheritance.</p>
+ *
+ * @param type Exception class for which to find a handler
+ * @since Struts 1.3.0
+ */
+ public ExceptionConfig findException(Class type) {
+
+ // Check through the entire superclass hierarchy as needed
+ ExceptionConfig config = null;
+ while (true) {
+
+ // Check for a locally defined handler
+ String name = type.getName();
+ log.debug("findException: look locally for " + name);
+ config = findExceptionConfig(name);
+ if (config != null) {
+ return (config);
+ }
+
+ // Loop again for our superclass (if any)
+ type = type.getSuperclass();
+ if (type == null) {
+ break;
+ }
+
+ }
+ return (null); // No handler has been configured
+
+ }
+
/**
* Return the exception configurations for this module. If there
* are none, a zero-length array is returned.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]