struts-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From lukaszlen...@apache.org
Subject [struts] 01/01: WW-5003 Drops XWorkException and uses StrutsException instead
Date Thu, 26 Dec 2019 14:01:51 GMT
This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch WW-5003-drops-xwork-exception
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 7dc811337f5f6eab14f14c911bd238a70c01f463
Author: Lukasz Lenart <lukaszlenart@apache.org>
AuthorDate: Thu Dec 26 15:00:03 2019 +0100

    WW-5003 Drops XWorkException and uses StrutsException instead
---
 .../com/opensymphony/xwork2/ActionChainResult.java |   2 +-
 .../com/opensymphony/xwork2/ActionContext.java     |   2 +-
 .../xwork2/DefaultActionInvocation.java            |   8 +-
 .../com/opensymphony/xwork2/UnknownHandler.java    |   9 +-
 .../com/opensymphony/xwork2/XWorkException.java    | 144 ---------------------
 .../xwork2/config/ConfigurationException.java      |  22 ++--
 .../config/providers/XmlConfigurationProvider.java |   4 +-
 .../xwork2/conversion/TypeConversionException.java |  73 +++++++++--
 .../xwork2/conversion/impl/DateConverter.java      |   6 +-
 .../xwork2/conversion/impl/NumberConverter.java    |  19 ++-
 .../conversion/impl/XWorkBasicConverter.java       |  15 +--
 .../xwork2/conversion/impl/XWorkList.java          |   3 +-
 .../interceptor/ScopedModelDrivenInterceptor.java  |   3 +-
 .../annotations/AnnotationWorkflowInterceptor.java |   3 +-
 .../opensymphony/xwork2/ognl/OgnlValueStack.java   |   9 +-
 .../xwork2/ognl/accessor/CompoundRootAccessor.java |   5 +-
 .../ognl/accessor/XWorkListPropertyAccessor.java   |   5 +-
 .../opensymphony/xwork2/util/ClassPathFinder.java  |   4 +-
 .../com/opensymphony/xwork2/util/DomHelper.java    |   7 +-
 .../util/classloader/ReloadingClassLoader.java     |   5 +-
 .../util/reflection/ReflectionException.java       |   4 +-
 .../xwork2/validator/DefaultValidatorFactory.java  |   3 +-
 .../java/org/apache/struts2/StrutsException.java   |  47 ++++++-
 .../apache/struts2/util/StrutsTypeConverter.java   |   2 +-
 .../opensymphony/xwork2/ActionInvocationTest.java  |   8 +-
 .../com/opensymphony/xwork2/ChainResultTest.java   |   3 +-
 .../config/providers/SomeUnknownHandler.java       |   6 +-
 .../conversion/impl/XWorkBasicConverterTest.java   |  12 +-
 .../ExceptionMappingInterceptorTest.java           |  57 ++++----
 .../com/opensymphony/xwork2/ognl/OgnlUtilTest.java |   3 +-
 .../xwork2/ognl/OgnlValueStackTest.java            |   9 +-
 .../DefaultActionValidatorManagerTest.java         |   4 +-
 .../validator/DefaultValidatorFileParserTest.java  |  10 +-
 .../apache/struts2/StrutsExceptionTest.java}       |  29 +++--
 .../providers/xwork-test-exception-mappings.xml    |   2 +-
 .../convention/ConventionUnknownHandler.java       |  11 +-
 .../struts2/convention/DefaultClassFinder.java     |   5 +-
 37 files changed, 252 insertions(+), 311 deletions(-)

diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java b/core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java
index b842897..57ef705 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java
@@ -212,7 +212,7 @@ public class ActionChainResult implements Result {
 
         if (isInChainHistory(finalNamespace, finalActionName, finalMethodName)) {
             addToHistory(finalNamespace, finalActionName, finalMethodName);
-            throw new XWorkException("Infinite recursion detected: " + ActionChainResult.getChainHistory().toString());
+            throw new org.apache.struts2.StrutsException("Infinite recursion detected: " + ActionChainResult.getChainHistory().toString());
         }
 
         if (ActionChainResult.getChainHistory().isEmpty() && invocation != null && invocation.getProxy() != null) {
diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionContext.java b/core/src/main/java/com/opensymphony/xwork2/ActionContext.java
index f5a020c..8fc44b2 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ActionContext.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ActionContext.java
@@ -323,7 +323,7 @@ public class ActionContext implements Serializable {
         if (cont != null) {
             return cont.getInstance(type);
         } else {
-            throw new XWorkException("Cannot find an initialized container for this request.");
+            throw new org.apache.struts2.StrutsException("Cannot find an initialized container for this request.");
         }
     }
 
diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java b/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
index d8f0be4..5143dd7 100644
--- a/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
+++ b/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
@@ -224,7 +224,7 @@ public class DefaultActionInvocation implements ActionInvocation {
                 return objectFactory.buildResult(resultConfig, invocationContext.getContextMap());
             } catch (Exception e) {
                 LOG.error("There was an exception while instantiating the result of type {}", resultConfig.getClassName(), e);
-                throw new XWorkException(e, resultConfig);
+                throw new org.apache.struts2.StrutsException(e, resultConfig);
             }
         } else if (resultCode != null && !Action.NONE.equals(resultCode) && unknownHandlerManager.hasUnknownHandlers()) {
             return unknownHandlerManager.handleUnknownResult(invocationContext, proxy.getActionName(), proxy.getConfig(), resultCode);
@@ -297,9 +297,9 @@ public class DefaultActionInvocation implements ActionInvocation {
         try {
             action = objectFactory.buildAction(proxy.getActionName(), proxy.getNamespace(), proxy.getConfig(), contextMap);
         } catch (InstantiationException e) {
-            throw new XWorkException("Unable to instantiate Action!", e, proxy.getConfig());
+            throw new org.apache.struts2.StrutsException("Unable to instantiate Action!", e, proxy.getConfig());
         } catch (IllegalAccessException e) {
-            throw new XWorkException("Illegal access to constructor, is it public?", e, proxy.getConfig());
+            throw new org.apache.struts2.StrutsException("Illegal access to constructor, is it public?", e, proxy.getConfig());
         } catch (Exception e) {
             String gripe;
 
@@ -314,7 +314,7 @@ public class DefaultActionInvocation implements ActionInvocation {
             }
 
             gripe += (((" -- " + e.getMessage()) != null) ? e.getMessage() : " [no message in exception]");
-            throw new XWorkException(gripe, e, proxy.getConfig());
+            throw new org.apache.struts2.StrutsException(gripe, e, proxy.getConfig());
         }
 
         if (actionEventListener != null) {
diff --git a/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java b/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
index 32cb6d3..5ae3802 100644
--- a/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
+++ b/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
@@ -19,6 +19,7 @@
 package com.opensymphony.xwork2;
 
 import com.opensymphony.xwork2.config.entities.ActionConfig;
+import org.apache.struts2.StrutsException;
 
 /**
  * Handles cases when the result or action is unknown.
@@ -36,9 +37,9 @@ public interface UnknownHandler {
      * @param namespace The namespace
      * @param actionName The action name
      * @return An generated ActionConfig, can return <tt>null</tt>
-     * @throws XWorkException in case of errors
+     * @throws StrutsException in case of errors
      */
-    ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException;
+    ActionConfig handleUnknownAction(String namespace, String actionName) throws StrutsException;
     
     /**
      * Handles the case when a result cannot be found for an action and result code. 
@@ -48,9 +49,9 @@ public interface UnknownHandler {
      * @param actionConfig The action config
      * @param resultCode The returned result code
      * @return A result to be executed, can return <tt>null</tt>
-     * @throws XWorkException in case of errors
+     * @throws StrutsException in case of errors
      */
-    Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException;
+    Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws StrutsException;
     
     /**
      * Handles the case when an action method cannot be found.  This method is responsible both for finding the method and executing it.
diff --git a/core/src/main/java/com/opensymphony/xwork2/XWorkException.java b/core/src/main/java/com/opensymphony/xwork2/XWorkException.java
deleted file mode 100644
index 12bdf80..0000000
--- a/core/src/main/java/com/opensymphony/xwork2/XWorkException.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.opensymphony.xwork2;
-
-import com.opensymphony.xwork2.util.location.Locatable;
-import com.opensymphony.xwork2.util.location.Location;
-import com.opensymphony.xwork2.util.location.LocationUtils;
-
-/**
- * A generic runtime exception that optionally contains Location information 
- *
- * @author Jason Carreira
- */
-public class XWorkException extends RuntimeException implements Locatable {
-
-    private Location location;
-
-
-    /**
-     * Constructs a <code>XWorkException</code> with no detail message.
-     */
-    public XWorkException() {
-    }
-
-    /**
-     * Constructs a <code>XWorkException</code> with the specified
-     * detail message.
-     *
-     * @param s the detail message.
-     */
-    public XWorkException(String s) {
-        this(s, null, null);
-    }
-    
-    /**
-     * Constructs a <code>XWorkException</code> with the specified
-     * detail message and target.
-     *
-     * @param s the detail message.
-     * @param target the target of the exception.
-     */
-    public XWorkException(String s, Object target) {
-        this(s, null, target);
-    }
-
-    /**
-     * Constructs a <code>XWorkException</code> with the root cause
-     *
-     * @param cause The wrapped exception
-     */
-    public XWorkException(Throwable cause) {
-        this(null, cause, null);
-    }
-    
-    /**
-     * Constructs a <code>XWorkException</code> with the root cause and target
-     *
-     * @param cause The wrapped exception
-     * @param target The target of the exception
-     */
-    public XWorkException(Throwable cause, Object target) {
-        this(null, cause, target);
-    }
-
-    /**
-     * Constructs a <code>XWorkException</code> with the specified
-     * detail message and exception cause.
-     *
-     * @param s the detail message.
-     * @param cause the wrapped exception
-     */
-    public XWorkException(String s, Throwable cause) {
-        this(s, cause, null);
-    }
-    
-    
-     /**
-     * Constructs a <code>XWorkException</code> with the specified
-     * detail message, cause, and target
-     *
-     * @param s the detail message.
-     * @param cause The wrapped exception
-     * @param target The target of the exception
-     */
-    public XWorkException(String s, Throwable cause, Object target) {
-        super(s, cause);
-        
-        this.location = LocationUtils.getLocation(target);
-        if (this.location == Location.UNKNOWN) {
-            this.location = LocationUtils.getLocation(cause);
-        }
-    }
-
-    /**
-     * Gets the location of the error, if available
-     *
-     * @return the location, <tt>null</tt> if not available 
-     */
-    public Location getLocation() {
-        return this.location;
-    }
-    
-    
-    /**
-     * Returns a short description of this throwable object, including the 
-     * location. If no detailed message is available, it will use the message
-     * of the underlying exception if available.
-     *
-     * @return a string representation of this <code>Throwable</code>.
-     */
-    @Override
-    public String toString() {
-        String msg = getMessage();
-        if (msg == null && getCause() != null) {
-            msg = getCause().getMessage();
-        }
-
-        if (location != null) {
-            if (msg != null) {
-                return msg + " - " + location.toString();
-            } else {
-                return location.toString();
-            }
-        } else {
-            return msg;
-        }
-    }
-}
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationException.java b/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationException.java
index a150a0a..b9c3424 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationException.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationException.java
@@ -18,15 +18,14 @@
  */
 package com.opensymphony.xwork2.config;
 
-import com.opensymphony.xwork2.XWorkException;
-
+import org.apache.struts2.StrutsException;
 
 /**
  * ConfigurationException
  *
  * @author Jason Carreira
  */
-public class ConfigurationException extends XWorkException {
+public class ConfigurationException extends StrutsException {
 
     /**
      * Constructs a <code>ConfigurationException</code> with no detail message.
@@ -43,12 +42,12 @@ public class ConfigurationException extends XWorkException {
     public ConfigurationException(String s) {
         super(s);
     }
-    
+
     /**
      * Constructs a <code>ConfigurationException</code> with the specified
      * detail message.
      *
-     * @param s the detail message.
+     * @param s      the detail message.
      * @param target the target object
      */
     public ConfigurationException(String s, Object target) {
@@ -63,10 +62,11 @@ public class ConfigurationException extends XWorkException {
     public ConfigurationException(Throwable cause) {
         super(cause);
     }
-    
+
     /**
      * Constructs a <code>ConfigurationException</code> with no detail message.
-     * @param cause the cause of the exception
+     *
+     * @param cause  the cause of the exception
      * @param target the target object
      */
     public ConfigurationException(Throwable cause, Object target) {
@@ -77,19 +77,19 @@ public class ConfigurationException extends XWorkException {
      * Constructs a <code>ConfigurationException</code> with the specified
      * detail message.
      *
-     * @param s the detail message.
+     * @param s     the detail message.
      * @param cause the cause of the exception
      */
     public ConfigurationException(String s, Throwable cause) {
         super(s, cause);
     }
-    
+
     /**
      * Constructs a <code>ConfigurationException</code> with the specified
      * detail message.
      *
-     * @param s the detail message.
-     * @param cause the cause of the exception
+     * @param s      the detail message.
+     * @param cause  the cause of the exception
      * @param target the target object
      */
     public ConfigurationException(String s, Throwable cause, Object target) {
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 1613ae2..24d388e 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -22,7 +22,6 @@ import com.opensymphony.xwork2.Action;
 import com.opensymphony.xwork2.FileManager;
 import com.opensymphony.xwork2.FileManagerFactory;
 import com.opensymphony.xwork2.ObjectFactory;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.config.Configuration;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.config.ConfigurationProvider;
@@ -52,6 +51,7 @@ import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.struts2.StrutsException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -1080,7 +1080,7 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
 
                     docs.add(DomHelper.parse(in, dtdMappings));
                     loadedFileUrls.add(url.toString());
-                } catch (XWorkException e) {
+                } catch (StrutsException e) {
                     if (includeElement != null) {
                         throw new ConfigurationException("Unable to load " + url, e, includeElement);
                     } else {
diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/TypeConversionException.java b/core/src/main/java/com/opensymphony/xwork2/conversion/TypeConversionException.java
index 5e8acdf..469f5a1 100644
--- a/core/src/main/java/com/opensymphony/xwork2/conversion/TypeConversionException.java
+++ b/core/src/main/java/com/opensymphony/xwork2/conversion/TypeConversionException.java
@@ -18,7 +18,9 @@
  */
 package com.opensymphony.xwork2.conversion;
 
-import com.opensymphony.xwork2.XWorkException;
+import com.opensymphony.xwork2.util.location.Locatable;
+import com.opensymphony.xwork2.util.location.Location;
+import com.opensymphony.xwork2.util.location.LocationUtils;
 
 
 /**
@@ -27,40 +29,93 @@ import com.opensymphony.xwork2.XWorkException;
  * @author Jason Carreira
  *         Created Oct 3, 2003 12:18:33 AM
  */
-public class TypeConversionException extends XWorkException {
+public class TypeConversionException extends RuntimeException implements Locatable {
+
+    private Location location;
 
     /**
-     * Constructs a <code>XWorkException</code> with no detail message.
+     * Constructs a <code>StrutsException</code> with no detail message.
      */
     public TypeConversionException() {
     }
 
     /**
-     * Constructs a <code>XWorkException</code> with the specified
+     * Constructs a <code>StrutsException</code> with the specified
      * detail message.
      *
      * @param s the detail message.
      */
     public TypeConversionException(String s) {
-        super(s);
+        this(s, null, null);
     }
 
     /**
-     * Constructs a <code>XWorkException</code> with no detail  message.
+     * Constructs a <code>StrutsException</code> with no detail  message.
      * @param cause the cause
      */
     public TypeConversionException(Throwable cause) {
-        super(cause);
+        this(null, cause, null);
     }
 
     /**
-     * Constructs a <code>XWorkException</code> with the specified
+     * Constructs a <code>StrutsException</code> with the specified
      * detail message.
      *
      * @param s the detail message.
      * @param cause the cause
      */
     public TypeConversionException(String s, Throwable cause) {
-        super(s, cause);
+        this(s, cause, null);
+    }
+
+    /**
+    * Constructs a <code>StrutsException</code> with the specified
+    * detail message, cause, and target
+    *
+    * @param s the detail message.
+    * @param cause The wrapped exception
+    * @param target The target of the exception
+    */
+   public TypeConversionException(String s, Throwable cause, Object target) {
+       super(s, cause);
+
+       this.location = LocationUtils.getLocation(target);
+       if (this.location == Location.UNKNOWN) {
+           this.location = LocationUtils.getLocation(cause);
+       }
+   }
+
+    /**
+     * Gets the location of the error, if available
+     *
+     * @return the location, <tt>null</tt> if not available
+     */
+    public Location getLocation() {
+        return this.location;
+    }
+
+    /**
+     * Returns a short description of this throwable object, including the
+     * location. If no detailed message is available, it will use the message
+     * of the underlying exception if available.
+     *
+     * @return a string representation of this <code>Throwable</code>.
+     */
+    @Override
+    public String toString() {
+        String msg = getMessage();
+        if (msg == null && getCause() != null) {
+            msg = getCause().getMessage();
+        }
+
+        if (location != null) {
+            if (msg != null) {
+                return msg + " - " + location.toString();
+            } else {
+                return location.toString();
+            }
+        } else {
+            return msg;
+        }
     }
 }
diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DateConverter.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DateConverter.java
index bc812d1..76156aa 100644
--- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DateConverter.java
+++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DateConverter.java
@@ -18,8 +18,6 @@
  */
 package com.opensymphony.xwork2.conversion.impl;
 
-import com.opensymphony.xwork2.XWorkException;
-
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Member;
 import java.text.DateFormat;
@@ -90,11 +88,11 @@ public class DateConverter extends DefaultTypeConverter {
                         Constructor constructor = toType.getConstructor(new Class[]{long.class});
                         return constructor.newInstance(new Object[]{Long.valueOf(result.getTime())});
                     } catch (Exception e) {
-                        throw new XWorkException("Couldn't create class " + toType + " using default (long) constructor", e);
+                        throw new org.apache.struts2.StrutsException("Couldn't create class " + toType + " using default (long) constructor", e);
                     }
                 }
             } catch (ParseException e) {
-                throw new XWorkException("Could not parse date", e);
+                throw new org.apache.struts2.StrutsException("Could not parse date", e);
             }
         } else if (Date.class.isAssignableFrom(value.getClass())) {
             result = (Date) value;
diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/NumberConverter.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/NumberConverter.java
index ec7c29b..f21b1d6 100644
--- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/NumberConverter.java
+++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/NumberConverter.java
@@ -18,7 +18,6 @@
  */
 package com.opensymphony.xwork2.conversion.impl;
 
-import com.opensymphony.xwork2.XWorkException;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
@@ -51,7 +50,7 @@ public class NumberConverter extends DefaultTypeConverter {
                 Object convertedValue = super.convertValue(context, value, toType);
 
                 if (!isInRange((Number) convertedValue, stringValue, toType))
-                    throw new XWorkException("Overflow or underflow casting: \"" + stringValue + "\" into class " + convertedValue.getClass().getName());
+                    throw new org.apache.struts2.StrutsException("Overflow or underflow casting: \"" + stringValue + "\" into class " + convertedValue.getClass().getName());
 
                 return convertedValue;
             } else {
@@ -67,11 +66,11 @@ public class NumberConverter extends DefaultTypeConverter {
                 Number number = numFormat.parse(stringValue, parsePos);
 
                 if (parsePos.getIndex() != stringValue.length()) {
-                    throw new XWorkException("Unparseable number: \"" + stringValue + "\" at position "
-                            + parsePos.getIndex());
+                    throw new org.apache.struts2.StrutsException("Unparseable number: \"" + stringValue + "\" at position "
+                        + parsePos.getIndex());
                 } else {
                     if (!isInRange(number, stringValue, toType))
-                        throw new XWorkException("Overflow or underflow casting: \"" + stringValue + "\" into class " + number.getClass().getName());
+                        throw new org.apache.struts2.StrutsException("Overflow or underflow casting: \"" + stringValue + "\" into class " + number.getClass().getName());
 
                     value = super.convertValue(context, number, toType);
                 }
@@ -103,7 +102,7 @@ public class NumberConverter extends DefaultTypeConverter {
         Number number = format.parse(stringValue, parsePosition);
 
         if (parsePosition.getIndex() != stringValue.length()) {
-            throw new XWorkException("Unparseable number: \"" + stringValue + "\" at position " + parsePosition.getIndex());
+            throw new org.apache.struts2.StrutsException("Unparseable number: \"" + stringValue + "\" at position " + parsePosition.getIndex());
         }
 
         return number;
@@ -123,11 +122,11 @@ public class NumberConverter extends DefaultTypeConverter {
         Number number = format.parse(stringValue, parsePosition);
 
         if (parsePosition.getIndex() != stringValue.length()) {
-            throw new XWorkException("Unparseable number: \"" + stringValue + "\" at position " + parsePosition.getIndex());
+            throw new org.apache.struts2.StrutsException("Unparseable number: \"" + stringValue + "\" at position " + parsePosition.getIndex());
         }
 
         if (!isInRange(number, stringValue, Double.class)) {
-            throw new XWorkException("Overflow or underflow converting: \"" + stringValue + "\" into class " + number.getClass().getName());
+            throw new org.apache.struts2.StrutsException("Overflow or underflow converting: \"" + stringValue + "\" into class " + number.getClass().getName());
         }
 
         if (number != null) {
@@ -151,11 +150,11 @@ public class NumberConverter extends DefaultTypeConverter {
         Number number = format.parse(stringValue, parsePosition);
 
         if (parsePosition.getIndex() != stringValue.length()) {
-            throw new XWorkException("Unparseable number: \"" + stringValue + "\" at position " + parsePosition.getIndex());
+            throw new org.apache.struts2.StrutsException("Unparseable number: \"" + stringValue + "\" at position " + parsePosition.getIndex());
         }
 
         if (!isInRange(number, stringValue, Float.class)) {
-            throw new XWorkException("Overflow or underflow converting: \"" + stringValue + "\" into class " + number.getClass().getName());
+            throw new org.apache.struts2.StrutsException("Overflow or underflow converting: \"" + stringValue + "\" into class " + number.getClass().getName());
         }
 
         if (number != null) {
diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverter.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverter.java
index 973c160..83059ba 100644
--- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverter.java
+++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverter.java
@@ -18,7 +18,6 @@
  */
 package com.opensymphony.xwork2.conversion.impl;
 
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.conversion.TypeConverter;
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.inject.Inject;
@@ -130,7 +129,7 @@ public class XWorkBasicConverter extends DefaultTypeConverter {
             }
 
             if (result == null && value != null && !"".equals(value)) {
-                throw new XWorkException("Cannot create type " + toType + " from value " + value);
+                throw new org.apache.struts2.StrutsException("Cannot create type " + toType + " from value " + value);
             }
         }
 
@@ -170,7 +169,7 @@ public class XWorkBasicConverter extends DefaultTypeConverter {
             try {
                 clazz = Class.forName((String) value);
             } catch (ClassNotFoundException e) {
-                throw new XWorkException(e.getLocalizedMessage(), e);
+                throw new org.apache.struts2.StrutsException(e.getLocalizedMessage(), e);
             }
         }
         return clazz;
@@ -179,7 +178,7 @@ public class XWorkBasicConverter extends DefaultTypeConverter {
     private Object doConvertToCollection(Map<String, Object> context, Object o, Member member, String prop, Object value, Class toType) {
         TypeConverter converter = container.getInstance(CollectionConverter.class);
         if (converter == null) {
-            throw new XWorkException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_COLLECTION);
+            throw new org.apache.struts2.StrutsException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_COLLECTION);
         }
         return converter.convertValue(context, o, member, prop, value, toType);
     }
@@ -187,7 +186,7 @@ public class XWorkBasicConverter extends DefaultTypeConverter {
     private Object doConvertToArray(Map<String, Object> context, Object o, Member member, String prop, Object value, Class toType) {
         TypeConverter converter = container.getInstance(ArrayConverter.class);
         if (converter == null) {
-            throw new XWorkException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_ARRAY);
+            throw new org.apache.struts2.StrutsException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_ARRAY);
         }
         return converter.convertValue(context, o, member, prop, value, toType);
     }
@@ -195,7 +194,7 @@ public class XWorkBasicConverter extends DefaultTypeConverter {
     private Object doConvertToDate(Map<String, Object> context, Object value, Class toType) {
         TypeConverter converter = container.getInstance(DateConverter.class);
         if (converter == null) {
-            throw new XWorkException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_DATE);
+            throw new org.apache.struts2.StrutsException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_DATE);
         }
         return converter.convertValue(context, null, null, null, value, toType);
     }
@@ -203,7 +202,7 @@ public class XWorkBasicConverter extends DefaultTypeConverter {
     private Object doConvertToNumber(Map<String, Object> context, Object value, Class toType) {
         TypeConverter converter = container.getInstance(NumberConverter.class);
         if (converter == null) {
-            throw new XWorkException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_NUMBER);
+            throw new org.apache.struts2.StrutsException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_NUMBER);
         }
         return converter.convertValue(context, null, null, null, value, toType);
     }
@@ -211,7 +210,7 @@ public class XWorkBasicConverter extends DefaultTypeConverter {
     private Object doConvertToString(Map<String, Object> context, Object value) {
         TypeConverter converter = container.getInstance(StringConverter.class);
         if (converter == null) {
-            throw new XWorkException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_STRING);
+            throw new org.apache.struts2.StrutsException("TypeConverter with name [#0] must be registered first!", StrutsConstants.STRUTS_CONVERTER_STRING);
         }
         return converter.convertValue(context, null, null, null, value, null);
     }
diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkList.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkList.java
index 38da102..c59af6e 100644
--- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkList.java
+++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkList.java
@@ -20,7 +20,6 @@ package com.opensymphony.xwork2.conversion.impl;
 
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ObjectFactory;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.conversion.TypeConverter;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -188,7 +187,7 @@ public class XWorkList extends ArrayList {
             try {
                 this.add(getObjectFactory().buildBean(clazz, ActionContext.getContext().getContextMap()));
             } catch (Exception e) {
-                throw new XWorkException(e);
+                throw new org.apache.struts2.StrutsException(e);
             }
         }
 
diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java
index 8519aa2..cd4d3df 100644
--- a/core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java
+++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java
@@ -21,7 +21,6 @@ package com.opensymphony.xwork2.interceptor;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ObjectFactory;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.inject.Inject;
 
@@ -127,7 +126,7 @@ public class ScopedModelDrivenInterceptor extends AbstractInterceptor {
                         Class cls = method.getReturnType();
                         cName = cls.getName();
                     } catch (NoSuchMethodException e) {
-                        throw new XWorkException("The " + GET_MODEL + "() is not defined in action " + action.getClass() + "", config);
+                        throw new org.apache.struts2.StrutsException("The " + GET_MODEL + "() is not defined in action " + action.getClass() + "", config);
                     }
                 }
                 String modelName = name;
diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java
index 4cbfc7a..57851b5 100644
--- a/core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java
+++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java
@@ -19,7 +19,6 @@
 package com.opensymphony.xwork2.interceptor.annotations;
 
 import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 import com.opensymphony.xwork2.interceptor.PreResultListener;
 import org.apache.commons.lang3.reflect.MethodUtils;
@@ -191,7 +190,7 @@ public class AnnotationWorkflowInterceptor extends AbstractInterceptor implement
                 try {
                     MethodUtils.invokeMethod(action, true, m.getName());
                 } catch (Exception e) {
-                    throw new XWorkException(e);
+                    throw new org.apache.struts2.StrutsException(e);
                 }
             }
         }
diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
index 9fc7868..b45cd87 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
@@ -20,7 +20,6 @@ package com.opensymphony.xwork2.ognl;
 
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.TextProvider;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.inject.Inject;
@@ -196,7 +195,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
             String message = ErrorMessageBuilder.create()
                     .errorSettingExpressionWithValue(expr, value)
                     .build();
-            throw new XWorkException(message, re);
+            throw new org.apache.struts2.StrutsException(message, re);
         } else {
             LOG.warn("Error setting value [{}] with expression [{}]", value, expr, re);
         }
@@ -213,7 +212,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
     	}
     	
         if (throwExceptionOnFailure) {
-            throw new XWorkException(msg, e);
+            throw new org.apache.struts2.StrutsException(msg, e);
         }
     }
 
@@ -261,7 +260,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
         logLookupFailure(expr, e);
 
         if (throwExceptionOnFailure)
-            throw new XWorkException(e);
+            throw new org.apache.struts2.StrutsException(e);
 
         return findInContext(expr);
     }
@@ -331,7 +330,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
                 LOG.warn("Could not find property [{}]!", expr, e);
             }
             if (throwExceptionOnFailure) {
-                throw new XWorkException(e);
+                throw new org.apache.struts2.StrutsException(e);
             }
         }
         return ret;
diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
index 811b008..ee4c137 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
@@ -18,7 +18,6 @@
  */
 package com.opensymphony.xwork2.ognl.accessor;
 
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.ognl.OgnlValueStack;
 import com.opensymphony.xwork2.util.CompoundRoot;
@@ -111,7 +110,7 @@ public class CompoundRootAccessor implements PropertyAccessor, MethodAccessor, C
             final String msg = format("No object in the CompoundRoot has a publicly accessible property named '%s' " +
                     "(no setter could be found).", name);
             if (reportError) {
-                throw new XWorkException(msg);
+                throw new org.apache.struts2.StrutsException(msg);
             } else {
                 LOG.warn(msg);
             }
@@ -146,7 +145,7 @@ public class CompoundRootAccessor implements PropertyAccessor, MethodAccessor, C
                 } catch (OgnlException e) {
                     if (e.getReason() != null) {
                         final String msg = "Caught an Ognl exception while getting property " + name;
-                        throw new XWorkException(msg, e);
+                        throw new org.apache.struts2.StrutsException(msg, e);
                     }
                 } catch (IntrospectionException e) {
                     // this is OK if this happens, we'll just keep trying the next
diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkListPropertyAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkListPropertyAccessor.java
index 242d097..3d492f9 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkListPropertyAccessor.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkListPropertyAccessor.java
@@ -19,7 +19,6 @@
 package com.opensymphony.xwork2.ognl.accessor;
 
 import com.opensymphony.xwork2.ObjectFactory;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.conversion.ObjectTypeDeterminer;
 import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
 import com.opensymphony.xwork2.inject.Inject;
@@ -121,7 +120,7 @@ public class XWorkListPropertyAccessor extends ListPropertyAccessor {
                 try {
                     list.add(index, result = objectFactory.buildBean(beanClass, context));
                 } catch (Exception exc) {
-                    throw new XWorkException(exc);
+                    throw new org.apache.struts2.StrutsException(exc);
                 }
                 return result;
             } else if (list.get(index) == null) {
@@ -129,7 +128,7 @@ public class XWorkListPropertyAccessor extends ListPropertyAccessor {
                 try {
                     list.set(index, result = objectFactory.buildBean(beanClass, context));
                 } catch (Exception exc) {
-                    throw new XWorkException(exc);
+                    throw new org.apache.struts2.StrutsException(exc);
                 }
                 return result;
             }
diff --git a/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java b/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java
index 2bcbfb0..76066a7 100644
--- a/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java
+++ b/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java
@@ -18,8 +18,6 @@
  */
 package com.opensymphony.xwork2.util;
 
-import com.opensymphony.xwork2.XWorkException;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -178,7 +176,7 @@ public class ClassPathFinder {
             try {
                 urls = Collections.list(loader.getResources("")).toArray(new URL[0]);
             } catch (IOException e) {
-                throw new XWorkException("unable to get ClassLoader URLs", e);
+                throw new org.apache.struts2.StrutsException("unable to get ClassLoader URLs", e);
             }
         }
 
diff --git a/core/src/main/java/com/opensymphony/xwork2/util/DomHelper.java b/core/src/main/java/com/opensymphony/xwork2/util/DomHelper.java
index b818764..b7745b9 100644
--- a/core/src/main/java/com/opensymphony/xwork2/util/DomHelper.java
+++ b/core/src/main/java/com/opensymphony/xwork2/util/DomHelper.java
@@ -20,7 +20,6 @@ package com.opensymphony.xwork2.util;
 
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ObjectFactory;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.util.location.Location;
 import com.opensymphony.xwork2.util.location.LocationAttributes;
 import org.apache.logging.log4j.LogManager;
@@ -105,7 +104,7 @@ public class DomHelper {
         try {
             parser = factory.newSAXParser();
         } catch (Exception ex) {
-            throw new XWorkException("Unable to create SAX parser", ex);
+            throw new org.apache.struts2.StrutsException("Unable to create SAX parser", ex);
         }
         
         
@@ -117,7 +116,7 @@ public class DomHelper {
         try {
             parser.parse(inputSource, new StartHandler(locationHandler, dtdMappings));
         } catch (Exception ex) {
-            throw new XWorkException(ex);
+            throw new org.apache.struts2.StrutsException(ex);
         }
         
         return builder.getDocument();
@@ -212,7 +211,7 @@ public class DomHelper {
                 }
                 handler.setResult(this.result);
             } catch (javax.xml.transform.TransformerException local) {
-                throw new XWorkException("Fatal-Error: Unable to get transformer handler", local);
+                throw new org.apache.struts2.StrutsException("Fatal-Error: Unable to get transformer handler", local);
             }
         }
     
diff --git a/core/src/main/java/com/opensymphony/xwork2/util/classloader/ReloadingClassLoader.java b/core/src/main/java/com/opensymphony/xwork2/util/classloader/ReloadingClassLoader.java
index c1a83e8..cfecf58 100644
--- a/core/src/main/java/com/opensymphony/xwork2/util/classloader/ReloadingClassLoader.java
+++ b/core/src/main/java/com/opensymphony/xwork2/util/classloader/ReloadingClassLoader.java
@@ -21,7 +21,6 @@ package com.opensymphony.xwork2.util.classloader;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.FileManager;
 import com.opensymphony.xwork2.FileManagerFactory;
-import com.opensymphony.xwork2.XWorkException;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -66,10 +65,10 @@ public class ReloadingClassLoader extends ClassLoader {
             if (root != null) {
                 stores = new ResourceStore[]{new FileResourceStore(new File(root.toURI()))};
             } else {
-                throw new XWorkException("Unable to start the reloadable class loader, consider setting 'struts.convention.classes.reload' to false");
+                throw new org.apache.struts2.StrutsException("Unable to start the reloadable class loader, consider setting 'struts.convention.classes.reload' to false");
             }
         } catch (URISyntaxException e) {
-            throw new XWorkException("Unable to start the reloadable class loader, consider setting 'struts.convention.classes.reload' to false", e);
+            throw new org.apache.struts2.StrutsException("Unable to start the reloadable class loader, consider setting 'struts.convention.classes.reload' to false", e);
         } catch (RuntimeException e) {
             // see WW-3121
             // TODO: Fix this for a reloading mechanism to be marked as stable
diff --git a/core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionException.java b/core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionException.java
index a1159bd..9809d80 100644
--- a/core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionException.java
+++ b/core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionException.java
@@ -18,9 +18,9 @@
  */
 package com.opensymphony.xwork2.util.reflection;
 
-import com.opensymphony.xwork2.XWorkException;
+import org.apache.struts2.StrutsException;
 
-public class ReflectionException extends XWorkException {
+public class ReflectionException extends StrutsException {
 
     public ReflectionException() {
         // TODO Auto-generated constructor stub
diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFactory.java b/core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFactory.java
index ca11235..73a193d 100644
--- a/core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFactory.java
+++ b/core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFactory.java
@@ -20,7 +20,6 @@ package com.opensymphony.xwork2.validator;
 
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ObjectFactory;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.inject.Initializable;
 import com.opensymphony.xwork2.inject.Inject;
@@ -75,7 +74,7 @@ public class DefaultValidatorFactory implements ValidatorFactory, Initializable
             validator = objectFactory.buildValidator(className, cfg.getParams(), ActionContext.getContext().getContextMap());
         } catch (Exception e) {
             final String msg = "There was a problem creating a Validator of type " + className + " : caused by " + e.getMessage();
-            throw new XWorkException(msg, e, cfg);
+            throw new org.apache.struts2.StrutsException(msg, e, cfg);
         }
 
         // set other configured properties
diff --git a/core/src/main/java/org/apache/struts2/StrutsException.java b/core/src/main/java/org/apache/struts2/StrutsException.java
index 4cff275..a9a5f02 100644
--- a/core/src/main/java/org/apache/struts2/StrutsException.java
+++ b/core/src/main/java/org/apache/struts2/StrutsException.java
@@ -18,15 +18,17 @@
  */
 package org.apache.struts2;
 
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.util.location.Locatable;
+import com.opensymphony.xwork2.util.location.Location;
+import com.opensymphony.xwork2.util.location.LocationUtils;
 
 /**
  * A generic runtime exception that optionally contains Location information
  */
-public class StrutsException extends XWorkException implements Locatable {
+public class StrutsException extends RuntimeException implements Locatable {
 
     private static final long serialVersionUID = 888724366243600135L;
+    private Location location;
 
 
     /**
@@ -96,6 +98,45 @@ public class StrutsException extends XWorkException implements Locatable {
      * @param target The target of the exception
      */
     public StrutsException(String s, Throwable cause, Object target) {
-        super(s, cause, target);
+        super(s, cause);
+
+        this.location = LocationUtils.getLocation(target);
+        if (this.location == Location.UNKNOWN) {
+            this.location = LocationUtils.getLocation(cause);
+        }
+    }
+
+    /**
+     * Gets the location of the error, if available
+     *
+     * @return the location, <tt>null</tt> if not available
+     */
+    public Location getLocation() {
+        return this.location;
+    }
+
+    /**
+     * Returns a short description of this throwable object, including the
+     * location. If no detailed message is available, it will use the message
+     * of the underlying exception if available.
+     *
+     * @return a string representation of this <code>Throwable</code>.
+     */
+    @Override
+    public String toString() {
+        String msg = getMessage();
+        if (msg == null && getCause() != null) {
+            msg = getCause().getMessage();
+        }
+
+        if (location != null) {
+            if (msg != null) {
+                return msg + " - " + location.toString();
+            } else {
+                return location.toString();
+            }
+        } else {
+            return msg;
+        }
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/apache/struts2/util/StrutsTypeConverter.java b/core/src/main/java/org/apache/struts2/util/StrutsTypeConverter.java
index d9c887b..655eeab 100644
--- a/core/src/main/java/org/apache/struts2/util/StrutsTypeConverter.java
+++ b/core/src/main/java/org/apache/struts2/util/StrutsTypeConverter.java
@@ -38,7 +38,7 @@ import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
  * failed. By default it just ask its super class (Ognl's DefaultTypeConverter) to do the conversion.
  * </p>
  *
- * <p> To allow the framework to recognize that a conversion error has occurred, throw an XWorkException or
+ * <p> To allow the framework to recognize that a conversion error has occurred, throw an StrutsException or
  * preferable a TypeConversionException.
  * </p>
  * <!-- END SNIPPET: javadoc -->
diff --git a/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java b/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
index 55956e3..ce93c3f 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
@@ -20,12 +20,12 @@ package com.opensymphony.xwork2;
 
 import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
+import org.apache.struts2.StrutsException;
 import org.apache.struts2.dispatcher.HttpParameters;
 import com.opensymphony.xwork2.mock.MockResult;
 
 import java.util.HashMap;
 
-
 /**
  * @author $Author$
  * @version $Revision$
@@ -51,12 +51,12 @@ public class ActionInvocationTest extends XWorkTestCase {
     public void testCommandInvocationUnknownHandler() throws Exception {
 
         UnknownHandler unknownHandler = new UnknownHandler() {
-			public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException {
+			public ActionConfig handleUnknownAction(String namespace, String actionName) throws StrutsException {
                 return new ActionConfig.Builder("test", actionName, ActionSupport.class.getName())
                         .addAllowedMethod("unknownmethod")
                         .build();
             }
-			public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException {
+			public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws StrutsException {
 				return new MockResult();
 			}
 			public Object handleUnknownActionMethod(Object action, String methodName) {
@@ -84,7 +84,7 @@ public class ActionInvocationTest extends XWorkTestCase {
     public void testResultReturnInvocationAndWired() throws Exception {
         ActionProxy baseActionProxy = actionProxyFactory.createActionProxy(
                 "baz", "resultAction", null, null);
-        assertEquals(null, baseActionProxy.execute());
+        assertNull(baseActionProxy.execute());
         assertTrue(SimpleAction.resultCalled);
     }
 
diff --git a/core/src/test/java/com/opensymphony/xwork2/ChainResultTest.java b/core/src/test/java/com/opensymphony/xwork2/ChainResultTest.java
index 9c2208e..2d6ac54 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ChainResultTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ChainResultTest.java
@@ -22,6 +22,7 @@ import com.mockobjects.dynamic.Mock;
 import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
 import com.opensymphony.xwork2.util.ValueStack;
 import junit.framework.TestCase;
+import org.apache.struts2.StrutsException;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -113,7 +114,7 @@ public class ChainResultTest extends XWorkTestCase {
         try {
             proxy.execute();
             fail("did not detected repeated chain to an action");
-        } catch (XWorkException e) {
+        } catch (StrutsException e) {
             assertTrue(true);
         }
     }
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
index 1f1b006..865bcde 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
@@ -21,14 +21,14 @@ package com.opensymphony.xwork2.config.providers;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.Result;
 import com.opensymphony.xwork2.UnknownHandler;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
+import org.apache.struts2.StrutsException;
 
 public class SomeUnknownHandler implements UnknownHandler{
     private ActionConfig actionConfig;
     private String actionMethodResult;
 
-    public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException {
+    public ActionConfig handleUnknownAction(String namespace, String actionName) throws StrutsException {
         return actionConfig;
     }
 
@@ -37,7 +37,7 @@ public class SomeUnknownHandler implements UnknownHandler{
     }
 
     public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig,
-            String resultCode) throws XWorkException {
+            String resultCode) throws StrutsException {
         return null;
     }
 
diff --git a/core/src/test/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverterTest.java b/core/src/test/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverterTest.java
index f8c3e7e..e171261 100644
--- a/core/src/test/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverterTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/conversion/impl/XWorkBasicConverterTest.java
@@ -19,9 +19,9 @@
 package com.opensymphony.xwork2.conversion.impl;
 
 import com.opensymphony.xwork2.ActionContext;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.XWorkTestCase;
 import com.opensymphony.xwork2.test.annotations.Person;
+import org.apache.struts2.StrutsException;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -45,15 +45,15 @@ public class XWorkBasicConverterTest extends XWorkTestCase {
 
     public void testDateConversionWithEmptyValue() {
         Object convertedObject = basicConverter.convertValue(new HashMap<String, Object>(), null, null, null, "", Date.class);
-        // we must not get XWorkException as that will caused a conversion error
+        // we must not get StrutsException as that will caused a conversion error
         assertNull(convertedObject);
     }
 
     public void testDateConversionWithInvalidValue() throws Exception {
         try {
             basicConverter.convertValue(new HashMap<String, Object>(), null, null, null, "asdsd", Date.class);
-            fail("XWorkException expected - conversion error occurred");
-        } catch (XWorkException e) {
+            fail("StrutsException expected - conversion error occurred");
+        } catch (StrutsException e) {
             // we MUST get this exception as this is a conversion error
         }
     }
@@ -119,7 +119,7 @@ public class XWorkBasicConverterTest extends XWorkTestCase {
 
     public void testEmptyArrayConversion() throws Exception {
         Object convertedObject = basicConverter.convertValue(new HashMap<String, Object>(), null, null, null, new Object[]{}, Object[].class);
-        // we must not get XWorkException as that will caused a conversion error
+        // we must not get StrutsException as that will caused a conversion error
         assertEquals(Object[].class, convertedObject.getClass());
         Object[] obj = (Object[]) convertedObject;
         assertEquals(0, obj.length);
@@ -127,7 +127,7 @@ public class XWorkBasicConverterTest extends XWorkTestCase {
 
     public void testNullArrayConversion() throws Exception {
         Object convertedObject = basicConverter.convertValue(new HashMap<String, Object>(), null, null, null, null, Object[].class);
-        // we must not get XWorkException as that will caused a conversion error
+        // we must not get StrutsException as that will caused a conversion error
         assertNull(convertedObject);
     }
 
diff --git a/core/src/test/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptorTest.java b/core/src/test/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptorTest.java
index 6ea92db..8c759d5 100644
--- a/core/src/test/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptorTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptorTest.java
@@ -24,6 +24,7 @@ import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
 import com.opensymphony.xwork2.util.ValueStack;
 import com.opensymphony.xwork2.validator.ValidationException;
+import org.apache.struts2.StrutsException;
 
 import java.util.HashMap;
 
@@ -44,9 +45,9 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         this.setUpWithExceptionMappings();
 
         Mock action = new Mock(Action.class);
-        Exception exception = new XWorkException("test");
+        Exception exception = new StrutsException("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
         String result = interceptor.intercept(invocation);
         assertNotNull(stack.findValue("exception"));
         assertEquals(stack.findValue("exception"), exception);
@@ -61,7 +62,7 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         Mock action = new Mock(Action.class);
         Exception exception = new ValidationException("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
         String result = interceptor.intercept(invocation);
         assertNotNull(stack.findValue("exception"));
         assertEquals(stack.findValue("exception"), exception);
@@ -73,19 +74,19 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
 
         Mock action = new Mock(Action.class);
         mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
         String result = interceptor.intercept(invocation);
         assertEquals(result, Action.SUCCESS);
         assertNull(stack.findValue("exception"));
     }
 
-    public void testThrownExceptionNoMatch() throws Exception {
+    public void testThrownExceptionNoMatch() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
             interceptor.intercept(invocation);
@@ -95,13 +96,13 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
     }
 
-    public void testThrownExceptionNoMatchLogging() throws Exception {
+    public void testThrownExceptionNoMatchLogging() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -112,13 +113,13 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
     }
 
-    public void testThrownExceptionNoMatchLoggingCategory() throws Exception {
+    public void testThrownExceptionNoMatchLoggingCategory() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -130,13 +131,13 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
     }
 
-    public void testThrownExceptionNoMatchLoggingCategoryLevelFatal() throws Exception {
+    public void testThrownExceptionNoMatchLoggingCategoryLevelFatal() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -149,17 +150,17 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
         
         assertEquals("fatal", interceptor.getLogLevel());
-        assertEquals(true, interceptor.isLogEnabled());
+        assertTrue(interceptor.isLogEnabled());
         assertEquals("showcase.unhandled", interceptor.getLogCategory());
     }
 
-    public void testThrownExceptionNoMatchLoggingCategoryLevelError() throws Exception {
+    public void testThrownExceptionNoMatchLoggingCategoryLevelError() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -172,13 +173,13 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
     }
 
-    public void testThrownExceptionNoMatchLoggingCategoryLevelWarn() throws Exception {
+    public void testThrownExceptionNoMatchLoggingCategoryLevelWarn() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -191,13 +192,13 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
     }
 
-    public void testThrownExceptionNoMatchLoggingCategoryLevelInfo() throws Exception {
+    public void testThrownExceptionNoMatchLoggingCategoryLevelInfo() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -210,13 +211,13 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
     }
 
-    public void testThrownExceptionNoMatchLoggingCategoryLevelDebug() throws Exception {
+    public void testThrownExceptionNoMatchLoggingCategoryLevelDebug() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -229,13 +230,13 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         }
     }
 
-    public void testThrownExceptionNoMatchLoggingCategoryLevelTrace() throws Exception {
+    public void testThrownExceptionNoMatchLoggingCategoryLevelTrace() {
         this.setupWithoutExceptionMappings();
 
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -254,7 +255,7 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         Mock action = new Mock(Action.class);
         Exception exception = new Exception("test");
         mockInvocation.expectAndThrow("invoke", exception);
-        mockInvocation.matchAndReturn("getAction", ((Action) action.proxy()));
+        mockInvocation.matchAndReturn("getAction", action.proxy());
 
         try {
         	interceptor.setLogEnabled(true);
@@ -270,18 +271,18 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         ActionConfig actionConfig = new ActionConfig.Builder("", "", "").build();
         Mock actionProxy = new Mock(ActionProxy.class);
         actionProxy.expectAndReturn("getConfig", actionConfig);
-        mockInvocation.expectAndReturn("getProxy", ((ActionProxy) actionProxy.proxy()));
+        mockInvocation.expectAndReturn("getProxy", actionProxy.proxy());
         invocation = (ActionInvocation) mockInvocation.proxy();
     }
 
     private void setUpWithExceptionMappings() {
         ActionConfig actionConfig = new ActionConfig.Builder("", "", "")
-                .addExceptionMapping(new ExceptionMappingConfig.Builder("xwork", "com.opensymphony.xwork2.XWorkException", "spooky").build())
+                .addExceptionMapping(new ExceptionMappingConfig.Builder("xwork", "org.apache.struts2.StrutsException", "spooky").build())
                 .addExceptionMapping(new ExceptionMappingConfig.Builder("throwable", "java.lang.Throwable", "throwable").build())
                 .build();
         Mock actionProxy = new Mock(ActionProxy.class);
         actionProxy.expectAndReturn("getConfig", actionConfig);
-        mockInvocation.expectAndReturn("getProxy", ((ActionProxy) actionProxy.proxy()));
+        mockInvocation.expectAndReturn("getProxy", actionProxy.proxy());
 
         invocation = (ActionInvocation) mockInvocation.proxy();
     }
@@ -292,7 +293,7 @@ public class ExceptionMappingInterceptorTest extends XWorkTestCase {
         stack = ActionContext.getContext().getValueStack();
         mockInvocation = new Mock(ActionInvocation.class);
         mockInvocation.expectAndReturn("getStack", stack);
-        mockInvocation.expectAndReturn("getInvocationContext", new ActionContext(new HashMap<String, Object>()));
+        mockInvocation.expectAndReturn("getInvocationContext", new ActionContext(new HashMap<>()));
         interceptor = new ExceptionMappingInterceptor();
         interceptor.init();
     }
diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
index 6662ad2..ce2dcea 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
@@ -19,7 +19,6 @@
 package com.opensymphony.xwork2.ognl;
 
 import com.opensymphony.xwork2.ActionContext;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.XWorkTestCase;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
@@ -1477,7 +1476,7 @@ public class OgnlUtilTest extends XWorkTestCase {
                 try {
                     this.add(clazz.newInstance());
                 } catch (Exception e) {
-                    throw new XWorkException(e);
+                    throw new org.apache.struts2.StrutsException(e);
                 }
             }
 
diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java
index 05b3b1a..89cc9de 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java
@@ -44,6 +44,7 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.struts2.StrutsConstants;
+import org.apache.struts2.StrutsException;
 
 
 /**
@@ -680,7 +681,7 @@ public class OgnlValueStackTest extends XWorkTestCase {
         try {
             vs.setValue("count2", "a", true);
             fail("Expected an exception for mismatched getter and setter");
-        } catch (XWorkException e) {
+        } catch (StrutsException e) {
             //expected
         }
     }
@@ -698,7 +699,7 @@ public class OgnlValueStackTest extends XWorkTestCase {
         try {
             vs.setValue("count2", "a", true);
             fail("Expected an exception for mismatched getter and setter");
-        } catch (XWorkException e) {
+        } catch (StrutsException e) {
             //expected
         }
     }
@@ -780,7 +781,7 @@ public class OgnlValueStackTest extends XWorkTestCase {
         try {
             stack.setValue("bean", "foobar", true);
             fail("Should have thrown a type conversion exception");
-        } catch (XWorkException e) {
+        } catch (StrutsException e) {
             // expected
         }
 
@@ -1078,7 +1079,7 @@ public class OgnlValueStackTest extends XWorkTestCase {
         try {
             stack.setValue("count", "a", true);
             fail("Should have thrown a type conversion exception");
-        } catch (XWorkException e) {
+        } catch (StrutsException e) {
             // expected
         }
 
diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java
index 623480d..814b8d8 100644
--- a/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java
@@ -25,7 +25,6 @@ import com.opensymphony.xwork2.FileManagerFactory;
 import com.opensymphony.xwork2.SimpleAction;
 import com.opensymphony.xwork2.StubValueStack;
 import com.opensymphony.xwork2.TestBean;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.XWorkTestCase;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.test.DataAware2;
@@ -34,6 +33,7 @@ import com.opensymphony.xwork2.test.SimpleAction3;
 import com.opensymphony.xwork2.util.ValueStack;
 import com.opensymphony.xwork2.util.fs.DefaultFileManager;
 import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory;
+import org.apache.struts2.StrutsException;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -111,7 +111,7 @@ public class DefaultActionValidatorManagerTest extends XWorkTestCase {
                 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/TestBean-badtest-validation.xml")),
                 new ConfigurationException());
             List validatorList = actionValidatorManager.getValidators(TestBean.class, "badtest");
-        } catch (XWorkException ex) {
+        } catch (StrutsException ex) {
             pass = true;
         }
         mockValidatorFileParser.verify();
diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParserTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParserTest.java
index 89363bf..3c41b9f 100644
--- a/core/src/test/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParserTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParserTest.java
@@ -20,10 +20,10 @@ package com.opensymphony.xwork2.validator;
 
 import com.mockobjects.dynamic.C;
 import com.mockobjects.dynamic.Mock;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.util.ClassLoaderUtil;
 import com.opensymphony.xwork2.validator.validators.*;
 import junit.framework.TestCase;
+import org.apache.struts2.StrutsException;
 
 import java.io.InputStream;
 import java.util.List;
@@ -123,7 +123,7 @@ public class DefaultValidatorFileParserTest extends TestCase {
         boolean pass = false;
         try {
             parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName3);
-        } catch (XWorkException ex) {
+        } catch (StrutsException ex) {
             assertTrue("Wrong line number", 24 == ex.getLocation().getLineNumber());
             pass = true;
         }
@@ -136,7 +136,7 @@ public class DefaultValidatorFileParserTest extends TestCase {
         boolean pass = false;
         try {
             parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName4);
-        } catch (XWorkException ex) {
+        } catch (StrutsException ex) {
             assertTrue("Wrong line number: " + ex.getLocation(), 34 == ex.getLocation().getLineNumber());
             pass = true;
         }
@@ -149,7 +149,7 @@ public class DefaultValidatorFileParserTest extends TestCase {
         boolean pass = false;
         try {
             parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileNameFail);
-        } catch (XWorkException ex) {
+        } catch (StrutsException ex) {
             assertTrue("Wrong line number: " + ex.getLocation(), 28 == ex.getLocation().getLineNumber());
             pass = true;
         }
@@ -162,7 +162,7 @@ public class DefaultValidatorFileParserTest extends TestCase {
         boolean pass = false;
         try {
             parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName5);
-        } catch (XWorkException ex) {
+        } catch (StrutsException ex) {
             assertTrue("Wrong line number", 24 == ex.getLocation().getLineNumber());
             pass = true;
         }
diff --git a/core/src/test/java/com/opensymphony/xwork2/XWorkExceptionTest.java b/core/src/test/java/org/apache/struts2/StrutsExceptionTest.java
similarity index 66%
rename from core/src/test/java/com/opensymphony/xwork2/XWorkExceptionTest.java
rename to core/src/test/java/org/apache/struts2/StrutsExceptionTest.java
index 8904d75..5045f4e 100644
--- a/core/src/test/java/com/opensymphony/xwork2/XWorkExceptionTest.java
+++ b/core/src/test/java/org/apache/struts2/StrutsExceptionTest.java
@@ -16,33 +16,34 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package com.opensymphony.xwork2;
+package org.apache.struts2;
 
+import com.opensymphony.xwork2.XWorkTestCase;
 import com.opensymphony.xwork2.util.location.Location;
 
-public class XWorkExceptionTest extends XWorkTestCase {
+public class StrutsExceptionTest extends XWorkTestCase {
 
-    public void testUnknown() throws Exception {
-        XWorkException e = new XWorkException("testXXX", this);
+    public void testUnknown() {
+        StrutsException e = new StrutsException("testXXX", this);
         assertEquals(Location.UNKNOWN, e.getLocation());
     }
 
     public void testThrowable() {
-        XWorkException e = new XWorkException("testThrowable", new IllegalArgumentException("Arg is null"));
-        assertEquals("com/opensymphony/xwork2/XWorkExceptionTest.java", e.getLocation().getURI());
+        StrutsException e = new StrutsException("testThrowable", new IllegalArgumentException("Arg is null"));
+        assertEquals("org/apache/struts2/StrutsExceptionTest.java", e.getLocation().getURI());
         String s = e.getLocation().toString();
         assertTrue(s.contains("Method: testThrowable"));
     }
 
     public void testCauseAndTarget() {
-        XWorkException e = new XWorkException(new IllegalArgumentException("Arg is null"), this);
-        assertEquals("com/opensymphony/xwork2/XWorkExceptionTest.java", e.getLocation().getURI());
+        StrutsException e = new StrutsException(new IllegalArgumentException("Arg is null"), this);
+        assertEquals("org/apache/struts2/StrutsExceptionTest.java", e.getLocation().getURI());
         String s = e.getLocation().toString();
         assertTrue(s.contains("Method: testCauseAndTarget"));
     }
 
     public void testDefaultConstructor() {
-        XWorkException e = new XWorkException();
+        StrutsException e = new StrutsException();
 
         assertNull(e.getCause());
         assertNull(e.getMessage());
@@ -52,7 +53,7 @@ public class XWorkExceptionTest extends XWorkTestCase {
     }
 
     public void testMessageOnly() {
-        XWorkException e = new XWorkException("Hello World");
+        StrutsException e = new StrutsException("Hello World");
 
         assertNull(e.getCause());
         assertEquals("Hello World", e.getMessage());
@@ -60,22 +61,22 @@ public class XWorkExceptionTest extends XWorkTestCase {
     }
 
     public void testCauseOnly() {
-        XWorkException e = new XWorkException(new IllegalArgumentException("Arg is null"));
+        StrutsException e = new StrutsException(new IllegalArgumentException("Arg is null"));
 
         assertNotNull(e.getCause());
         assertNotNull(e.getLocation());
-        assertEquals("com/opensymphony/xwork2/XWorkExceptionTest.java", e.getLocation().getURI());
+        assertEquals("org/apache/struts2/StrutsExceptionTest.java", e.getLocation().getURI());
         String s = e.getLocation().toString();
         assertTrue(s.contains("Method: testCauseOnly"));
         assertTrue(e.toString().contains("Arg is null"));
     }
 
     public void testCauseOnlyNoMessage() {
-        XWorkException e = new XWorkException(new IllegalArgumentException());
+        StrutsException e = new org.apache.struts2.StrutsException(new IllegalArgumentException());
 
         assertNotNull(e.getCause());
         assertNotNull(e.getLocation());
-        assertEquals("com/opensymphony/xwork2/XWorkExceptionTest.java", e.getLocation().getURI());
+        assertEquals("org/apache/struts2/StrutsExceptionTest.java", e.getLocation().getURI());
         String s = e.getLocation().toString();
         assertTrue(s.contains("Method: testCauseOnly"));
         assertTrue(e.toString().contains("Method: testCauseOnly"));
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml
index f31b53c..b7f955e 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml
@@ -39,7 +39,7 @@
 
         <global-exception-mappings>
             <exception-mapping exception="java.lang.RuntimeException" result="runForDeeHillz"/>
-            <exception-mapping exception="com.opensymphony.xwork2.XworkException" result="xworkNaughty"/>
+            <exception-mapping exception="com.opensymphony.xwork2.StrutsException" result="xworkNaughty"/>
         </global-exception-mappings>
 
         <action name="Bar" class="com.opensymphony.xwork2.SimpleAction">
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
index 3ad275d9..093bf23 100644
--- a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
@@ -30,6 +30,7 @@ import com.opensymphony.xwork2.util.TextParseUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.struts2.StrutsException;
 
 import javax.servlet.ServletContext;
 import java.net.MalformedURLException;
@@ -72,7 +73,7 @@ public class ConventionUnknownHandler implements UnknownHandler {
     private ConventionsService conventionsService;
     private String nameSeparator;
 
-    protected Set<String> allowedMethods = new HashSet<>();
+    protected Set<String> allowedMethods;
 
     /**
      * Constructs the unknown handler.
@@ -114,7 +115,7 @@ public class ConventionUnknownHandler implements UnknownHandler {
     }
 
     public ActionConfig handleUnknownAction(String namespace, String actionName)
-            throws XWorkException {
+            throws StrutsException {
         // Strip the namespace if it is just a slash
         if (namespace == null || "/".equals(namespace)) {
             namespace = "";
@@ -217,7 +218,7 @@ public class ConventionUnknownHandler implements UnknownHandler {
         params.put(resultTypeConfig.getDefaultResultParam(), path);
 
         PackageConfig pkg = configuration.getPackageConfig(defaultParentPackageName);
-        List<InterceptorMapping> interceptors = InterceptorBuilder.constructInterceptorReference(pkg, pkg.getFullDefaultInterceptorRef(), Collections.<String, String>emptyMap(), null, objectFactory);
+        List<InterceptorMapping> interceptors = InterceptorBuilder.constructInterceptorReference(pkg, pkg.getFullDefaultInterceptorRef(), Collections.emptyMap(), null, objectFactory);
         ResultConfig config = new ResultConfig.Builder(Action.SUCCESS, resultTypeConfig.getClassName()).
                 addParams(params).build();
         results.put(Action.SUCCESS, config);
@@ -265,7 +266,7 @@ public class ConventionUnknownHandler implements UnknownHandler {
     }
 
     public Result handleUnknownResult(ActionContext actionContext, String actionName,
-                                      ActionConfig actionConfig, String resultCode) throws XWorkException {
+                                      ActionConfig actionConfig, String resultCode) throws StrutsException {
 
         PackageConfig pkg = configuration.getPackageConfig(actionConfig.getPackageName());
         String ns = pkg.getNamespace();
@@ -351,7 +352,7 @@ public class ConventionUnknownHandler implements UnknownHandler {
         try {
             return objectFactory.buildResult(resultConfig, invocationContext.getContextMap());
         } catch (Exception e) {
-            throw new XWorkException("Unable to build convention result", e, resultConfig);
+            throw new org.apache.struts2.StrutsException("Unable to build convention result", e, resultConfig);
         }
     }
 
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultClassFinder.java b/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultClassFinder.java
index 3aaad59..71c98b8 100644
--- a/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultClassFinder.java
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultClassFinder.java
@@ -21,7 +21,6 @@ package org.apache.struts2.convention;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.FileManager;
 import com.opensymphony.xwork2.FileManagerFactory;
-import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.util.finder.ClassFinder;
 import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
 import com.opensymphony.xwork2.util.finder.Test;
@@ -445,10 +444,10 @@ public class DefaultClassFinder implements ClassFinder {
                     classReader.accept(new InfoBuildingVisitor(this), ClassReader.SKIP_DEBUG);
                 }
             } else {
-                throw new XWorkException("Could not load " + className);
+                throw new org.apache.struts2.StrutsException("Could not load " + className);
             }
         } catch (IOException e) {
-            throw new XWorkException("Could not load " + className, e);
+            throw new org.apache.struts2.StrutsException("Could not load " + className, e);
         }
 
     }


Mime
View raw message