diff --git a/struts2-jsp-plugin/pom.xml b/struts2-jsp-plugin/pom.xml
index 0562e3b..3fb2202 100644
--- a/struts2-jsp-plugin/pom.xml
+++ b/struts2-jsp-plugin/pom.xml
@@ -91,19 +91,22 @@
             <version>1.1.2</version>
             <scope>test</scope>
         </dependency>
-        
+
     </dependencies>
 
-    <!--<build>
+    <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.4.2</version>
                 <configuration>
+                    <additionalClasspathElements>
+                        <element>${project.build.testOutputDirectory}/jsps.jar</element>
+                    </additionalClasspathElements>
                     <forkMode>never</forkMode>
                 </configuration>
             </plugin>
         </plugins>
-    </build>-->
-
+    </build>
 </project>
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/EmbeddedJSPResult.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/EmbeddedJSPResult.java
index 33ee880..114a2c3 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/EmbeddedJSPResult.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/EmbeddedJSPResult.java
@@ -1,6 +1,7 @@
 package org.apache.struts2;
 
 import com.opensymphony.xwork2.ActionInvocation;
+import org.apache.commons.lang.xwork.StringUtils;
 import org.apache.struts2.dispatcher.StrutsResultSupport;
 
 /**
@@ -8,6 +9,6 @@
  */
 public class EmbeddedJSPResult extends StrutsResultSupport {
     protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
-       JSPRuntime.handle(finalLocation);
+        JSPRuntime.handle(StringUtils.removeStart(finalLocation, "/"));
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPLoader.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPLoader.java
index 401e773..91ff0f6 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPLoader.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPLoader.java
@@ -20,16 +20,15 @@
  */
 package org.apache.struts2;
 
+import com.opensymphony.xwork2.util.URLUtil;
+import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
 import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate;
 import com.opensymphony.xwork2.util.finder.UrlSet;
-import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
-import com.opensymphony.xwork2.util.URLUtil;
-import com.opensymphony.xwork2.ActionContext;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.xwork.StringUtils;
 import org.apache.commons.lang.xwork.ObjectUtils;
+import org.apache.commons.lang.xwork.StringUtils;
 import org.apache.struts2.compiler.MemoryClassLoader;
 import org.apache.struts2.compiler.MemoryJavaFileObject;
 import org.apache.struts2.jasper.JasperException;
@@ -37,9 +36,8 @@
 import org.apache.struts2.jasper.compiler.JspUtil;
 
 import javax.servlet.Servlet;
-import javax.servlet.ServletException;
 import javax.servlet.ServletContext;
-import javax.servlet.jsp.JspPage;
+import javax.servlet.ServletException;
 import javax.tools.*;
 import java.io.File;
 import java.io.IOException;
@@ -219,7 +217,7 @@
 
     private ClassLoaderInterface getClassLoaderInterface() {
         ClassLoaderInterface classLoaderInterface = null;
-        ServletContext ctx =  ServletActionContext.getServletContext();
+        ServletContext ctx = ServletActionContext.getServletContext();
         if (ctx != null)
             classLoaderInterface = (ClassLoaderInterface) ctx.getAttribute(ClassLoaderInterface.CLASS_LOADER_INTERFACE);
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPServletConfig.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPServletConfig.java
index 9643911..69057df 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPServletConfig.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/JSPServletConfig.java
@@ -38,7 +38,7 @@
     }
 
     public String getInitParameter(String name) {
-        return null;  
+        return null;
     }
 
     public Enumeration getInitParameterNames() {
@@ -50,6 +50,6 @@
     }
 
     public String getServletName() {
-        return null;  
+        return null;
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Constants.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Constants.java
index 7c5565b..ec8d5d1 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Constants.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Constants.java
@@ -28,12 +28,12 @@
  */
 public class Constants {
     /**
-     * The base class of the generated servlets. 
+     * The base class of the generated servlets.
      */
     public static final String JSP_SERVLET_BASE = "org.apache.struts2.jasper.runtime.HttpJspBase";
 
     /**
-     * _jspService is the name of the method that is called by 
+     * _jspService is the name of the method that is called by
      * HttpJspBase.service(). This is where most of the code generated
      * from JSPs go.
      */
@@ -46,19 +46,19 @@
 
     /**
      * These classes/packages are automatically imported by the
-     * generated code. 
+     * generated code.
      */
-    public static final String[] STANDARD_IMPORTS = { 
-	"javax.servlet.*", 
-	"javax.servlet.http.*", 
-	"javax.servlet.jsp.*"
+    public static final String[] STANDARD_IMPORTS = {
+            "javax.servlet.*",
+            "javax.servlet.http.*",
+            "javax.servlet.jsp.*"
     };
 
     /**
      * FIXME
-     * ServletContext attribute for classpath. This is tomcat specific. 
-     * Other servlet engines may choose to support this attribute if they 
-     * want to have this JSP engine running on them. 
+     * ServletContext attribute for classpath. This is tomcat specific.
+     * Other servlet engines may choose to support this attribute if they
+     * want to have this JSP engine running on them.
      */
     public static final String SERVLET_CLASSPATH = "org.apache.catalina.jsp_classpath";
 
@@ -74,9 +74,9 @@
 
     /**
      * FIXME
-     * ServletContext attribute for class loader. This is tomcat specific. 
-     * Other servlet engines can choose to have this attribute if they 
-     * want to have this JSP engine running on them. 
+     * ServletContext attribute for class loader. This is tomcat specific.
+     * Other servlet engines can choose to have this attribute if they
+     * want to have this JSP engine running on them.
      */
     //public static final String SERVLET_CLASS_LOADER = "org.apache.tomcat.classloader";
     public static final String SERVLET_CLASS_LOADER = "org.apache.catalina.classloader";
@@ -85,7 +85,7 @@
      * Default size of the JSP buffer.
      */
     public static final int K = 1024;
-    public static final int DEFAULT_BUFFER_SIZE = 8*K;
+    public static final int DEFAULT_BUFFER_SIZE = 8 * K;
 
     /**
      * Default size for the tag buffers.
@@ -99,7 +99,7 @@
 
     /**
      * The query parameter that causes the JSP engine to just
-     * pregenerated the servlet but not invoke it. 
+     * pregenerated the servlet but not invoke it.
      */
     public static final String PRECOMPILE = "jsp_precompile";
 
@@ -115,7 +115,7 @@
 
     /**
      * Servlet context and request attributes that the JSP engine
-     * uses. 
+     * uses.
      */
     public static final String INC_REQUEST_URI = "javax.servlet.include.request_uri";
     public static final String INC_SERVLET_PATH = "javax.servlet.include.servlet_path";
@@ -126,90 +126,92 @@
     public static final String ALT_DD_ATTR = "org.apache.catalina.deploy.alt_dd";
 
     /**
-     * Public Id and the Resource path (of the cached copy) 
-     * of the DTDs for tag library descriptors. 
+     * Public Id and the Resource path (of the cached copy)
+     * of the DTDs for tag library descriptors.
      */
-    public static final String TAGLIB_DTD_PUBLIC_ID_11 = 
-	"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN";
-    public static final String TAGLIB_DTD_RESOURCE_PATH_11 = 
-	"/javax/servlet/jsp/resources/web-jsptaglibrary_1_1.dtd";
-    public static final String TAGLIB_DTD_PUBLIC_ID_12 = 
-	"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN";
-    public static final String TAGLIB_DTD_RESOURCE_PATH_12 = 
-	"/javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd";
+    public static final String TAGLIB_DTD_PUBLIC_ID_11 =
+            "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN";
+    public static final String TAGLIB_DTD_RESOURCE_PATH_11 =
+            "/javax/servlet/jsp/resources/web-jsptaglibrary_1_1.dtd";
+    public static final String TAGLIB_DTD_PUBLIC_ID_12 =
+            "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN";
+    public static final String TAGLIB_DTD_RESOURCE_PATH_12 =
+            "/javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd";
 
     /**
-     * Public Id and the Resource path (of the cached copy) 
+     * Public Id and the Resource path (of the cached copy)
      * of the DTDs for web application deployment descriptors
      */
-    public static final String WEBAPP_DTD_PUBLIC_ID_22 = 
-	"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN";
-    public static final String WEBAPP_DTD_RESOURCE_PATH_22 = 
-	"/javax/servlet/resources/web-app_2_2.dtd";
-    public static final String WEBAPP_DTD_PUBLIC_ID_23 = 
-	"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN";
-    public static final String WEBAPP_DTD_RESOURCE_PATH_23 = 
-	"/javax/servlet/resources/web-app_2_3.dtd";
+    public static final String WEBAPP_DTD_PUBLIC_ID_22 =
+            "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN";
+    public static final String WEBAPP_DTD_RESOURCE_PATH_22 =
+            "/javax/servlet/resources/web-app_2_2.dtd";
+    public static final String WEBAPP_DTD_PUBLIC_ID_23 =
+            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN";
+    public static final String WEBAPP_DTD_RESOURCE_PATH_23 =
+            "/javax/servlet/resources/web-app_2_3.dtd";
 
     /**
      * List of the Public IDs that we cache, and their
-     * associated location. This is used by 
+     * associated location. This is used by
      * an EntityResolver to return the location of the
      * cached copy of a DTD.
      */
     public static final String[] CACHED_DTD_PUBLIC_IDS = {
-	TAGLIB_DTD_PUBLIC_ID_11,
-	TAGLIB_DTD_PUBLIC_ID_12,
-	WEBAPP_DTD_PUBLIC_ID_22,
-	WEBAPP_DTD_PUBLIC_ID_23,
+            TAGLIB_DTD_PUBLIC_ID_11,
+            TAGLIB_DTD_PUBLIC_ID_12,
+            WEBAPP_DTD_PUBLIC_ID_22,
+            WEBAPP_DTD_PUBLIC_ID_23,
     };
     public static final String[] CACHED_DTD_RESOURCE_PATHS = {
-	TAGLIB_DTD_RESOURCE_PATH_11,
-	TAGLIB_DTD_RESOURCE_PATH_12,
-	WEBAPP_DTD_RESOURCE_PATH_22,
-	WEBAPP_DTD_RESOURCE_PATH_23,
+            TAGLIB_DTD_RESOURCE_PATH_11,
+            TAGLIB_DTD_RESOURCE_PATH_12,
+            WEBAPP_DTD_RESOURCE_PATH_22,
+            WEBAPP_DTD_RESOURCE_PATH_23,
     };
-    
+
     /**
      * Default URLs to download the pluging for Netscape and IE.
      */
-    public static final String NS_PLUGIN_URL = 
-        "http://java.sun.com/products/plugin/";
+    public static final String NS_PLUGIN_URL =
+            "http://java.sun.com/products/plugin/";
 
-    public static final String IE_PLUGIN_URL = 
-        "http://java.sun.com/products/plugin/1.2.2/jinstall-1_2_2-win.cab#Version=1,2,2,0";
+    public static final String IE_PLUGIN_URL =
+            "http://java.sun.com/products/plugin/1.2.2/jinstall-1_2_2-win.cab#Version=1,2,2,0";
 
     /**
      * Prefix to use for generated temporary variable names
      */
     public static final String TEMP_VARIABLE_NAME_PREFIX =
-        "_jspx_temp";
+            "_jspx_temp";
 
     /**
      * Previous replacement char for "\$".
+     *
      * @deprecated
      */
-    public static final char ESC='\u001b';
-    
+    public static final char ESC = '\u001b';
+
     /**
      * Previous replacement char for "\$".
+     *
      * @deprecated
      */
-    public static final String ESCStr="'\\u001b'";
-    
+    public static final String ESCStr = "'\\u001b'";
+
     /**
      * Replacement char for "\$". This is the first unicode character in the
      * private use area.
      * XXX This is a hack to avoid changing EL interpreter to recognize "\$"
      */
     public static final char HACK_CHAR = '\ue000';
-    
+
     /**
      * Replacement string for "\$". This is the first unicode character in the
      * private use area.
      * XXX This is a hack to avoid changing EL interpreter to recognize "\$"
      */
     public static final String HACK_STR = "'\\ue000'";
-    
+
 }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/CustomCompiler.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/CustomCompiler.java
index cf6b1a7..d993f66 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/CustomCompiler.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/CustomCompiler.java
@@ -22,7 +22,7 @@
 
 import java.io.FileNotFoundException;
 
-public class CustomCompiler extends org.apache.struts2.jasper.compiler.Compiler{
+public class CustomCompiler extends org.apache.struts2.jasper.compiler.Compiler {
 
     public boolean isOutDated() {
         return true;
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/EmbeddedServletOptions.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/EmbeddedServletOptions.java
index 87c06f8..c6fb5ec 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/EmbeddedServletOptions.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/EmbeddedServletOptions.java
@@ -17,8 +17,8 @@
 
 package org.apache.struts2.jasper;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.compiler.JspConfig;
 import org.apache.struts2.jasper.compiler.Localizer;
 import org.apache.struts2.jasper.compiler.TagPluginManager;
@@ -33,254 +33,254 @@
 import java.util.Properties;
 
 /**
- * A class to hold all init parameters specific to the JSP engine. 
+ * A class to hold all init parameters specific to the JSP engine.
  *
  * @author Anil K. Vijendran
  * @author Hans Bergsten
  * @author Pierre Delisle
  */
 public final class EmbeddedServletOptions implements Options {
-    
+
     // Logger
-    private Log log = LogFactory.getLog(EmbeddedServletOptions.class);
-    
+    private Logger log = LoggerFactory.getLogger(EmbeddedServletOptions.class);
+
     private Properties settings = new Properties();
-    
+
     /**
      * Is Jasper being used in development mode?
      */
     private boolean development = true;
-    
+
     /**
      * Should Ant fork its java compiles of JSP pages.
      */
     public boolean fork = true;
-    
+
     /**
      * Do you want to keep the generated Java files around?
      */
     private boolean keepGenerated = true;
-    
+
     /**
      * Should white spaces between directives or actions be trimmed?
      */
     private boolean trimSpaces = false;
-    
+
     /**
      * Determines whether tag handler pooling is enabled.
      */
     private boolean isPoolingEnabled = true;
-    
+
     /**
      * Do you want support for "mapped" files? This will generate
      * servlet that has a print statement per line of the JSP file.
      * This seems like a really nice feature to have for debugging.
      */
     private boolean mappedFile = true;
-    
+
     /**
      * Do you want stack traces and such displayed in the client's
      * browser? If this is false, such messages go to the standard
-     * error or a log file if the standard error is redirected. 
+     * error or a log file if the standard error is redirected.
      */
     private boolean sendErrorToClient = false;
-    
+
     /**
      * Do we want to include debugging information in the class file?
      */
     private boolean classDebugInfo = true;
-    
+
     /**
      * Background compile thread check interval in seconds.
      */
     private int checkInterval = 0;
-    
+
     /**
      * Is the generation of SMAP info for JSR45 debuggin suppressed?
      */
     private boolean isSmapSuppressed = false;
-    
+
     /**
      * Should SMAP info for JSR45 debugging be dumped to a file?
      */
     private boolean isSmapDumped = false;
-    
+
     /**
      * Are Text strings to be generated as char arrays?
      */
     private boolean genStringAsCharArray = false;
-    
+
     private boolean errorOnUseBeanInvalidClassAttribute = true;
-    
+
     /**
      * I want to see my generated servlets. Which directory are they
      * in?
      */
     private File scratchDir;
-    
+
     /**
      * Need to have this as is for versions 4 and 5 of IE. Can be set from
      * the initParams so if it changes in the future all that is needed is
      * to have a jsp initParam of type ieClassId="<value>"
      */
     private String ieClassId = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93";
-    
+
     /**
      * What classpath should I use while compiling generated servlets?
      */
     private String classpath = null;
-    
+
     /**
      * Compiler to use.
      */
     private String compiler = null;
-    
+
     /**
      * Compiler target VM.
      */
     private String compilerTargetVM = "1.5";
-    
+
     /**
      * The compiler source VM.
      */
     private String compilerSourceVM = "1.5";
-    
+
     /**
      * Cache for the TLD locations
      */
     private TldLocationsCache tldLocationsCache = null;
-    
+
     /**
      * Jsp config information
      */
     private JspConfig jspConfig = null;
-    
+
     /**
      * TagPluginManager
      */
     private TagPluginManager tagPluginManager = null;
-    
+
     /**
      * Java platform encoding to generate the JSP
      * page servlet.
      */
     private String javaEncoding = "UTF8";
-    
+
     /**
      * Modification test interval.
      */
     private int modificationTestInterval = 4;
-    
+
     /**
      * Is generation of X-Powered-By response header enabled/disabled?
      */
     private boolean xpoweredBy;
-    
-    public String getProperty(String name ) {
-        return settings.getProperty( name );
+
+    public String getProperty(String name) {
+        return settings.getProperty(name);
     }
-    
-    public void setProperty(String name, String value ) {
-        if (name != null && value != null){ 
-            settings.setProperty( name, value );
+
+    public void setProperty(String name, String value) {
+        if (name != null && value != null) {
+            settings.setProperty(name, value);
         }
     }
-    
+
     /**
      * Are we keeping generated code around?
      */
     public boolean getKeepGenerated() {
         return keepGenerated;
     }
-    
+
     /**
      * Should white spaces between directives or actions be trimmed?
      */
     public boolean getTrimSpaces() {
         return trimSpaces;
     }
-    
+
     public boolean isPoolingEnabled() {
         return isPoolingEnabled;
     }
-    
+
     /**
      * Are we supporting HTML mapped servlets?
      */
     public boolean getMappedFile() {
         return mappedFile;
     }
-    
+
     /**
      * Should errors be sent to client or thrown into stderr?
      */
     public boolean getSendErrorToClient() {
         return sendErrorToClient;
     }
-    
+
     /**
      * Should class files be compiled with debug information?
      */
     public boolean getClassDebugInfo() {
         return classDebugInfo;
     }
-    
+
     /**
      * Background JSP compile thread check intervall
      */
     public int getCheckInterval() {
         return checkInterval;
     }
-    
+
     /**
      * Modification test interval.
      */
     public int getModificationTestInterval() {
         return modificationTestInterval;
     }
-    
+
     /**
      * Is Jasper being used in development mode?
      */
     public boolean getDevelopment() {
         return development;
     }
-    
+
     /**
      * Is the generation of SMAP info for JSR45 debuggin suppressed?
      */
     public boolean isSmapSuppressed() {
         return isSmapSuppressed;
     }
-    
+
     /**
      * Should SMAP info for JSR45 debugging be dumped to a file?
      */
     public boolean isSmapDumped() {
         return isSmapDumped;
     }
-    
+
     /**
      * Are Text strings to be generated as char arrays?
      */
     public boolean genStringAsCharArray() {
         return this.genStringAsCharArray;
     }
-    
+
     /**
-     * Class ID for use in the plugin tag when the browser is IE. 
+     * Class ID for use in the plugin tag when the browser is IE.
      */
     public String getIeClassId() {
         return ieClassId;
     }
-    
+
     /**
      * What is my scratch dir?
      */
     public File getScratchDir() {
         return scratchDir;
     }
-    
+
     /**
      * What classpath should I use while compiling the servlets
      * generated from JSP files?
@@ -288,82 +288,82 @@
     public String getClassPath() {
         return classpath;
     }
-    
+
     /**
      * Is generation of X-Powered-By response header enabled/disabled?
      */
     public boolean isXpoweredBy() {
         return xpoweredBy;
     }
-    
+
     /**
      * Compiler to use.
      */
     public String getCompiler() {
         return compiler;
     }
-    
+
     /**
      * @see Options#getCompilerTargetVM
      */
     public String getCompilerTargetVM() {
         return compilerTargetVM;
     }
-    
+
     /**
      * @see Options#getCompilerSourceVM
      */
     public String getCompilerSourceVM() {
         return compilerSourceVM;
     }
-    
+
     public boolean getErrorOnUseBeanInvalidClassAttribute() {
         return errorOnUseBeanInvalidClassAttribute;
     }
-    
+
     public void setErrorOnUseBeanInvalidClassAttribute(boolean b) {
         errorOnUseBeanInvalidClassAttribute = b;
     }
-    
+
     public TldLocationsCache getTldLocationsCache() {
         return tldLocationsCache;
     }
-    
-    public void setTldLocationsCache( TldLocationsCache tldC ) {
+
+    public void setTldLocationsCache(TldLocationsCache tldC) {
         tldLocationsCache = tldC;
     }
-    
+
     public String getJavaEncoding() {
         return javaEncoding;
     }
-    
+
     public boolean getFork() {
         return fork;
     }
-    
+
     public JspConfig getJspConfig() {
         return jspConfig;
     }
-    
+
     public TagPluginManager getTagPluginManager() {
         return tagPluginManager;
     }
-    
+
     public boolean isCaching() {
         return false;
     }
-    
+
     public Map getCache() {
         return null;
     }
 
     /**
      * Create an EmbeddedServletOptions object using data available from
-     * ServletConfig and ServletContext. 
+     * ServletConfig and ServletContext.
      */
     public EmbeddedServletOptions(ServletConfig config,
-            ServletContext context) {
-        
+                                  ServletContext context) {
+
         // JVM version numbers
         try {
             if (Float.parseFloat(System.getProperty("java.specification.version")) > 1.4) {
@@ -374,18 +374,18 @@
         } catch (NumberFormatException e) {
             // Ignore
         }
-        
-        Enumeration enumeration=config.getInitParameterNames();
-        while( enumeration.hasMoreElements() ) {
-            String k=(String)enumeration.nextElement();
-            String v=config.getInitParameter( k );
-            setProperty( k, v);
+
+        Enumeration enumeration = config.getInitParameterNames();
+        while (enumeration.hasMoreElements()) {
+            String k = (String) enumeration.nextElement();
+            String v = config.getInitParameter(k);
+            setProperty(k, v);
         }
-        
+
         // quick hack
-        String validating=config.getInitParameter( "validating");
-        if( "false".equals( validating )) ParserUtils.validating=false;
-        
+        String validating = config.getInitParameter("validating");
+        if ("false".equals(validating)) ParserUtils.validating = false;
+
         String keepgen = config.getInitParameter("keepgenerated");
         if (keepgen != null) {
             if (keepgen.equalsIgnoreCase("true")) {
@@ -398,9 +398,9 @@
                 }
             }
         }
-        
-        
-        String trimsp = config.getInitParameter("trimSpaces"); 
+
+
+        String trimsp = config.getInitParameter("trimSpaces");
         if (trimsp != null) {
             if (trimsp.equalsIgnoreCase("true")) {
                 trimSpaces = true;
@@ -412,10 +412,10 @@
                 }
             }
         }
-        
+
         this.isPoolingEnabled = true;
         String poolingEnabledParam
-        = config.getInitParameter("enablePooling"); 
+                = config.getInitParameter("enablePooling");
         if (poolingEnabledParam != null
                 && !poolingEnabledParam.equalsIgnoreCase("true")) {
             if (poolingEnabledParam.equalsIgnoreCase("false")) {
@@ -423,11 +423,11 @@
             } else {
                 if (log.isWarnEnabled()) {
                     log.warn(Localizer.getMessage("jsp.warning.enablePooling"));
-                }		       	   
+                }
             }
         }
-        
-        String mapFile = config.getInitParameter("mappedfile"); 
+
+        String mapFile = config.getInitParameter("mappedfile");
         if (mapFile != null) {
             if (mapFile.equalsIgnoreCase("true")) {
                 this.mappedFile = true;
@@ -439,7 +439,7 @@
                 }
             }
         }
-        
+
         String senderr = config.getInitParameter("sendErrToClient");
         if (senderr != null) {
             if (senderr.equalsIgnoreCase("true")) {
@@ -452,42 +452,42 @@
                 }
             }
         }
-        
+
         String debugInfo = config.getInitParameter("classdebuginfo");
         if (debugInfo != null) {
             if (debugInfo.equalsIgnoreCase("true")) {
-                this.classDebugInfo  = true;
+                this.classDebugInfo = true;
             } else if (debugInfo.equalsIgnoreCase("false")) {
-                this.classDebugInfo  = false;
+                this.classDebugInfo = false;
             } else {
                 if (log.isWarnEnabled()) {
                     log.warn(Localizer.getMessage("jsp.warning.classDebugInfo"));
                 }
             }
         }
-        
+
         String checkInterval = config.getInitParameter("checkInterval");
         if (checkInterval != null) {
             try {
                 this.checkInterval = Integer.parseInt(checkInterval);
-            } catch(NumberFormatException ex) {
+            } catch (NumberFormatException ex) {
                 if (log.isWarnEnabled()) {
                     log.warn(Localizer.getMessage("jsp.warning.checkInterval"));
                 }
             }
         }
-        
+
         String modificationTestInterval = config.getInitParameter("modificationTestInterval");
         if (modificationTestInterval != null) {
             try {
                 this.modificationTestInterval = Integer.parseInt(modificationTestInterval);
-            } catch(NumberFormatException ex) {
+            } catch (NumberFormatException ex) {
                 if (log.isWarnEnabled()) {
                     log.warn(Localizer.getMessage("jsp.warning.modificationTestInterval"));
                 }
             }
         }
-        
+
         String development = config.getInitParameter("development");
         if (development != null) {
             if (development.equalsIgnoreCase("true")) {
@@ -500,7 +500,7 @@
                 }
             }
         }
-        
+
         String suppressSmap = config.getInitParameter("suppressSmap");
         if (suppressSmap != null) {
             if (suppressSmap.equalsIgnoreCase("true")) {
@@ -513,7 +513,7 @@
                 }
             }
         }
-        
+
         String dumpSmap = config.getInitParameter("dumpSmap");
         if (dumpSmap != null) {
             if (dumpSmap.equalsIgnoreCase("true")) {
@@ -526,7 +526,7 @@
                 }
             }
         }
-        
+
         String genCharArray = config.getInitParameter("genStrAsCharArray");
         if (genCharArray != null) {
             if (genCharArray.equalsIgnoreCase("true")) {
@@ -539,9 +539,9 @@
                 }
             }
         }
-        
+
         String errBeanClass =
-            config.getInitParameter("errorOnUseBeanInvalidClassAttribute");
+                config.getInitParameter("errorOnUseBeanInvalidClassAttribute");
         if (errBeanClass != null) {
             if (errBeanClass.equalsIgnoreCase("true")) {
                 errorOnUseBeanInvalidClassAttribute = true;
@@ -553,19 +553,19 @@
                 }
             }
         }
-        
+
         String ieClassId = config.getInitParameter("ieClassId");
         if (ieClassId != null)
             this.ieClassId = ieClassId;
-        
+
         String classpath = config.getInitParameter("classpath");
         if (classpath != null)
             this.classpath = classpath;
-        
+
         /*
-         * scratchdir
-         */
-        String dir = config.getInitParameter("scratchdir"); 
+        * scratchdir
+        */
+        String dir = config.getInitParameter("scratchdir");
         if (dir != null) {
             scratchDir = new File(dir);
         } else {
@@ -578,34 +578,34 @@
                 if (dir != null)
                     scratchDir = new File(dir);
             }
-        }      
+        }
         if (this.scratchDir == null) {
             log.fatal(Localizer.getMessage("jsp.error.no.scratch.dir"));
             return;
         }
-        
+
         if (!(scratchDir.exists() && scratchDir.canRead() &&
                 scratchDir.canWrite() && scratchDir.isDirectory()))
             log.fatal(Localizer.getMessage("jsp.error.bad.scratch.dir",
                     scratchDir.getAbsolutePath()));
-        
+
         this.compiler = config.getInitParameter("compiler");
-        
+
         String compilerTargetVM = config.getInitParameter("compilerTargetVM");
-        if(compilerTargetVM != null) {
+        if (compilerTargetVM != null) {
             this.compilerTargetVM = compilerTargetVM;
         }
-        
+
         String compilerSourceVM = config.getInitParameter("compilerSourceVM");
-        if(compilerSourceVM != null) {
+        if (compilerSourceVM != null) {
             this.compilerSourceVM = compilerSourceVM;
         }
-        
+
         String javaEncoding = config.getInitParameter("javaEncoding");
         if (javaEncoding != null) {
             this.javaEncoding = javaEncoding;
         }
-        
+
         String fork = config.getInitParameter("fork");
         if (fork != null) {
             if (fork.equalsIgnoreCase("true")) {
@@ -618,8 +618,8 @@
                 }
             }
         }
-        
-        String xpoweredBy = config.getInitParameter("xpoweredBy"); 
+
+        String xpoweredBy = config.getInitParameter("xpoweredBy");
         if (xpoweredBy != null) {
             if (xpoweredBy.equalsIgnoreCase("true")) {
                 this.xpoweredBy = true;
@@ -631,17 +631,17 @@
                 }
             }
         }
-        
+
         // Setup the global Tag Libraries location cache for this
         // web-application.
         tldLocationsCache = new TldLocationsCache(context);
-        
+
         // Setup the jsp config info for this web app.
         jspConfig = new JspConfig(context);
-        
+
         // Create a Tag plugin instance
         tagPluginManager = new TagPluginManager(context);
     }
-    
+
 }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JasperException.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JasperException.java
index f7c0ae1..4eb16b9 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JasperException.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JasperException.java
@@ -19,28 +19,28 @@
 
 /**
  * Base class for all exceptions generated by the JSP engine. Makes it
- * convienient to catch just this at the top-level. 
+ * convienient to catch just this at the top-level.
  *
  * @author Anil K. Vijendran
  */
 public class JasperException extends javax.servlet.ServletException {
-    
+
     public JasperException(String reason) {
-	super(reason);
+        super(reason);
     }
 
     /**
      * Creates a JasperException with the embedded exception and the reason for
      * throwing a JasperException
      */
-    public JasperException (String reason, Throwable exception) {
-   	super(reason, exception);
+    public JasperException(String reason, Throwable exception) {
+        super(reason, exception);
     }
 
     /**
      * Creates a JasperException with the embedded exception
      */
-    public JasperException (Throwable exception) {
-   	super(exception);
+    public JasperException(Throwable exception) {
+        super(exception);
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspC.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspC.java
index 3f4862e..66c99a6 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspC.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspC.java
@@ -18,7 +18,8 @@
 package org.apache.struts2.jasper;
 
 import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
-import org.apache.commons.logging.Log;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.commons.logging.LogFactory;
 import org.apache.struts2.jasper.compiler.Compiler;
 import org.apache.struts2.jasper.compiler.*;
@@ -33,10 +34,10 @@
  * Shell for the jspc compiler.  Handles all options associated with the
  * command line and creates compilation contexts which it then compiles
  * according to the specified options.
- *
+ * <p/>
  * This version can process files from a _single_ webapp at once, i.e.
  * a single docbase can be specified.
- *
+ * <p/>
  * It can be used as an Ant task using:
  * <pre>
  *   &lt;taskdef classname="org.apache.struts.jasperJspC" name="jasper2" &gt;
@@ -51,7 +52,7 @@
  *          &lt;path refid="myjars"/&gt;
  *       &lt;/classpath&gt;
  *  &lt;/taskdef&gt;
- *
+ * <p/>
  *  &lt;jasper2 verbose="0"
  *           package="my.package"
  *           uriroot="${webapps.dir}/${webapp.name}"
@@ -65,12 +66,16 @@
  * @author Yoav Shapira
  */
 public class JspC implements Options {
-    /** The default Microsoft Internet Explorer class ID. */
+    /**
+     * The default Microsoft Internet Explorer class ID.
+     */
     public static final String DEFAULT_IE_CLASS_ID =
             "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93";
 
-    /** Logger (set by constructor.) */
-    private Log log;
+    /**
+     * Logger (set by constructor.)
+     */
+    private Logger log;
 
     private static final String SWITCH_VERBOSE = "-v";
     private static final String SWITCH_HELP = "-help";
@@ -99,7 +104,7 @@
     private static final String SWITCH_SMAP = "-smap";
     private static final String SWITCH_DUMP_SMAP = "-dumpsmap";
 
-    private static final String SHOW_SUCCESS ="-s";
+    private static final String SHOW_SUCCESS = "-s";
     private static final String LIST_ERRORS = "-l";
     private static final int NO_WEBXML = 0;
     private static final int INC_WEBXML = 10;
@@ -108,11 +113,11 @@
     private static final int NO_DIE_LEVEL = 0;
 
     private static final String[] insertBefore =
-    { "</web-app>", "<servlet-mapping>", "<session-config>",
-      "<mime-mapping>", "<welcome-file-list>", "<error-page>", "<taglib>",
-      "<resource-env-ref>", "<resource-ref>", "<security-constraint>",
-      "<login-config>", "<security-role>", "<env-entry>", "<ejb-ref>",
-      "<ejb-local-ref>" };
+            {"</web-app>", "<servlet-mapping>", "<session-config>",
+                    "<mime-mapping>", "<welcome-file-list>", "<error-page>", "<taglib>",
+                    "<resource-env-ref>", "<resource-ref>", "<security-constraint>",
+                    "<login-config>", "<security-role>", "<env-entry>", "<ejb-ref>",
+                    "<ejb-local-ref>"};
 
     private static int die;
     private String classPath = null;
@@ -231,9 +236,11 @@
         }
     }
 
-    /** Constructor. */
+    /**
+     * Constructor.
+     */
     public JspC() {
-        log = LogFactory.getLog(getClass());
+        log = LoggerFactory.getLogger(getClass());
     }
 
     public String getSourceCode() {
@@ -258,18 +265,18 @@
                 listErrors = true;
             } else if (tok.equals(SWITCH_OUTPUT_DIR)) {
                 tok = nextArg();
-                setOutputDir( tok );
+                setOutputDir(tok);
             } else if (tok.equals(SWITCH_PACKAGE_NAME)) {
                 targetPackage = nextArg();
             } else if (tok.equals(SWITCH_COMPILE)) {
-                compile=true;
+                compile = true;
             } else if (tok.equals(SWITCH_CLASS_NAME)) {
                 targetClassName = nextArg();
             } else if (tok.equals(SWITCH_URI_BASE)) {
-                uriBase=nextArg();
-            } else if ( tok.equals( SHOW_SUCCESS ) ) {
+                uriBase = nextArg();
+            } else if (tok.equals(SHOW_SUCCESS)) {
                 showSuccess = true;
-            } else if ( tok.equals( LIST_ERRORS ) ) {
+            } else if (tok.equals(LIST_ERRORS)) {
                 listErrors = true;
             } else if (tok.equals(SWITCH_WEBAPP_INC)) {
                 webxmlFile = nextArg();
@@ -293,13 +300,13 @@
                     caching = false;
                 } else {
                     caching = true;
-                }            
+                }
             } else if (tok.equals(SWITCH_CLASSPATH)) {
                 setClassPath(nextArg());
             } else if (tok.startsWith(SWITCH_DIE)) {
                 try {
                     dieLevel = Integer.parseInt(
-                        tok.substring(SWITCH_DIE.length()));
+                            tok.substring(SWITCH_DIE.length()));
                 } catch (NumberFormatException nfe) {
                     dieLevel = DEFAULT_DIE_LEVEL;
                 }
@@ -326,7 +333,7 @@
             } else {
                 if (tok.startsWith("-")) {
                     throw new JasperException("Unrecognized option: " + tok +
-                        ".  Use -help for help.");
+                            ".  Use -help for help.");
                 }
                 if (!fullstop) {
                     argPos--;
@@ -337,12 +344,12 @@
         }
 
         // Add all extra arguments to the list of files
-        while( true ) {
+        while (true) {
             String file = nextFile();
-            if( file==null ) {
+            if (file == null) {
                 break;
             }
-            pages.add( file );
+            pages.add(file);
         }
     }
 
@@ -404,8 +411,8 @@
         return true;
     }
 
-    public void setClassDebugInfo( boolean b ) {
-        classDebugInfo=b;
+    public void setClassDebugInfo(boolean b) {
+        classDebugInfo = b;
     }
 
     public boolean getClassDebugInfo() {
@@ -413,8 +420,8 @@
         return classDebugInfo;
     }
 
-     /**
-      * @see Options#isCaching()
+    /**
+     * @see Options#isCaching()
      */
     public boolean isCaching() {
         return caching;
@@ -469,7 +476,7 @@
         this.smapSuppressed = smapSuppressed;
     }
 
-    
+
     /**
      * Should SMAP info for JSR45 debugging be dumped to a file?
      */
@@ -484,13 +491,13 @@
         this.smapDumped = smapDumped;
     }
 
-    
+
     /**
      * Determines whether text strings are to be generated as char arrays,
      * which improves performance in some cases.
      *
      * @param genStringAsCharArray true if text strings are to be generated as
-     * char arrays, false otherwise
+     *                             char arrays, false otherwise
      */
     public void setGenStringAsCharArray(boolean genStringAsCharArray) {
         this.genStringAsCharArray = genStringAsCharArray;
@@ -500,7 +507,7 @@
      * Indicates whether text strings are to be generated as char arrays.
      *
      * @return true if text strings are to be generated as char arrays, false
-     * otherwise
+     *         otherwise
      */
     public boolean genStringAsCharArray() {
         return genStringAsCharArray;
@@ -531,12 +538,12 @@
     }
 
     public Class getJspCompilerPlugin() {
-       // we don't compile, so this is meanlingless
+        // we don't compile, so this is meanlingless
         return null;
     }
 
     public String getJspCompilerPath() {
-       // we don't compile, so this is meanlingless
+        // we don't compile, so this is meanlingless
         return null;
     }
 
@@ -548,7 +555,7 @@
     }
 
     public void setCompiler(String c) {
-        compiler=c;
+        compiler = c;
     }
 
     /**
@@ -565,10 +572,10 @@
     /**
      * @see Options#getCompilerSourceVM()
      */
-     public String getCompilerSourceVM() {
-         return compilerSourceVM;
-     }
-        
+    public String getCompilerSourceVM() {
+        return compilerSourceVM;
+    }
+
     /**
      * @see Options#getCompilerSourceVM()
      */
@@ -605,13 +612,13 @@
     }
 
     public String getClassPath() {
-        if( classPath != null )
+        if (classPath != null)
             return classPath;
         return System.getProperty("java.class.path");
     }
 
     public void setClassPath(String s) {
-        classPath=s;
+        classPath = s;
     }
 
     /**
@@ -631,8 +638,8 @@
      * @param extension The extension to add, e.g. "myjsp"
      */
     protected void addExtension(final String extension) {
-        if(extension != null) {
-            if(extensions == null) {
+        if (extension != null) {
+            if (extensions == null) {
                 extensions = new Vector();
             }
 
@@ -643,14 +650,14 @@
     /**
      * Parses comma-separated list of JSP files to be processed.  If the argument
      * is null, nothing is done.
-     *
+     * <p/>
      * <p>Each file is interpreted relative to uriroot, unless it is absolute,
      * in which case it must start with uriroot.</p>
      *
      * @param jspFiles Comma-separated list of JSP files to be processed
      */
     public void setJspFiles(final String jspFiles) {
-        if(jspFiles == null) {
+        if (jspFiles == null) {
             return;
         }
 
@@ -665,7 +672,7 @@
      *
      * @param b Flag value
      */
-    public void setCompile( final boolean b ) {
+    public void setCompile(final boolean b) {
         compile = b;
     }
 
@@ -676,7 +683,7 @@
      *
      * @param level Positive means verbose
      */
-    public void setVerbose( final int level ) {
+    public void setVerbose(final int level) {
         if (level > 0) {
             verbose = true;
             showSuccess = true;
@@ -684,24 +691,24 @@
         }
     }
 
-    public void setValidateXml( boolean b ) {
-        org.apache.struts2.jasper.xmlparser.ParserUtils.validating=b;
+    public void setValidateXml(boolean b) {
+        org.apache.struts2.jasper.xmlparser.ParserUtils.validating = b;
     }
 
-    public void setListErrors( boolean b ) {
+    public void setListErrors(boolean b) {
         listErrors = b;
     }
 
-    public void setOutputDir( String s ) {
-        if( s!= null ) {
+    public void setOutputDir(String s) {
+        if (s != null) {
             scratchDir = resolveFile(s).getAbsoluteFile();
         } else {
-            scratchDir=null;
+            scratchDir = null;
         }
     }
 
-    public void setPackage( String p ) {
-        targetPackage=p;
+    public void setPackage(String p) {
+        targetPackage = p;
     }
 
     /**
@@ -709,24 +716,24 @@
      * Can only be used if a single file is converted.
      * XXX Do we need this feature ?
      */
-    public void setClassName( String p ) {
-        targetClassName=p;
+    public void setClassName(String p) {
+        targetClassName = p;
     }
 
     /**
      * File where we generate a web.xml fragment with the class definitions.
      */
-    public void setWebXmlFragment( String s ) {
-        webxmlFile=resolveFile(s).getAbsolutePath();
-        webxmlLevel=INC_WEBXML;
+    public void setWebXmlFragment(String s) {
+        webxmlFile = resolveFile(s).getAbsolutePath();
+        webxmlLevel = INC_WEBXML;
     }
 
     /**
      * File where we generate a complete web.xml with the class definitions.
      */
-    public void setWebXml( String s ) {
-        webxmlFile=resolveFile(s).getAbsolutePath();
-        webxmlLevel=ALL_WEBXML;
+    public void setWebXml(String s) {
+        webxmlFile = resolveFile(s).getAbsolutePath();
+        webxmlLevel = ALL_WEBXML;
     }
 
     /**
@@ -751,19 +758,18 @@
         return tagPluginManager;
     }
 
-    public void generateWebMapping( String file, JspCompilationContext clctxt )
-        throws IOException
-    {
+    public void generateWebMapping(String file, JspCompilationContext clctxt)
+            throws IOException {
         if (log.isDebugEnabled()) {
             log.debug("Generating web mapping for file " + file
-                      + " using compilation context " + clctxt);
+                    + " using compilation context " + clctxt);
         }
 
         String className = clctxt.getServletClassName();
         String packageName = clctxt.getServletPackageName();
 
         String thisServletName;
-        if  ("".equals(packageName)) {
+        if ("".equals(packageName)) {
             thisServletName = className;
         } else {
             thisServletName = packageName + '.' + className;
@@ -787,8 +793,7 @@
     }
 
     private void processFile(String file)
-        throws JasperException
-    {
+            throws JasperException {
         if (log.isDebugEnabled()) {
             log.debug("Processing file: " + file);
         }
@@ -805,9 +810,9 @@
                 scratchDir = new File(new File(temp).getAbsolutePath());
             }
 
-            String jspUri=file.replace('\\','/');
+            String jspUri = file.replace('\\', '/');
             JspCompilationContext clctxt = new JspCompilationContext
-                ( jspUri, false,  this, context, null, rctxt, classLoaderInterface );
+                    (jspUri, false, this, context, null, rctxt, classLoaderInterface);
 
             /* Override the defaults */
             if ((targetClassName != null) && (targetClassName.length() > 0)) {
@@ -819,8 +824,8 @@
             }
 
             originalClassLoader = Thread.currentThread().getContextClassLoader();
-            if( loader==null ) {
-                initClassLoader( clctxt );
+            if (loader == null) {
+                initClassLoader(clctxt);
             }
             Thread.currentThread().setContextClassLoader(loader);
 
@@ -833,7 +838,7 @@
             // .jsp file is newer than .class file;
             // Otherwise only generate .java, if .jsp file is newer than
             // the .java file
-            if( clc.isOutDated(compile) ) {
+            if (clc.isOutDated(compile)) {
                 if (log.isDebugEnabled()) {
                     log.debug(jspUri + " is out dated, compiling...");
                 }
@@ -842,9 +847,9 @@
             }
 
             // Generate mapping
-            generateWebMapping( file, clctxt );
-            if ( showSuccess ) {
-                log.info( "Built File: " + file );
+            generateWebMapping(file, clctxt);
+            if (showSuccess) {
+                log.info("Built File: " + file);
             }
 
             this.sourceCode = clctxt.getSourceCode();
@@ -857,25 +862,26 @@
             }
             if (rootCause != je) {
                 log.error(Localizer.getMessage("jspc.error.generalException",
-                                               file),
-                          rootCause);
+                        file),
+                        rootCause);
             }
 
             // Bugzilla 35114.
-            if(getFailOnError()) {
+            if (getFailOnError()) {
                 throw je;
             } else {
-                log.error(je.getMessage(), je);;
+                log.error(je.getMessage(), je);
+                ;
             }
 
         } catch (Exception e) {
             if ((e instanceof FileNotFoundException) && log.isWarnEnabled()) {
                 log.warn(Localizer.getMessage("jspc.error.fileDoesNotExist",
-                                              e.getMessage()));
+                        e.getMessage()));
             }
             throw new JasperException(e);
         } finally {
-            if(originalClassLoader != null) {
+            if (originalClassLoader != null) {
                 Thread.currentThread().setContextClassLoader(originalClassLoader);
             }
         }
@@ -892,12 +898,12 @@
      * @throws JasperException If an error occurs
      */
     public void execute() throws JasperException {
-        if(log.isDebugEnabled()) {
+        if (log.isDebugEnabled()) {
             log.debug("execute() starting for " + pages.size() + " pages.");
         }
 
         try {
-            if( context==null ) {
+            if (context == null) {
                 initServletContext();
             }
 
@@ -906,12 +912,12 @@
             Iterator iter = pages.iterator();
             while (iter.hasNext()) {
                 String nextjsp = iter.next().toString();
-              
+
                 processFile(nextjsp);
             }
 
             completeWebXml();
-        }catch (JasperException je) {
+        } catch (JasperException je) {
             Throwable rootCause = je;
             while (rootCause instanceof JasperException
                     && ((JasperException) rootCause).getRootCause() != null) {
@@ -932,7 +938,7 @@
 
     private String nextArg() {
         if ((argPos >= args.length)
-            || (fullstop = SWITCH_FULL_STOP.equals(args[argPos]))) {
+                || (fullstop = SWITCH_FULL_STOP.equals(args[argPos]))) {
             return null;
         } else {
             return args[argPos++];
@@ -963,7 +969,7 @@
             if (webxmlLevel >= ALL_WEBXML) {
                 mapout.write(Localizer.getMessage("jspc.webxml.header"));
                 mapout.flush();
-            } else if ((webxmlLevel>= INC_WEBXML)) {
+            } else if ((webxmlLevel >= INC_WEBXML)) {
                 mapout.write(Localizer.getMessage("jspc.webinc.header"));
                 mapout.flush();
             }
@@ -993,10 +999,10 @@
 
     private void initServletContext() {
 
-            context =new JspCServletContext
+        context = new JspCServletContext
                 (new PrintWriter(System.out),
-                 classLoaderInterface);
-            tldLocationsCache = new TldLocationsCache(context, true);
+                        classLoaderInterface);
+        tldLocationsCache = new TldLocationsCache(context, true);
 
         rctxt = new JspRuntimeContext(context, this);
         jspConfig = new JspConfig(context);
@@ -1011,7 +1017,7 @@
      * @throws IOException If an error occurs
      */
     private void initClassLoader(JspCompilationContext clctxt)
-        throws IOException {
+            throws IOException {
 
         classPath = getClassPath();
 
@@ -1019,7 +1025,7 @@
         // Turn the classPath into URLs
         ArrayList urls = new ArrayList();
         StringTokenizer tokenizer = new StringTokenizer(classPath,
-                                                        File.pathSeparator);
+                File.pathSeparator);
         while (tokenizer.hasMoreTokens()) {
             String path = tokenizer.nextToken();
             try {
@@ -1035,7 +1041,7 @@
 
         //TODO: add .tld files to the URLCLassLoader
 
-        URL urlsA[]=new URL[urls.size()];
+        URL urlsA[] = new URL[urls.size()];
         urls.toArray(urlsA);
         loader = new URLClassLoader(urlsA, this.getClass().getClassLoader());
 
@@ -1046,13 +1052,13 @@
      * in both Ant and command-line situations.  If Ant launched
      * us, we should use the basedir of the current project
      * to resolve relative paths.
-     *
+     * <p/>
      * See Bugzilla 35571.
      *
      * @param s The file
      * @return The file resolved
      */
-     protected File resolveFile(final String s) {
+    protected File resolveFile(final String s) {
         //TODO: what to do with this
         return new File(s);
     }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java
index 67a50b5..87aa5a8 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java
@@ -18,6 +18,8 @@
 package org.apache.struts2.jasper;
 
 import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.compiler.Compiler;
 import org.apache.struts2.jasper.compiler.*;
 import org.apache.struts2.jasper.servlet.JasperLoader;
@@ -37,9 +39,9 @@
  * A place holder for various things that are used through out the JSP
  * engine. This is a per-request/per-context data structure. Some of
  * the instance variables are set at different points.
- *
+ * <p/>
  * Most of the path-related stuff is here - mangling names, versions, dirs,
- * loading resources and dealing with uris. 
+ * loading resources and dealing with uris.
  *
  * @author Anil K. Vijendran
  * @author Harish Prabandham
@@ -49,8 +51,7 @@
  */
 public class JspCompilationContext {
 
-    protected org.apache.commons.logging.Log log =
-        org.apache.commons.logging.LogFactory.getLog(JspCompilationContext.class);
+    private Logger log = LoggerFactory.getLogger(JspCompilationContext.class);
 
     private Hashtable tagFileJarUrls;
     private boolean isPackagedTagFile;
@@ -119,7 +120,7 @@
     }
 
     public JspCompilationContext(String tagfile,
-                                 TagInfo tagInfo, 
+                                 TagInfo tagInfo,
                                  Options options,
                                  ServletContext context,
                                  JspServletWrapper jsw,
@@ -135,20 +136,20 @@
     }
 
     /* ==================== Methods to override ==================== */
-    
+
     /** ---------- Class path and loader ---------- */
 
     /**
-     * The classpath that is passed off to the Java compiler. 
+     * The classpath that is passed off to the Java compiler.
      */
     public String getClassPath() {
-        if( classPath != null )
+        if (classPath != null)
             return classPath;
         return rctxt.getClassPath();
     }
 
     /**
-     * The classpath that is passed off to the Java compiler. 
+     * The classpath that is passed off to the Java compiler.
      */
     public void setClassPath(String classPath) {
         this.classPath = classPath;
@@ -159,7 +160,7 @@
      * this JSP?
      */
     public ClassLoader getClassLoader() {
-        if( loader != null )
+        if (loader != null)
             return loader;
         return rctxt.getParentClassLoader();
     }
@@ -169,22 +170,22 @@
     }
 
     public ClassLoader getJspLoader() {
-        if( jspLoader == null ) {
+        if (jspLoader == null) {
             jspLoader = new JasperLoader
-            (new URL[] {baseUrl},
-                    getClassLoader(),
-                    rctxt.getPermissionCollection(),
-                    rctxt.getCodeSource());
+                    (new URL[]{baseUrl},
+                            getClassLoader(),
+                            rctxt.getPermissionCollection(),
+                            rctxt.getCodeSource());
         }
         return jspLoader;
     }
 
     /** ---------- Input/Output  ---------- */
-    
+
     /**
      * Create a "Compiler" object based on some init param data. This
      * is not done yet. Right now we're just hardcoding the actual
-     * compilers that are created. 
+     * compilers that are created.
      */
     public Compiler createCompiler() throws JasperException {
         jspCompiler = new CustomCompiler();
@@ -193,7 +194,7 @@
     }
 
     private Compiler createCompiler(String className) {
-        Compiler compiler = null; 
+        Compiler compiler = null;
         try {
             compiler = (Compiler) Class.forName(className).newInstance();
         } catch (Throwable t) {
@@ -203,7 +204,7 @@
         }
         return compiler;
     }
-    
+
     public Compiler getCompiler() {
         return jspCompiler;
     }
@@ -213,7 +214,8 @@
     /**
      * Gets a resource as a stream, relative to the meanings of this
      * context's implementation.
-     * @return a null if the resource cannot be found or represented 
+     *
+     * @return a null if the resource cannot be found or represented
      *         as an InputStream.
      */
     public java.io.InputStream getResourceAsStream(String res) {
@@ -233,7 +235,7 @@
         return context.getResourcePaths(canonicalURI(path));
     }
 
-    /** 
+    /**
      * Gets the actual path of a URI relative to the context of
      * the compilation.
      */
@@ -248,9 +250,9 @@
      * Returns the tag-file-name-to-JAR-file map of this compilation unit,
      * which maps tag file names to the JAR files in which the tag files are
      * packaged.
-     *
+     * <p/>
      * The map is populated when parsing the tag-file elements of the TLDs
-     * of any imported taglibs. 
+     * of any imported taglibs.
      */
     public Hashtable getTagFileJarUrls() {
         return this.tagFileJarUrls;
@@ -270,7 +272,7 @@
 
     /**
      * Just the class name (does not include package name) of the
-     * generated class. 
+     * generated class.
      */
     public String getServletClassName() {
 
@@ -294,10 +296,10 @@
     public void setServletClassName(String className) {
         this.className = className;
     }
-    
+
     /**
      * Path of the JSP URI. Note that this is not a file name. This is
-     * the context rooted URI of the JSP file. 
+     * the context rooted URI of the JSP file.
      */
     public String getJspFile() {
         return jspUri;
@@ -305,7 +307,7 @@
 
     /**
      * Are we processing something that has been declared as an
-     * errorpage? 
+     * errorpage?
      */
     public boolean isErrorPage() {
         return isErrPage;
@@ -368,11 +370,11 @@
         if (derivedPackageName == null) {
             int iSep = jspUri.lastIndexOf('/');
             derivedPackageName = (iSep > 0) ?
-                    JspUtil.makeJavaPackage(jspUri.substring(0,iSep)) : "";
+                    JspUtil.makeJavaPackage(jspUri.substring(0, iSep)) : "";
         }
         return derivedPackageName;
     }
-	    
+
     /**
      * The package name into which the servlet class is generated.
      */
@@ -382,13 +384,13 @@
 
     /**
      * Full path name of the Java file into which the servlet is being
-     * generated. 
+     * generated.
      */
     public String getServletJavaFileName() {
 
         if (servletJavaFileName == null) {
             servletJavaFileName =
-		 getServletClassName() + ".java";
+                    getServletClassName() + ".java";
         }
         return servletJavaFileName;
     }
@@ -398,7 +400,7 @@
     }
 
     /**
-     * Get hold of the Options object for this context. 
+     * Get hold of the Options object for this context.
      */
     public Options getOptions() {
         return options;
@@ -422,12 +424,12 @@
         }
 
         if (isTagFile()) {
-	    String tagName = tagInfo.getTagClassName();
+            String tagName = tagInfo.getTagClassName();
             javaPath = tagName.replace('.', '/') + ".java";
         } else {
             javaPath = getServletPackageName().replace('.', '/') + '/' +
-                       getServletClassName() + ".java";
-	}
+                    getServletClassName() + ".java";
+        }
         return javaPath;
     }
 
@@ -435,13 +437,13 @@
 
         if (classFileName == null) {
             classFileName = getServletClassName() + ".class";
-        } 
+        }
         return classFileName;
     }
 
     /**
      * Get the content type of this JSP.
-     *
+     * <p/>
      * Content type includes content type and encoding.
      */
     public String getContentType() {
@@ -465,16 +467,16 @@
 
     /**
      * Gets the 'location' of the TLD associated with the given taglib 'uri'.
-     * 
+     *
      * @return An array of two Strings: The first element denotes the real
-     * path to the TLD. If the path to the TLD points to a jar file, then the
-     * second element denotes the name of the TLD entry in the jar file.
-     * Returns null if the given uri is not associated with any tag library
-     * 'exposed' in the web application.
+     *         path to the TLD. If the path to the TLD points to a jar file, then the
+     *         second element denotes the name of the TLD entry in the jar file.
+     *         Returns null if the given uri is not associated with any tag library
+     *         'exposed' in the web application.
      */
     public String[] getTldLocation(String uri) throws JasperException {
-        String[] location = 
-            getOptions().getTldLocationsCache().getLocation(uri);
+        String[] location =
+                getOptions().getTldLocationsCache().getLocation(uri);
         return location;
     }
 
@@ -490,21 +492,21 @@
     public void incrementRemoved() {
         if (removed > 1) {
             jspCompiler.removeGeneratedFiles();
-            if( rctxt != null )
+            if (rctxt != null)
                 rctxt.removeWrapper(jspUri);
         }
         removed++;
     }
 
     public boolean isRemoved() {
-        if (removed > 1 ) {
+        if (removed > 1) {
             return true;
         }
         return false;
     }
 
     // ==================== Compile and reload ====================
-    
+
     public void compile() throws JasperException, FileNotFoundException {
         createCompiler();
         if (isPackagedTagFile || jspCompiler.isOutDated()) {
@@ -520,8 +522,8 @@
             } catch (Exception ex) {
                 ex.printStackTrace();
                 JasperException je = new JasperException(
-                            Localizer.getMessage("jsp.error.unable.compile"),
-                            ex);
+                        Localizer.getMessage("jsp.error.unable.compile"),
+                        ex);
                 // Cache compilation exception
                 jsw.setCompilationException(je);
                 throw je;
@@ -535,12 +537,11 @@
 
 // ==================== Manipulating the class ====================
 
-    public Class load() 
-        throws JasperException, FileNotFoundException
-    {
+    public Class load()
+            throws JasperException, FileNotFoundException {
         try {
             getJspLoader();
-            
+
             String name;
             if (isTagFile()) {
                 name = tagInfo.getTagClassName();
@@ -550,10 +551,10 @@
             servletClass = jspLoader.loadClass(name);
         } catch (ClassNotFoundException cex) {
             throw new JasperException(Localizer.getMessage("jsp.error.unable.load"),
-                                      cex);
+                    cex);
         } catch (Exception ex) {
             throw new JasperException(Localizer.getMessage("jsp.error.unable.compile"),
-                                      ex);
+                    ex);
         }
         removed = 0;
         return servletClass;
@@ -564,66 +565,66 @@
     static Object outputDirLock = new Object();
 
     private static final boolean isPathSeparator(char c) {
-       return (c == '/' || c == '\\');
+        return (c == '/' || c == '\\');
     }
 
     public static final String canonicalURI(String s) {
-       if (s == null) return null;
-       StringBuffer result = new StringBuffer();
-       final int len = s.length();
-       int pos = 0;
-       while (pos < len) {
-           char c = s.charAt(pos);
-           if ( isPathSeparator(c) ) {
-               /*
+        if (s == null) return null;
+        StringBuffer result = new StringBuffer();
+        final int len = s.length();
+        int pos = 0;
+        while (pos < len) {
+            char c = s.charAt(pos);
+            if (isPathSeparator(c)) {
+                /*
                 * multiple path separators.
                 * 'foo///bar' -> 'foo/bar'
                 */
-               while (pos+1 < len && isPathSeparator(s.charAt(pos+1))) {
-                   ++pos;
-               }
+                while (pos + 1 < len && isPathSeparator(s.charAt(pos + 1))) {
+                    ++pos;
+                }
 
-               if (pos+1 < len && s.charAt(pos+1) == '.') {
-                   /*
+                if (pos + 1 < len && s.charAt(pos + 1) == '.') {
+                    /*
                     * a single dot at the end of the path - we are done.
                     */
-                   if (pos+2 >= len) break;
+                    if (pos + 2 >= len) break;
 
-                   switch (s.charAt(pos+2)) {
-                       /*
+                    switch (s.charAt(pos + 2)) {
+                        /*
                         * self directory in path
                         * foo/./bar -> foo/bar
                         */
-                   case '/':
-                   case '\\':
-                       pos += 2;
-                       continue;
+                        case '/':
+                        case '\\':
+                            pos += 2;
+                            continue;
 
-                       /*
-                        * two dots in a path: go back one hierarchy.
-                        * foo/bar/../baz -> foo/baz
-                        */
-                   case '.':
-                       // only if we have exactly _two_ dots.
-                       if (pos+3 < len && isPathSeparator(s.charAt(pos+3))) {
-                           pos += 3;
-                           int separatorPos = result.length()-1;
-                           while (separatorPos >= 0 && 
-                                  ! isPathSeparator(result
-                                                    .charAt(separatorPos))) {
-                               --separatorPos;
-                           }
-                           if (separatorPos >= 0)
-                               result.setLength(separatorPos);
-                           continue;
-                       }
-                   }
-               }
-           }
-           result.append(c);
-           ++pos;
-       }
-       return result.toString();
+                            /*
+                            * two dots in a path: go back one hierarchy.
+                            * foo/bar/../baz -> foo/baz
+                            */
+                        case '.':
+                            // only if we have exactly _two_ dots.
+                            if (pos + 3 < len && isPathSeparator(s.charAt(pos + 3))) {
+                                pos += 3;
+                                int separatorPos = result.length() - 1;
+                                while (separatorPos >= 0 &&
+                                        !isPathSeparator(result
+                                                .charAt(separatorPos))) {
+                                    --separatorPos;
+                                }
+                                if (separatorPos >= 0)
+                                    result.setLength(separatorPos);
+                                continue;
+                            }
+                    }
+                }
+            }
+            result.append(c);
+            ++pos;
+        }
+        return result.toString();
     }
 }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Options.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Options.java
index c008f6d..0c08270 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Options.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/Options.java
@@ -25,7 +25,7 @@
 import java.util.Map;
 
 /**
- * A class to hold all init parameters specific to the JSP engine. 
+ * A class to hold all init parameters specific to the JSP engine.
  *
  * @author Anil K. Vijendran
  * @author Hans Bergsten
@@ -59,7 +59,7 @@
      * Should errors be sent to client or thrown into stderr?
      */
     public boolean getSendErrorToClient();
- 
+
     /**
      * Should we include debug information in compiled class?
      */
@@ -93,7 +93,7 @@
     public boolean getTrimSpaces();
 
     /**
-     * Class ID for use in the plugin tag when the browser is IE. 
+     * Class ID for use in the plugin tag when the browser is IE.
      */
     public String getIeClassId();
 
@@ -121,18 +121,18 @@
     /**
      * Compiler source VM, e.g. 1.3, 1.4, or 1.5.
      */
-    public String getCompilerSourceVM();   
+    public String getCompilerSourceVM();
 
     /**
      * The cache for the location of the TLD's
      * for the various tag libraries 'exposed'
      * by the web application.
-     * A tag library is 'exposed' either explicitely in 
-     * web.xml or implicitely via the uri tag in the TLD 
+     * A tag library is 'exposed' either explicitely in
+     * web.xml or implicitely via the uri tag in the TLD
      * of a taglib deployed in a jar file (WEB-INF/lib).
      *
      * @return the instance of the TldLocationsCache
-     * for the web-application.
+     *         for the web-application.
      */
     public TldLocationsCache getTldLocationsCache();
 
@@ -148,7 +148,7 @@
     public boolean getFork();
 
     /**
-     * Obtain JSP configuration informantion specified in web.xml.  
+     * Obtain JSP configuration informantion specified in web.xml.
      */
     public JspConfig getJspConfig();
 
@@ -166,24 +166,24 @@
      * Are Text strings to be generated as char arrays?
      */
     public boolean genStringAsCharArray();
-    
+
     /**
      * Modification test interval.
      */
     public int getModificationTestInterval();
-    
+
     /**
      * Is caching enabled (used for precompilation).
      */
     public boolean isCaching();
-    
+
     /**
      * The web-application wide cache for the returned TreeNode
      * by parseXMLDocument in TagLibraryInfoImpl.parseTLD,
      * if isCaching returns true.
-     * 
+     *
      * @return the Map(String uri, TreeNode tld) instance.
      */
     public Map getCache();
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/BeanRepository.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/BeanRepository.java
index 6021e04..a508ee3 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/BeanRepository.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/BeanRepository.java
@@ -23,7 +23,7 @@
 import java.util.Vector;
 
 /**
- * Repository of {page, request, session, application}-scoped beans 
+ * Repository of {page, request, session, application}-scoped beans
  *
  * @author Mandar Raje
  */
@@ -39,73 +39,73 @@
 
     /*
      * Constructor.
-     */    
+     */
     public BeanRepository(ClassLoader loader, ErrorDispatcher err) {
 
         this.loader = loader;
-	this.errDispatcher = err;
+        this.errDispatcher = err;
 
-	sessionBeans = new Vector(11);
-	pageBeans = new Vector(11);
-	appBeans = new Vector(11);
-	requestBeans = new Vector(11);
-	beanTypes = new Hashtable();
+        sessionBeans = new Vector(11);
+        pageBeans = new Vector(11);
+        appBeans = new Vector(11);
+        requestBeans = new Vector(11);
+        beanTypes = new Hashtable();
     }
-        
+
     public void addBean(Node.UseBean n, String s, String type, String scope)
-	    throws JasperException {
+            throws JasperException {
 
-	if (scope == null || scope.equals("page")) {
-	    pageBeans.addElement(s);	
-	} else if (scope.equals("request")) {
-	    requestBeans.addElement(s);
-	} else if (scope.equals("session")) {
-	    sessionBeans.addElement(s);
-	} else if (scope.equals("application")) {
-	    appBeans.addElement(s);
-	} else {
-	    errDispatcher.jspError(n, "jsp.error.usebean.badScope");
-	}
-	
-	putBeanType(s, type);
+        if (scope == null || scope.equals("page")) {
+            pageBeans.addElement(s);
+        } else if (scope.equals("request")) {
+            requestBeans.addElement(s);
+        } else if (scope.equals("session")) {
+            sessionBeans.addElement(s);
+        } else if (scope.equals("application")) {
+            appBeans.addElement(s);
+        } else {
+            errDispatcher.jspError(n, "jsp.error.usebean.badScope");
+        }
+
+        putBeanType(s, type);
     }
-            
+
     public Class getBeanType(String bean) throws JasperException {
-	Class clazz = null;
-	try {
-	    clazz = loader.loadClass ((String)beanTypes.get(bean));
-	} catch (ClassNotFoundException ex) {
-	    throw new JasperException (ex);
-	}
-	return clazz;
+        Class clazz = null;
+        try {
+            clazz = loader.loadClass((String) beanTypes.get(bean));
+        } catch (ClassNotFoundException ex) {
+            throw new JasperException(ex);
+        }
+        return clazz;
     }
-      
-    public boolean checkVariable (String bean) {
-	// XXX Not sure if this is the correct way.
-	// After pageContext is finalised this will change.
-	return (checkPageBean(bean) || checkSessionBean(bean) ||
-		checkRequestBean(bean) || checkApplicationBean(bean));
+
+    public boolean checkVariable(String bean) {
+        // XXX Not sure if this is the correct way.
+        // After pageContext is finalised this will change.
+        return (checkPageBean(bean) || checkSessionBean(bean) ||
+                checkRequestBean(bean) || checkApplicationBean(bean));
     }
 
 
     private void putBeanType(String bean, String type) {
-	beanTypes.put (bean, type);
+        beanTypes.put(bean, type);
     }
 
-    private boolean checkPageBean (String s) {
-	return pageBeans.contains (s);
+    private boolean checkPageBean(String s) {
+        return pageBeans.contains(s);
     }
 
-    private boolean checkRequestBean (String s) {
-	return requestBeans.contains (s);
+    private boolean checkRequestBean(String s) {
+        return requestBeans.contains(s);
     }
 
-    private boolean checkSessionBean (String s) {
-	return sessionBeans.contains (s);
+    private boolean checkSessionBean(String s) {
+        return sessionBeans.contains(s);
     }
 
-    private boolean checkApplicationBean (String s) {
-	return appBeans.contains (s);
+    private boolean checkApplicationBean(String s) {
+        return appBeans.contains(s);
     }
 
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Collector.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Collector.java
index 959a71d..88cec9b 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Collector.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Collector.java
@@ -76,7 +76,7 @@
                 scriptingElementSeen = true;
             }
             usebeanSeen = true;
-                visitBody(n);
+            visitBody(n);
         }
 
         public void visit(Node.PlugIn n) throws JasperException {
@@ -91,16 +91,15 @@
 
         public void visit(Node.CustomTag n) throws JasperException {
             // Check to see what kinds of element we see as child elements
-            checkSeen( n.getChildInfo(), n );
+            checkSeen(n.getChildInfo(), n);
         }
 
         /**
          * Check all child nodes for various elements and update the given
          * ChildInfo object accordingly.  Visits body in the process.
          */
-        private void checkSeen( Node.ChildInfo ci, Node n )
-            throws JasperException
-        {
+        private void checkSeen(Node.ChildInfo ci, Node n)
+                throws JasperException {
             // save values collected so far
             boolean scriptingElementSeenSave = scriptingElementSeen;
             scriptingElementSeen = false;
@@ -116,8 +115,8 @@
             hasScriptingVars = false;
 
             // Scan attribute list for expressions
-            if( n instanceof Node.CustomTag ) {
-                Node.CustomTag ct = (Node.CustomTag)n;
+            if (n instanceof Node.CustomTag) {
+                Node.CustomTag ct = (Node.CustomTag) n;
                 Node.JspAttribute[] attrs = ct.getJspAttributes();
                 for (int i = 0; attrs != null && i < attrs.length; i++) {
                     if (attrs[i].isExpression()) {
@@ -129,14 +128,14 @@
 
             visitBody(n);
 
-            if( (n instanceof Node.CustomTag) && !hasScriptingVars) {
-                Node.CustomTag ct = (Node.CustomTag)n;
+            if ((n instanceof Node.CustomTag) && !hasScriptingVars) {
+                Node.CustomTag ct = (Node.CustomTag) n;
                 hasScriptingVars = ct.getVariableInfos().length > 0 ||
-                    ct.getTagVariableInfos().length > 0;
+                        ct.getTagVariableInfos().length > 0;
             }
 
             // Record if the tag element and its body contains any scriptlet.
-            ci.setScriptless(! scriptingElementSeen);
+            ci.setScriptless(!scriptingElementSeen);
             ci.setHasUseBean(usebeanSeen);
             ci.setHasIncludeAction(includeActionSeen);
             ci.setHasParamAction(paramActionSeen);
@@ -167,11 +166,11 @@
         }
 
         public void visit(Node.JspBody n) throws JasperException {
-            checkSeen( n.getChildInfo(), n );
+            checkSeen(n.getChildInfo(), n);
         }
 
         public void visit(Node.NamedAttribute n) throws JasperException {
-            checkSeen( n.getChildInfo(), n );
+            checkSeen(n.getChildInfo(), n);
         }
 
         public void visit(Node.Declaration n) throws JasperException {
@@ -187,15 +186,15 @@
         }
 
         public void updatePageInfo(PageInfo pageInfo) {
-            pageInfo.setScriptless(! scriptingElementSeen);
+            pageInfo.setScriptless(!scriptingElementSeen);
         }
     }
 
 
     public static void collect(Compiler compiler, Node.Nodes page)
-        throws JasperException {
+            throws JasperException {
 
-    CollectVisitor collectVisitor = new CollectVisitor();
+        CollectVisitor collectVisitor = new CollectVisitor();
         page.visit(collectVisitor);
         collectVisitor.updatePageInfo(compiler.getPageInfo());
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Compiler.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Compiler.java
index c7780c0..b70cc1b 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Compiler.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Compiler.java
@@ -17,6 +17,8 @@
 
 package org.apache.struts2.jasper.compiler;
 
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.JasperException;
 import org.apache.struts2.jasper.JspCompilationContext;
 import org.apache.struts2.jasper.Options;
@@ -39,8 +41,7 @@
  * @author Mark Roth
  */
 public abstract class Compiler {
-    protected org.apache.commons.logging.Log log=
-        org.apache.commons.logging.LogFactory.getLog( Compiler.class );
+    private Logger log = LoggerFactory.getLogger(Compiler.class);
 
     // ----------------------------------------------------------------- Static
 
@@ -82,8 +83,9 @@
         return this.pageNodes;
     }
 
-    /** 
+    /**
      * Compile the jsp file into equivalent servlet in .java file
+     *
      * @return a smap for the current JSP page, if one is generated,
      *         null otherwise
      */
@@ -94,19 +96,19 @@
         long t1, t2, t3, t4;
 
         t1 = t2 = t3 = t4 = 0;
-      
+
         if (log.isDebugEnabled()) {
             t1 = System.currentTimeMillis();
         }
 
         // Setup page info area
         pageInfo = new PageInfo(new BeanRepository(ctxt.getClassLoader(),
-                                                   errDispatcher),
-                                                   ctxt.getJspFile());
+                errDispatcher),
+                ctxt.getJspFile());
 
         JspConfig jspConfig = options.getJspConfig();
         JspConfig.JspProperty jspProperty =
-            jspConfig.findJspProperty(ctxt.getJspFile());
+                jspConfig.findJspProperty(ctxt.getJspFile());
 
         /*
          * If the current uri is matched by a pattern specified in
@@ -114,9 +116,9 @@
          * those properties.
          */
         pageInfo.setELIgnored(JspUtil.booleanValue(
-                                            jspProperty.isELIgnored()));
+                jspProperty.isELIgnored()));
         pageInfo.setScriptingInvalid(JspUtil.booleanValue(
-                                            jspProperty.isScriptingInvalid()));
+                jspProperty.isScriptingInvalid()));
         if (jspProperty.getIncludePrelude() != null) {
             pageInfo.setIncludePrelude(jspProperty.getIncludePrelude());
         }
@@ -131,14 +133,14 @@
             // Setup the ServletWriter
             String javaEncoding = ctxt.getOptions().getJavaEncoding();
             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
-            OutputStreamWriter osw = null; 
+            OutputStreamWriter osw = null;
 
             try {
                 osw = new OutputStreamWriter(
-                            byteArrayOutputStream, javaEncoding);
+                        byteArrayOutputStream, javaEncoding);
             } catch (UnsupportedEncodingException ex) {
                 errDispatcher.jspError("jsp.error.needAlternateJavaEncoding",
-                                       javaEncoding);
+                        javaEncoding);
             }
 
             writer = new ServletWriter(new PrintWriter(osw));
@@ -177,7 +179,7 @@
             if (log.isDebugEnabled()) {
                 t3 = System.currentTimeMillis();
             }
-        
+
             // Determine which custom tag needs to declare which scripting vars
             ScriptingVariabler.set(pageNodes, errDispatcher);
 
@@ -203,9 +205,9 @@
             ctxt.setSourceCode(byteArrayOutputStream.toString());
             if (log.isDebugEnabled()) {
                 t4 = System.currentTimeMillis();
-                log.debug("Generated "+ javaFileName + " total="
-                          + (t4-t1) + " generate=" + (t4-t3)
-                          + " validate=" + (t2-t1));
+                log.debug("Generated " + javaFileName + " total="
+                        + (t4 - t1) + " generate=" + (t4 - t3)
+                        + " validate=" + (t2 - t1));
             }
 
         } catch (Exception e) {
@@ -229,9 +231,9 @@
                 }
             }
         }
-        
+
         // JSR45 Support
-        if (! options.isSmapSuppressed()) {
+        if (!options.isSmapSuppressed()) {
             smapStr = SmapUtil.generateSmap(ctxt, pageNodes);
         }
 
@@ -245,31 +247,30 @@
         return smapStr;
     }
 
-    /** 
+    /**
      * Compile the servlet from .java file to .class file
      */
     protected abstract void generateClass(String[] smap)
-        throws FileNotFoundException, JasperException, Exception;
-    
-    
-    /** 
+            throws FileNotFoundException, JasperException, Exception;
+
+
+    /**
      * Compile the jsp file from the current engine context
      */
     public void compile()
-        throws FileNotFoundException, JasperException, Exception
-    {
+            throws FileNotFoundException, JasperException, Exception {
         compile(true);
     }
 
     /**
      * Compile the jsp file from the current engine context.  As an side-
      * effect, tag files that are referenced by this page are also compiled.
+     *
      * @param compileClass If true, generate both .java and .class file
      *                     If false, generate only .java file
      */
     public void compile(boolean compileClass)
-        throws FileNotFoundException, JasperException, Exception
-    {
+            throws FileNotFoundException, JasperException, Exception {
         compile(compileClass, false);
     }
 
@@ -279,11 +280,10 @@
      *
      * @param compileClass If true, generate both .java and .class file
      *                     If false, generate only .java file
-     * @param jspcMode true if invoked from JspC, false otherwise
+     * @param jspcMode     true if invoked from JspC, false otherwise
      */
     public void compile(boolean compileClass, boolean jspcMode)
-        throws FileNotFoundException, JasperException, Exception
-    {
+            throws FileNotFoundException, JasperException, Exception {
         if (errDispatcher == null) {
             this.errDispatcher = new ErrorDispatcher(jspcMode);
         }
@@ -309,7 +309,7 @@
             // In development mode, they are used for detailed
             // error messages.
             // http://issues.apache.org/bugzilla/show_bug.cgi?id=37062
-            if(!this.options.getDevelopment()) {
+            if (!this.options.getDevelopment()) {
                 pageNodes = null;
             }
 
@@ -321,12 +321,12 @@
     }
 
     /**
-     * This is a protected method intended to be overridden by 
+     * This is a protected method intended to be overridden by
      * subclasses of Compiler. This is used by the compile method
-     * to do all the compilation. 
+     * to do all the compilation.
      */
     public boolean isOutDated() {
-        return isOutDated( true );
+        return isOutDated(true);
     }
 
     /**
@@ -335,6 +335,7 @@
      * If the page has dependencies, the check is also extended to its
      * dependeants, and so on.
      * This method can by overidden by a subclasses of Compiler.
+     *
      * @param checkClass If true, check against .class file,
      *                   if false, check against .java file.
      */
@@ -344,16 +345,16 @@
 
         if (jsw != null
                 && (ctxt.getOptions().getModificationTestInterval() > 0)) {
- 
+
             if (jsw.getLastModificationTest()
-                    + (ctxt.getOptions().getModificationTestInterval() * 1000) 
+                    + (ctxt.getOptions().getModificationTestInterval() * 1000)
                     > System.currentTimeMillis()) {
                 return false;
             } else {
                 jsw.setLastModificationTest(System.currentTimeMillis());
             }
         }
-        
+
         long jspRealLastModified = 0;
         try {
             URL jspUrl = ctxt.getResource(jsp);
@@ -371,13 +372,13 @@
 
         long targetLastModified = 0;
         File targetFile;
-        
-        if( checkClass ) {
+
+        if (checkClass) {
             targetFile = new File(ctxt.getClassFileName());
         } else {
             targetFile = new File(ctxt.getServletJavaFileName());
         }
-        
+
         if (!targetFile.exists()) {
             return true;
         }
@@ -385,21 +386,21 @@
         targetLastModified = targetFile.lastModified();
         if (checkClass && jsw != null) {
             jsw.setServletClassLastModifiedTime(targetLastModified);
-        }   
+        }
         if (targetLastModified < jspRealLastModified) {
-            if( log.isDebugEnabled() ) {
+            if (log.isDebugEnabled()) {
                 log.debug("Compiler: outdated: " + targetFile + " " +
-                    targetLastModified );
+                        targetLastModified);
             }
             return true;
         }
 
         // determine if source dependent files (e.g. includes using include
         // directives) have been changed.
-        if( jsw==null ) {
+        if (jsw == null) {
             return false;
         }
-        
+
         List depends = jsw.getDependants();
         if (depends == null) {
             return false;
@@ -407,7 +408,7 @@
 
         Iterator it = depends.iterator();
         while (it.hasNext()) {
-            String include = (String)it.next();
+            String include = (String) it.next();
             try {
                 URL includeUrl = ctxt.getResource(include);
                 if (includeUrl == null) {
@@ -431,7 +432,7 @@
 
     }
 
-    
+
     /**
      * Gets the error dispatcher.
      */
@@ -461,8 +462,8 @@
             String classFileName = ctxt.getClassFileName();
             if (classFileName != null) {
                 File classFile = new File(classFileName);
-                if( log.isDebugEnabled() )
-                    log.debug( "Deleting " + classFile );
+                if (log.isDebugEnabled())
+                    log.debug("Deleting " + classFile);
                 classFile.delete();
             }
         } catch (Exception e) {
@@ -472,8 +473,8 @@
             String javaFileName = ctxt.getServletJavaFileName();
             if (javaFileName != null) {
                 File javaFile = new File(javaFileName);
-                if( log.isDebugEnabled() )
-                    log.debug( "Deleting " + javaFile );
+                if (log.isDebugEnabled())
+                    log.debug("Deleting " + javaFile);
                 javaFile.delete();
             }
         } catch (Exception e) {
@@ -486,8 +487,8 @@
             String classFileName = ctxt.getClassFileName();
             if (classFileName != null) {
                 File classFile = new File(classFileName);
-                if( log.isDebugEnabled() )
-                    log.debug( "Deleting " + classFile );
+                if (log.isDebugEnabled())
+                    log.debug("Deleting " + classFile);
                 classFile.delete();
             }
         } catch (Exception e) {
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/DefaultErrorHandler.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/DefaultErrorHandler.java
index ec4b2c5..37e279b 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/DefaultErrorHandler.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/DefaultErrorHandler.java
@@ -25,63 +25,63 @@
  * @author Jan Luehe
  */
 class DefaultErrorHandler implements ErrorHandler {
-    
+
     /*
-     * Processes the given JSP parse error.
-     *
-     * @param fname Name of the JSP file in which the parse error occurred
-     * @param line Parse error line number
-     * @param column Parse error column number
-     * @param errMsg Parse error message
-     * @param exception Parse exception
-     */
+    * Processes the given JSP parse error.
+    *
+    * @param fname Name of the JSP file in which the parse error occurred
+    * @param line Parse error line number
+    * @param column Parse error column number
+    * @param errMsg Parse error message
+    * @param exception Parse exception
+    */
     public void jspError(String fname, int line, int column, String errMsg,
-            Exception ex) throws JasperException {
+                         Exception ex) throws JasperException {
         throw new JasperException(fname + "(" + line + "," + column + ")"
                 + " " + errMsg, ex);
     }
-    
+
     /*
-     * Processes the given JSP parse error.
-     *
-     * @param errMsg Parse error message
-     * @param exception Parse exception
-     */
+    * Processes the given JSP parse error.
+    *
+    * @param errMsg Parse error message
+    * @param exception Parse exception
+    */
     public void jspError(String errMsg, Exception ex) throws JasperException {
         throw new JasperException(errMsg, ex);
     }
-    
+
     /*
-     * Processes the given javac compilation errors.
-     *
-     * @param details Array of JavacErrorDetail instances corresponding to the
-     * compilation errors
-     */
+    * Processes the given javac compilation errors.
+    *
+    * @param details Array of JavacErrorDetail instances corresponding to the
+    * compilation errors
+    */
     public void javacError(JavacErrorDetail[] details) throws JasperException {
-        
+
         if (details == null) {
             return;
         }
-        
+
         Object[] args = null;
         StringBuffer buf = new StringBuffer();
-        
-        for (int i=0; i < details.length; i++) {
+
+        for (int i = 0; i < details.length; i++) {
             buf.append("\n");
             if (details[i].getJspBeginLineNumber() >= 0) {
-                args = new Object[] {
-                        new Integer(details[i].getJspBeginLineNumber()), 
-                        details[i].getJspFileName() };
+                args = new Object[]{
+                        new Integer(details[i].getJspBeginLineNumber()),
+                        details[i].getJspFileName()};
                 buf.append("\n");
                 buf.append(Localizer.getMessage("jsp.error.single.line.number",
                         args));
-                buf.append("\n"); 
+                buf.append("\n");
                 buf.append(details[i].getErrorMessage());
-                buf.append("\n"); 
+                buf.append("\n");
                 buf.append(details[i].getJspExtract());
             } else {
-                args = new Object[] {
-                        new Integer(details[i].getJavaLineNumber()) };
+                args = new Object[]{
+                        new Integer(details[i].getJavaLineNumber())};
                 buf.append("\n\n");
                 buf.append(Localizer.getMessage("jsp.error.java.line.number",
                         args));
@@ -92,18 +92,18 @@
         buf.append("\n\nStacktrace:");
         throw new JasperException(Localizer.getMessage("jsp.error.unable.compile") + ": " + buf);
     }
-    
+
     /**
      * Processes the given javac error report and exception.
      *
      * @param errorReport Compilation error report
-     * @param exception Compilation exception
+     * @param exception   Compilation exception
      */
     public void javacError(String errorReport, Exception exception)
-    throws JasperException {
-        
+            throws JasperException {
+
         throw new JasperException(
                 Localizer.getMessage("jsp.error.unable.compile"), exception);
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Dumper.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Dumper.java
index 2c6f947..5be9977 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Dumper.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Dumper.java
@@ -23,185 +23,185 @@
 class Dumper {
 
     static class DumpVisitor extends Node.Visitor {
-	private int indent = 0;
+        private int indent = 0;
 
-	private String getAttributes(Attributes attrs) {
-	    if (attrs == null)
-		return "";
+        private String getAttributes(Attributes attrs) {
+            if (attrs == null)
+                return "";
 
-	    StringBuffer buf = new StringBuffer();
-	    for (int i=0; i < attrs.getLength(); i++) {
-		buf.append(" " + attrs.getQName(i) + "=\""
-			   + attrs.getValue(i) + "\"");
-	    }
-	    return buf.toString();
-	}
+            StringBuffer buf = new StringBuffer();
+            for (int i = 0; i < attrs.getLength(); i++) {
+                buf.append(" " + attrs.getQName(i) + "=\""
+                        + attrs.getValue(i) + "\"");
+            }
+            return buf.toString();
+        }
 
-	private void printString(String str) {
-	    printIndent();
-	    System.out.print(str);
-	}
+        private void printString(String str) {
+            printIndent();
+            System.out.print(str);
+        }
 
-	private void printString(String prefix, char[] chars, String suffix) {
-	    String str = null;
-	    if (chars != null) {
-		str = new String(chars);
-	    }
-	    printString(prefix, str, suffix);
-	}
-	     
-	private void printString(String prefix, String str, String suffix) {
-	    printIndent();
-	    if (str != null) {
-		System.out.print(prefix + str + suffix);
-	    } else {
-		System.out.print(prefix + suffix);
-	    }
-	}
+        private void printString(String prefix, char[] chars, String suffix) {
+            String str = null;
+            if (chars != null) {
+                str = new String(chars);
+            }
+            printString(prefix, str, suffix);
+        }
 
-	private void printAttributes(String prefix, Attributes attrs,
-				     String suffix) {
-	    printString(prefix, getAttributes(attrs), suffix);
-	}
+        private void printString(String prefix, String str, String suffix) {
+            printIndent();
+            if (str != null) {
+                System.out.print(prefix + str + suffix);
+            } else {
+                System.out.print(prefix + suffix);
+            }
+        }
 
-	private void dumpBody(Node n) throws JasperException {
-	    Node.Nodes page = n.getBody();
-	    if (page != null) {
+        private void printAttributes(String prefix, Attributes attrs,
+                                     String suffix) {
+            printString(prefix, getAttributes(attrs), suffix);
+        }
+
+        private void dumpBody(Node n) throws JasperException {
+            Node.Nodes page = n.getBody();
+            if (page != null) {
 //		indent++;
-		page.visit(this);
+                page.visit(this);
 //		indent--;
-	    }
+            }
         }
 
         public void visit(Node.PageDirective n) throws JasperException {
-	    printAttributes("<%@ page", n.getAttributes(), "%>");
+            printAttributes("<%@ page", n.getAttributes(), "%>");
         }
 
         public void visit(Node.TaglibDirective n) throws JasperException {
-	    printAttributes("<%@ taglib", n.getAttributes(), "%>");
+            printAttributes("<%@ taglib", n.getAttributes(), "%>");
         }
 
         public void visit(Node.IncludeDirective n) throws JasperException {
-	    printAttributes("<%@ include", n.getAttributes(), "%>");
-	    dumpBody(n);
+            printAttributes("<%@ include", n.getAttributes(), "%>");
+            dumpBody(n);
         }
 
         public void visit(Node.Comment n) throws JasperException {
-	    printString("<%--", n.getText(), "--%>");
+            printString("<%--", n.getText(), "--%>");
         }
 
         public void visit(Node.Declaration n) throws JasperException {
-	    printString("<%!", n.getText(), "%>");
+            printString("<%!", n.getText(), "%>");
         }
 
         public void visit(Node.Expression n) throws JasperException {
-	    printString("<%=", n.getText(), "%>");
+            printString("<%=", n.getText(), "%>");
         }
 
         public void visit(Node.Scriptlet n) throws JasperException {
-	    printString("<%", n.getText(), "%>");
+            printString("<%", n.getText(), "%>");
         }
 
         public void visit(Node.IncludeAction n) throws JasperException {
-	    printAttributes("<jsp:include", n.getAttributes(), ">");
-	    dumpBody(n);
+            printAttributes("<jsp:include", n.getAttributes(), ">");
+            dumpBody(n);
             printString("</jsp:include>");
         }
 
         public void visit(Node.ForwardAction n) throws JasperException {
-	    printAttributes("<jsp:forward", n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</jsp:forward>");
+            printAttributes("<jsp:forward", n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</jsp:forward>");
         }
 
         public void visit(Node.GetProperty n) throws JasperException {
-	    printAttributes("<jsp:getProperty", n.getAttributes(), "/>");
+            printAttributes("<jsp:getProperty", n.getAttributes(), "/>");
         }
 
         public void visit(Node.SetProperty n) throws JasperException {
-	    printAttributes("<jsp:setProperty", n.getAttributes(), ">");
+            printAttributes("<jsp:setProperty", n.getAttributes(), ">");
             dumpBody(n);
             printString("</jsp:setProperty>");
         }
 
         public void visit(Node.UseBean n) throws JasperException {
-	    printAttributes("<jsp:useBean", n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</jsp:useBean>");
+            printAttributes("<jsp:useBean", n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</jsp:useBean>");
         }
-	
+
         public void visit(Node.PlugIn n) throws JasperException {
-	    printAttributes("<jsp:plugin", n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</jsp:plugin>");
-	}
-        
+            printAttributes("<jsp:plugin", n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</jsp:plugin>");
+        }
+
         public void visit(Node.ParamsAction n) throws JasperException {
-	    printAttributes("<jsp:params", n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</jsp:params>");
+            printAttributes("<jsp:params", n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</jsp:params>");
         }
-        
+
         public void visit(Node.ParamAction n) throws JasperException {
-	    printAttributes("<jsp:param", n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</jsp:param>");
+            printAttributes("<jsp:param", n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</jsp:param>");
         }
-        
+
         public void visit(Node.NamedAttribute n) throws JasperException {
-	    printAttributes("<jsp:attribute", n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</jsp:attribute>");
+            printAttributes("<jsp:attribute", n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</jsp:attribute>");
         }
 
         public void visit(Node.JspBody n) throws JasperException {
-	    printAttributes("<jsp:body", n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</jsp:body>");
+            printAttributes("<jsp:body", n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</jsp:body>");
         }
-        
+
         public void visit(Node.ELExpression n) throws JasperException {
-	    printString( "${" + new String( n.getText() ) + "}" );
+            printString("${" + new String(n.getText()) + "}");
         }
 
         public void visit(Node.CustomTag n) throws JasperException {
-	    printAttributes("<" + n.getQName(), n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</" + n.getQName() + ">");
+            printAttributes("<" + n.getQName(), n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</" + n.getQName() + ">");
         }
 
-	public void visit(Node.UninterpretedTag n) throws JasperException {
-	    String tag = n.getQName();
-	    printAttributes("<"+tag, n.getAttributes(), ">");
-	    dumpBody(n);
-	    printString("</" + tag + ">");
+        public void visit(Node.UninterpretedTag n) throws JasperException {
+            String tag = n.getQName();
+            printAttributes("<" + tag, n.getAttributes(), ">");
+            dumpBody(n);
+            printString("</" + tag + ">");
         }
 
-	public void visit(Node.TemplateText n) throws JasperException {
-	    printString(new String(n.getText()));
-	}
+        public void visit(Node.TemplateText n) throws JasperException {
+            printString(new String(n.getText()));
+        }
 
-	private void printIndent() {
-	    for (int i=0; i < indent; i++) {
-		System.out.print("  ");
-	    }
-	}
+        private void printIndent() {
+            for (int i = 0; i < indent; i++) {
+                System.out.print("  ");
+            }
+        }
     }
 
     public static void dump(Node n) {
-	try {
-	    n.accept(new DumpVisitor());	
-	} catch (JasperException e) {
-	    e.printStackTrace();
-	}
+        try {
+            n.accept(new DumpVisitor());
+        } catch (JasperException e) {
+            e.printStackTrace();
+        }
     }
 
     public static void dump(Node.Nodes page) {
-	try {
-	    page.visit(new DumpVisitor());
-	} catch (JasperException e) {
-	    e.printStackTrace();
-	}
+        try {
+            page.visit(new DumpVisitor());
+        } catch (JasperException e) {
+            e.printStackTrace();
+        }
     }
 }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELFunctionMapper.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELFunctionMapper.java
index f0289f9..17b5139 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELFunctionMapper.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELFunctionMapper.java
@@ -41,10 +41,10 @@
      * Creates the functions mappers for all EL expressions in the JSP page.
      *
      * @param compiler Current compiler, mainly for accessing error dispatcher.
-     * @param page The current compilation unit.
+     * @param page     The current compilation unit.
      */
-    public static void map(Compiler compiler, Node.Nodes page) 
-                throws JasperException {
+    public static void map(Compiler compiler, Node.Nodes page)
+            throws JasperException {
 
         ELFunctionMapper map = new ELFunctionMapper();
         map.ds = new StringBuffer();
@@ -66,7 +66,7 @@
      * for functions, and if found functions mappers are created.
      */
     class ELFunctionVisitor extends Node.Visitor {
-        
+
         /**
          * Use a global name map to facilitate reuse of function maps.
          * The key used is prefix:function:uri.
@@ -135,7 +135,7 @@
             doMap(n.getEL());
         }
 
-        private void doMap(Node.JspAttribute attr) 
+        private void doMap(Node.JspAttribute attr)
                 throws JasperException {
             if (attr != null) {
                 doMap(attr.getEL());
@@ -145,17 +145,18 @@
         /**
          * Creates function mappers, if needed, from ELNodes
          */
-        private void doMap(ELNode.Nodes el) 
+        private void doMap(ELNode.Nodes el)
                 throws JasperException {
 
             // Only care about functions in ELNode's
             class Fvisitor extends ELNode.Visitor {
                 ArrayList funcs = new ArrayList();
                 HashMap keyMap = new HashMap();
+
                 public void visit(ELNode.Function n) throws JasperException {
                     String key = n.getPrefix() + ":" + n.getName();
-                    if (! keyMap.containsKey(key)) {
-                        keyMap.put(key,"");
+                    if (!keyMap.containsKey(key)) {
+                        keyMap.put(key, "");
                         funcs.add(n);
                     }
                 }
@@ -180,7 +181,7 @@
                 el.setMapName(decName);
                 return;
             }
-        
+
             // Generate declaration for the map statically
             decName = getMapName();
             ss.append("static private org.apache.struts2.jasper.runtime.ProtectedFunctionMapper " + decName + ";\n");
@@ -199,9 +200,9 @@
 
             // Setup arguments for either getMapForFunction or mapFunction
             for (int i = 0; i < functions.size(); i++) {
-                ELNode.Function f = (ELNode.Function)functions.get(i);
+                ELNode.Function f = (ELNode.Function) functions.get(i);
                 FunctionInfo funcInfo = f.getFunctionInfo();
-                String key = f.getPrefix()+ ":" + f.getName();
+                String key = f.getPrefix() + ":" + f.getName();
                 ds.append(funcMethod + "(\"" + key + "\", " +
                         funcInfo.getFunctionClass() + ".class, " +
                         '\"' + f.getMethodName() + "\", " +
@@ -214,8 +215,7 @@
                     int iArray = params[k].indexOf('[');
                     if (iArray < 0) {
                         ds.append(params[k] + ".class");
-                    }
-                    else {
+                    } else {
                         String baseType = params[k].substring(0, iArray);
                         ds.append("java.lang.reflect.Array.newInstance(");
                         ds.append(baseType);
@@ -223,7 +223,7 @@
 
                         // Count the number of array dimension
                         int aCount = 0;
-                        for (int jj = iArray; jj < params[k].length(); jj++ ) {
+                        for (int jj = iArray; jj < params[k].length(); jj++) {
                             if (params[k].charAt(jj) == '[') {
                                 aCount++;
                             }
@@ -238,7 +238,7 @@
                 ds.append("});\n");
                 // Put the current name in the global function map
                 gMap.put(f.getPrefix() + ':' + f.getName() + ':' + f.getUri(),
-                         decName);
+                        decName);
             }
             el.setMapName(decName);
         }
@@ -246,6 +246,7 @@
         /**
          * Find the name of the function mapper for an EL.  Reuse a
          * previously generated one if possible.
+         *
          * @param functions An ArrayList of ELNode.Function instances that
          *                  represents the functions in an EL
          * @return A previous generated function mapper name that can be used
@@ -255,9 +256,9 @@
 
             String mapName = null;
             for (int i = 0; i < functions.size(); i++) {
-                ELNode.Function f = (ELNode.Function)functions.get(i);
+                ELNode.Function f = (ELNode.Function) functions.get(i);
                 String temName = (String) gMap.get(f.getPrefix() + ':' +
-                                        f.getName() + ':' + f.getUri());
+                        f.getName() + ':' + f.getUri());
                 if (temName == null) {
                     return null;
                 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELNode.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELNode.java
index 62587ac..85724b3 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELNode.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELNode.java
@@ -26,7 +26,7 @@
 
 /**
  * This class defines internal representation for an EL Expression
- *
+ * <p/>
  * It currently only defines functions.  It can be expanded to define
  * all the components of an EL expression, if need to.
  *
@@ -47,19 +47,19 @@
      */
     public static class Root extends ELNode {
 
-	private ELNode.Nodes expr;
+        private ELNode.Nodes expr;
 
-	Root(ELNode.Nodes expr) {
-	    this.expr = expr;
-	}
+        Root(ELNode.Nodes expr) {
+            this.expr = expr;
+        }
 
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
 
-	public ELNode.Nodes getExpression() {
-	    return expr;
-	}
+        public ELNode.Nodes getExpression() {
+            return expr;
+        }
     }
 
     /**
@@ -67,19 +67,19 @@
      */
     public static class Text extends ELNode {
 
-	private String text;
+        private String text;
 
-	Text(String text) {
-	    this.text = text;
-	}
+        Text(String text) {
+            this.text = text;
+        }
 
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
 
-	public String getText() {
-	    return text;
-	}
+        public String getText() {
+            return text;
+        }
     }
 
     /**
@@ -88,19 +88,19 @@
      */
     public static class ELText extends ELNode {
 
-	private String text;
+        private String text;
 
-	ELText(String text) {
-	    this.text = text;
-	}
+        ELText(String text) {
+            this.text = text;
+        }
 
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
 
-	public String getText() {
-	    return text;
-	}
+        public String getText() {
+            return text;
+        }
     }
 
     /**
@@ -110,61 +110,61 @@
      */
     public static class Function extends ELNode {
 
-	private String prefix;
-	private String name;
-	private String uri;
-	private FunctionInfo functionInfo;
-	private String methodName;
-	private String[] parameters;
+        private String prefix;
+        private String name;
+        private String uri;
+        private FunctionInfo functionInfo;
+        private String methodName;
+        private String[] parameters;
 
-	Function(String prefix, String name) {
-	    this.prefix = prefix;
-	    this.name = name;
-	}
+        Function(String prefix, String name) {
+            this.prefix = prefix;
+            this.name = name;
+        }
 
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
 
-	public String getPrefix() {
-	    return prefix;
-	}
+        public String getPrefix() {
+            return prefix;
+        }
 
-	public String getName() {
-	    return name;
-	}
+        public String getName() {
+            return name;
+        }
 
-	public void setUri(String uri) {
-	    this.uri = uri;
-	}
+        public void setUri(String uri) {
+            this.uri = uri;
+        }
 
-	public String getUri() {
-	    return uri;
-	}
+        public String getUri() {
+            return uri;
+        }
 
-	public void setFunctionInfo(FunctionInfo f) {
-	    this.functionInfo = f;
-	}
+        public void setFunctionInfo(FunctionInfo f) {
+            this.functionInfo = f;
+        }
 
-	public FunctionInfo getFunctionInfo() {
-	    return functionInfo;
-	}
+        public FunctionInfo getFunctionInfo() {
+            return functionInfo;
+        }
 
-	public void setMethodName(String methodName) {
-	    this.methodName = methodName;
-	}
+        public void setMethodName(String methodName) {
+            this.methodName = methodName;
+        }
 
-	public String getMethodName() {
-	    return methodName;
-	}
+        public String getMethodName() {
+            return methodName;
+        }
 
-	public void setParameters(String[] parameters) {
-	    this.parameters = parameters;
-	}
+        public void setParameters(String[] parameters) {
+            this.parameters = parameters;
+        }
 
-	public String[] getParameters() {
-	    return parameters;
-	}
+        public String[] getParameters() {
+            return parameters;
+        }
     }
 
     /**
@@ -172,61 +172,62 @@
      */
     public static class Nodes {
 
-	/* Name used for creating a map for the functions in this
-	   EL expression, for communication to Generator.
-	 */
-	String mapName = null;	// The function map associated this EL
-	private List list;
+        /* Name used for creating a map for the functions in this
+         EL expression, for communication to Generator.
+       */
+        String mapName = null;    // The function map associated this EL
+        private List list;
 
-	public Nodes() {
-	    list = new ArrayList();
-	}
+        public Nodes() {
+            list = new ArrayList();
+        }
 
-	public void add(ELNode en) {
-	    list.add(en);
-	}
+        public void add(ELNode en) {
+            list.add(en);
+        }
 
-	/**
-	 * Visit the nodes in the list with the supplied visitor
-	 * @param v The visitor used
-	 */
-	public void visit(Visitor v) throws JasperException {
-	    Iterator iter = list.iterator();
-	    while (iter.hasNext()) {
-		ELNode n = (ELNode) iter.next();
-		n.accept(v);
-	    }
-	}
+        /**
+         * Visit the nodes in the list with the supplied visitor
+         *
+         * @param v The visitor used
+         */
+        public void visit(Visitor v) throws JasperException {
+            Iterator iter = list.iterator();
+            while (iter.hasNext()) {
+                ELNode n = (ELNode) iter.next();
+                n.accept(v);
+            }
+        }
 
-	public Iterator iterator() {
-	    return list.iterator();
-	}
+        public Iterator iterator() {
+            return list.iterator();
+        }
 
-	public boolean isEmpty() {
-	    return list.size() == 0;
-	}
+        public boolean isEmpty() {
+            return list.size() == 0;
+        }
 
-	/**
-	 * @return true if the expression contains a ${...}
-	 */
-	public boolean containsEL() {
-	    Iterator iter = list.iterator();
-	    while (iter.hasNext()) {
-		ELNode n = (ELNode) iter.next();
-		if (n instanceof Root) {
-		    return true;
-		}
-	    }
-	    return false;
-	}
+        /**
+         * @return true if the expression contains a ${...}
+         */
+        public boolean containsEL() {
+            Iterator iter = list.iterator();
+            while (iter.hasNext()) {
+                ELNode n = (ELNode) iter.next();
+                if (n instanceof Root) {
+                    return true;
+                }
+            }
+            return false;
+        }
 
-	public void setMapName(String name) {
-	    this.mapName = name;
-	}
+        public void setMapName(String name) {
+            this.mapName = name;
+        }
 
-	public String getMapName() {
-	    return mapName;
-	}
+        public String getMapName() {
+            return mapName;
+        }
     }
 
     /*
@@ -234,18 +235,18 @@
      */
     public static class Visitor {
 
-	public void visit(Root n) throws JasperException {
-	    n.getExpression().visit(this);
-	}
+        public void visit(Root n) throws JasperException {
+            n.getExpression().visit(this);
+        }
 
-	public void visit(Function n) throws JasperException {
-	}
+        public void visit(Function n) throws JasperException {
+        }
 
-	public void visit(Text n) throws JasperException {
-	}
+        public void visit(Text n) throws JasperException {
+        }
 
-	public void visit(ELText n) throws JasperException {
-	}
+        public void visit(ELText n) throws JasperException {
+        }
     }
 }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELParser.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELParser.java
index fac1ae7..f904e5f 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELParser.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ELParser.java
@@ -19,10 +19,10 @@
 
 /**
  * This class implements a parser for EL expressions.
- *
+ * <p/>
  * It takes strings of the form xxx${..}yyy${..}zzz etc, and turn it into
  * a ELNode.Nodes.
- *
+ * <p/>
  * Currently, it only handles text outside ${..} and functions in ${ ..}.
  *
  * @author Kin-man Chung
@@ -38,9 +38,9 @@
     private boolean escapeBS;        // is '\' an escape char in text outside EL?
 
     private static final String reservedWords[] = {
-        "and", "div", "empty", "eq", "false",
-        "ge", "gt", "instanceof", "le", "lt", "mod",
-        "ne", "not", "null", "or", "true"};
+            "and", "div", "empty", "eq", "false",
+            "ge", "gt", "instanceof", "le", "lt", "mod",
+            "ne", "not", "null", "or", "true"};
 
     public ELParser(String expression) {
         index = 0;
@@ -50,6 +50,7 @@
 
     /**
      * Parse an EL expression
+     *
      * @param expression The input expression string of the form
      *                   Char* ('${' Char* '}')* Char*
      * @return Parsed EL expression in ELNode.Nodes
@@ -62,7 +63,7 @@
                 parser.expr.add(new ELNode.Text(text));
             }
             ELNode.Nodes elexpr = parser.parseEL();
-            if (! elexpr.isEmpty()) {
+            if (!elexpr.isEmpty()) {
                 parser.expr.add(new ELNode.Root(elexpr));
             }
         }
@@ -71,9 +72,10 @@
 
     /**
      * Parse an EL expression string '${...}'
-     *@return An ELNode.Nodes representing the EL expression
-     * TODO: Currently only parsed into functions and text strings.  This
-     *       should be rewritten for a full parser.
+     *
+     * @return An ELNode.Nodes representing the EL expression
+     *         TODO: Currently only parsed into functions and text strings.  This
+     *         should be rewritten for a full parser.
      */
     private ELNode.Nodes parseEL() {
 
@@ -106,11 +108,11 @@
     /**
      * Parse for a function
      * FunctionInvokation ::= (identifier ':')? identifier '('
-     *                              (Expression (,Expression)*)? ')'
+     * (Expression (,Expression)*)? ')'
      * Note: currently we don't parse arguments
      */
     private boolean parseFunction() {
-        if (! (curToken instanceof Id) || isELReserved(curToken.toString())) {
+        if (!(curToken instanceof Id) || isELReserved(curToken.toString())) {
             return false;
         }
         String s1 = null;                 // Function prefix
@@ -146,13 +148,13 @@
         int i = 0;
         int j = reservedWords.length;
         while (i < j) {
-            int k = (i+j)/2;
+            int k = (i + j) / 2;
             int result = reservedWords[k].compareTo(id);
             if (result == 0) {
                 return true;
             }
             if (result < 0) {
-                i = k+1;
+                i = k + 1;
             } else {
                 j = k;
             }
@@ -163,6 +165,7 @@
     /**
      * Skip until an EL expression ('${') is reached, allowing escape sequences
      * '\\' and '\$'.
+     *
      * @return The text string up to the EL expression
      */
     private String skipUntilEL() {
@@ -184,7 +187,7 @@
                 if (ch == '{') {
                     prev = 0;
                     break;
-                } 
+                }
                 buf.append('$');
                 buf.append(ch);
                 prev = 0;
@@ -220,7 +223,7 @@
                 StringBuffer buf = new StringBuffer();
                 buf.append(ch);
                 while ((ch = peekChar()) != -1 &&
-                                Character.isJavaIdentifierPart(ch)) {
+                        Character.isJavaIdentifierPart(ch)) {
                     buf.append(ch);
                     nextChar();
                 }
@@ -281,14 +284,14 @@
 
     private char nextChar() {
         if (index >= expression.length()) {
-            return (char)-1;
+            return (char) -1;
         }
         return expression.charAt(index++);
     }
 
     private char peekChar() {
         if (index >= expression.length()) {
-            return (char)-1;
+            return (char) -1;
         }
         return expression.charAt(index);
     }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorDispatcher.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorDispatcher.java
index 4488db4..091efdd 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorDispatcher.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorDispatcher.java
@@ -29,12 +29,12 @@
 /**
  * Class responsible for dispatching JSP parse and javac compilation errors
  * to the configured error handler.
- *
+ * <p/>
  * This class is also responsible for localizing any error codes before they
  * are passed on to the configured error handler.
- * 
+ * <p/>
  * In the case of a Java compilation error, the compiler error message is
- * parsed into an array of JavacErrorDetail instances, which is passed on to 
+ * parsed into an array of JavacErrorDetail instances, which is passed on to
  * the configured error handler.
  *
  * @author Jan Luehe
@@ -56,8 +56,8 @@
      * otherwise
      */
     public ErrorDispatcher(boolean jspcMode) {
-	// XXX check web.xml for custom error handler
-	errHandler = new DefaultErrorHandler();
+        // XXX check web.xml for custom error handler
+        errHandler = new DefaultErrorHandler();
         this.jspcMode = jspcMode;
     }
 
@@ -71,7 +71,7 @@
      * @param errCode Error code
      */
     public void jspError(String errCode) throws JasperException {
-	dispatch(null, errCode, null, null);
+        dispatch(null, errCode, null, null);
     }
 
     /*
@@ -85,7 +85,7 @@
      * @param errCode Error code
      */
     public void jspError(Mark where, String errCode) throws JasperException {
-	dispatch(where, errCode, null, null);
+        dispatch(where, errCode, null, null);
     }
 
     /*
@@ -99,7 +99,7 @@
      * @param errCode Error code
      */
     public void jspError(Node n, String errCode) throws JasperException {
-	dispatch(n.getStart(), errCode, null, null);
+        dispatch(n.getStart(), errCode, null, null);
     }
 
     /*
@@ -113,7 +113,7 @@
      * @param arg Argument for parametric replacement
      */
     public void jspError(String errCode, String arg) throws JasperException {
-	dispatch(null, errCode, new Object[] {arg}, null);
+        dispatch(null, errCode, new Object[]{arg}, null);
     }
 
     /*
@@ -128,8 +128,8 @@
      * @param arg Argument for parametric replacement
      */
     public void jspError(Mark where, String errCode, String arg)
-	        throws JasperException {
-	dispatch(where, errCode, new Object[] {arg}, null);
+            throws JasperException {
+        dispatch(where, errCode, new Object[]{arg}, null);
     }
 
     /*
@@ -144,8 +144,8 @@
      * @param arg Argument for parametric replacement
      */
     public void jspError(Node n, String errCode, String arg)
-	        throws JasperException {
-	dispatch(n.getStart(), errCode, new Object[] {arg}, null);
+            throws JasperException {
+        dispatch(n.getStart(), errCode, new Object[]{arg}, null);
     }
 
     /*
@@ -160,8 +160,8 @@
      * @param arg2 Second argument for parametric replacement
      */
     public void jspError(String errCode, String arg1, String arg2)
-	        throws JasperException {
-	dispatch(null, errCode, new Object[] {arg1, arg2}, null);
+            throws JasperException {
+        dispatch(null, errCode, new Object[]{arg1, arg2}, null);
     }
 
     /*
@@ -177,8 +177,8 @@
      * @param arg3 Third argument for parametric replacement
      */
     public void jspError(String errCode, String arg1, String arg2, String arg3)
-	        throws JasperException {
-	dispatch(null, errCode, new Object[] {arg1, arg2, arg3}, null);
+            throws JasperException {
+        dispatch(null, errCode, new Object[]{arg1, arg2, arg3}, null);
     }
 
     /*
@@ -194,8 +194,8 @@
      * @param arg2 Second argument for parametric replacement
      */
     public void jspError(Mark where, String errCode, String arg1, String arg2)
-	        throws JasperException {
-	dispatch(where, errCode, new Object[] {arg1, arg2}, null);
+            throws JasperException {
+        dispatch(where, errCode, new Object[]{arg1, arg2}, null);
     }
 
     /*
@@ -214,8 +214,8 @@
 
     public void jspError(Mark where, String errCode, String arg1, String arg2,
                          String arg3)
-                throws JasperException {
-        dispatch(where, errCode, new Object[] {arg1, arg2, arg3}, null);
+            throws JasperException {
+        dispatch(where, errCode, new Object[]{arg1, arg2, arg3}, null);
     }
 
     /*
@@ -232,8 +232,8 @@
      */
 
     public void jspError(Node n, String errCode, String arg1, String arg2)
-	        throws JasperException {
-	dispatch(n.getStart(), errCode, new Object[] {arg1, arg2}, null);
+            throws JasperException {
+        dispatch(n.getStart(), errCode, new Object[]{arg1, arg2}, null);
     }
 
     /*
@@ -252,8 +252,8 @@
 
     public void jspError(Node n, String errCode, String arg1, String arg2,
                          String arg3)
-	        throws JasperException {
-	dispatch(n.getStart(), errCode, new Object[] {arg1, arg2, arg3}, null);
+            throws JasperException {
+        dispatch(n.getStart(), errCode, new Object[]{arg1, arg2, arg3}, null);
     }
 
     /*
@@ -262,7 +262,7 @@
      * @param e Parsing exception
      */
     public void jspError(Exception e) throws JasperException {
-	dispatch(null, null, null, e);
+        dispatch(null, null, null, e);
     }
 
     /*
@@ -277,8 +277,8 @@
      * @param e Parsing exception
      */
     public void jspError(String errCode, String arg, Exception e)
-	        throws JasperException {
-	dispatch(null, errCode, new Object[] {arg}, e);
+            throws JasperException {
+        dispatch(null, errCode, new Object[]{arg}, e);
     }
 
     /*
@@ -294,8 +294,8 @@
      * @param e Parsing exception
      */
     public void jspError(Node n, String errCode, String arg, Exception e)
-	        throws JasperException {
-	dispatch(n.getStart(), errCode, new Object[] {arg}, e);
+            throws JasperException {
+        dispatch(n.getStart(), errCode, new Object[]{arg}, e);
     }
 
     /**
@@ -303,19 +303,18 @@
      * messages (one per javac compilation error line number).
      *
      * @param errMsg Error message
-     * @param fname Name of Java source file whose compilation failed
-     * @param page Node representation of JSP page from which the Java source
-     * file was generated
-     *
+     * @param fname  Name of Java source file whose compilation failed
+     * @param page   Node representation of JSP page from which the Java source
+     *               file was generated
      * @return Array of javac compilation errors, or null if the given error
-     * message does not contain any compilation error line numbers
+     *         message does not contain any compilation error line numbers
      */
     public static JavacErrorDetail[] parseJavacErrors(String errMsg,
                                                       String fname,
                                                       Node.Nodes page)
             throws JasperException, IOException {
 
-	return parseJavacMessage(errMsg, fname, page);
+        return parseJavacMessage(errMsg, fname, page);
     }
 
     /*
@@ -339,7 +338,7 @@
      * @param e Compilation exception
      */
     public void javacError(String errorReport, Exception e)
-                throws JasperException {
+            throws JasperException {
 
         errHandler.javacError(errorReport, e);
     }
@@ -360,24 +359,25 @@
      * @param args Arguments for parametric replacement
      * @param e Parsing exception
      */
+
     private void dispatch(Mark where, String errCode, Object[] args,
-			  Exception e) throws JasperException {
-	String file = null;
-	String errMsg = null;
-	int line = -1;
-	int column = -1;
-	boolean hasLocation = false;
+                          Exception e) throws JasperException {
+        String file = null;
+        String errMsg = null;
+        int line = -1;
+        int column = -1;
+        boolean hasLocation = false;
 
-	// Localize
-	if (errCode != null) {
-	    errMsg = Localizer.getMessage(errCode, args);
-	} else if (e != null) {
-	    // give a hint about what's wrong
-	    errMsg = e.getMessage();
-	}
+        // Localize
+        if (errCode != null) {
+            errMsg = Localizer.getMessage(errCode, args);
+        } else if (e != null) {
+            // give a hint about what's wrong
+            errMsg = e.getMessage();
+        }
 
-	// Get error location
-	if (where != null) {
+        // Get error location
+        if (where != null) {
             if (jspcMode) {
                 // Get the full URL of the resource that caused the error
                 try {
@@ -391,23 +391,23 @@
                 // disclose any local filesystem details
                 file = where.getFile();
             }
-	    line = where.getLineNumber();
-	    column = where.getColumnNumber();
-	    hasLocation = true;
-	}
+            line = where.getLineNumber();
+            column = where.getColumnNumber();
+            hasLocation = true;
+        }
 
-	// Get nested exception
-	Exception nestedEx = e;
-	if ((e instanceof SAXException)
-	        && (((SAXException) e).getException() != null)) {
-	    nestedEx = ((SAXException) e).getException();
-	}
+        // Get nested exception
+        Exception nestedEx = e;
+        if ((e instanceof SAXException)
+                && (((SAXException) e).getException() != null)) {
+            nestedEx = ((SAXException) e).getException();
+        }
 
-	if (hasLocation) {
-	    errHandler.jspError(file, line, column, errMsg, nestedEx);
-	} else {
-	    errHandler.jspError(errMsg, nestedEx);
-	}
+        if (hasLocation) {
+            errHandler.jspError(file, line, column, errMsg, nestedEx);
+        } else {
+            errHandler.jspError(errMsg, nestedEx);
+        }
     }
 
     /*
@@ -427,69 +427,69 @@
      * compilation errors
      */
     private static JavacErrorDetail[] parseJavacMessage(
-                                String errMsg, String fname, Node.Nodes page)
-	        throws IOException, JasperException {
+            String errMsg, String fname, Node.Nodes page)
+            throws IOException, JasperException {
 
         Vector errVec = new Vector();
         StringBuffer errMsgBuf = null;
         int lineNum = -1;
         JavacErrorDetail javacError = null;
-        
+
         BufferedReader reader = new BufferedReader(new StringReader(errMsg));
-        
+
         /*
-         * Parse compilation errors. Each compilation error consists of a file
-         * path and error line number, followed by a number of lines describing
-         * the error.
-         */
+        * Parse compilation errors. Each compilation error consists of a file
+        * path and error line number, followed by a number of lines describing
+        * the error.
+        */
         String line = null;
         while ((line = reader.readLine()) != null) {
-            
+
             /*
-             * Error line number is delimited by set of colons.
-             * Ignore colon following drive letter on Windows (fromIndex = 2).
-             * XXX Handle deprecation warnings that don't have line info
-             */
-            int beginColon = line.indexOf(':', 2); 
+            * Error line number is delimited by set of colons.
+            * Ignore colon following drive letter on Windows (fromIndex = 2).
+            * XXX Handle deprecation warnings that don't have line info
+            */
+            int beginColon = line.indexOf(':', 2);
             int endColon = line.indexOf(':', beginColon + 1);
             if ((beginColon >= 0) && (endColon >= 0)) {
                 if (javacError != null) {
                     // add previous error to error vector
                     errVec.add(javacError);
                 }
-                
+
                 String lineNumStr = line.substring(beginColon + 1, endColon);
                 try {
                     lineNum = Integer.parseInt(lineNumStr);
                 } catch (NumberFormatException e) {
                     // XXX
                 }
-                
+
                 errMsgBuf = new StringBuffer();
-                
+
                 javacError = createJavacError(fname, page, errMsgBuf, lineNum);
             }
-            
+
             // Ignore messages preceding first error
             if (errMsgBuf != null) {
                 errMsgBuf.append(line);
                 errMsgBuf.append("\n");
             }
         }
-        
+
         // Add last error to error vector
         if (javacError != null) {
             errVec.add(javacError);
-        } 
-        
+        }
+
         reader.close();
-        
+
         JavacErrorDetail[] errDetails = null;
         if (errVec.size() > 0) {
             errDetails = new JavacErrorDetail[errVec.size()];
             errVec.copyInto(errDetails);
         }
-        
+
         return errDetails;
     }
 
@@ -503,10 +503,11 @@
      * @throws JasperException
      */
     public static JavacErrorDetail createJavacError(String fname,
-            Node.Nodes page, 
-            StringBuffer errMsgBuf, int lineNum) throws JasperException {
+                                                    Node.Nodes page,
+                                                    StringBuffer errMsgBuf, int lineNum) throws JasperException {
         return createJavacError(fname, page, errMsgBuf, lineNum, null);
     }
+
     /**
      * @param fname
      * @param page
@@ -517,9 +518,9 @@
      * @throws JasperException
      */
     public static JavacErrorDetail createJavacError(String fname,
-            Node.Nodes page, 
-            StringBuffer errMsgBuf, int lineNum, JspCompilationContext ctxt)
-    throws JasperException {
+                                                    Node.Nodes page,
+                                                    StringBuffer errMsgBuf, int lineNum, JspCompilationContext ctxt)
+            throws JasperException {
         JavacErrorDetail javacError;
         // Attempt to map javac error line number to line in JSP page
         ErrorVisitor errVisitor = new ErrorVisitor(lineNum);
@@ -534,7 +535,7 @@
                         lineNum,
                         errNode.getStart().getFile(),
                         errNode.getStart().getLineNumber() + lineNum -
-                            errVisitor.getJspSourceNode().getBeginJavaLine(),
+                                errVisitor.getJspSourceNode().getBeginJavaLine(),
                         errMsgBuf,
                         ctxt);
             } else {
@@ -575,40 +576,40 @@
      */
     static class ErrorVisitor extends Node.Visitor {
 
-	// Java source line number to be mapped
-	private int lineNum;
+        // Java source line number to be mapped
+        private int lineNum;
 
-	/*
-	 * JSP node whose Java source code range in the generated servlet
-	 * contains the Java source line number to be mapped
-	 */
-	Node found;
+        /*
+       * JSP node whose Java source code range in the generated servlet
+       * contains the Java source line number to be mapped
+       */
+        Node found;
 
-	/*
-	 * Constructor.
-	 *
-	 * @param lineNum Source line number in the generated servlet code
-	 */
-	public ErrorVisitor(int lineNum) {
-	    this.lineNum = lineNum;
-	}
-
-	public void doVisit(Node n) throws JasperException {
-	    if ((lineNum >= n.getBeginJavaLine())
-		    && (lineNum < n.getEndJavaLine())) {
-		found = n;
-	    }
+        /*
+       * Constructor.
+       *
+       * @param lineNum Source line number in the generated servlet code
+       */
+        public ErrorVisitor(int lineNum) {
+            this.lineNum = lineNum;
         }
 
-	/*
-	 * Gets the JSP node to which the source line number in the generated
-	 * servlet code was mapped.
-	 *
-	 * @return JSP node to which the source line number in the generated
-	 * servlet code was mapped
-	 */
-	public Node getJspSourceNode() {
-	    return found;
-	}
+        public void doVisit(Node n) throws JasperException {
+            if ((lineNum >= n.getBeginJavaLine())
+                    && (lineNum < n.getEndJavaLine())) {
+                found = n;
+            }
+        }
+
+        /*
+       * Gets the JSP node to which the source line number in the generated
+       * servlet code was mapped.
+       *
+       * @return JSP node to which the source line number in the generated
+       * servlet code was mapped
+       */
+        public Node getJspSourceNode() {
+            return found;
+        }
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorHandler.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorHandler.java
index 7db0982..63f2153 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorHandler.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ErrorHandler.java
@@ -21,7 +21,7 @@
 
 /**
  * Interface for handling JSP parse and javac compilation errors.
- * 
+ * <p/>
  * An implementation of this interface may be registered with the
  * ErrorDispatcher by setting the XXX initialization parameter in the JSP
  * page compiler and execution servlet in Catalina's web.xml file to the
@@ -35,39 +35,39 @@
     /**
      * Processes the given JSP parse error.
      *
-     * @param fname Name of the JSP file in which the parse error occurred
-     * @param line Parse error line number
-     * @param column Parse error column number
-     * @param msg Parse error message
+     * @param fname     Name of the JSP file in which the parse error occurred
+     * @param line      Parse error line number
+     * @param column    Parse error column number
+     * @param msg       Parse error message
      * @param exception Parse exception
      */
     public void jspError(String fname, int line, int column, String msg,
-			 Exception exception) throws JasperException;
+                         Exception exception) throws JasperException;
 
     /**
      * Processes the given JSP parse error.
      *
-     * @param msg Parse error message
+     * @param msg       Parse error message
      * @param exception Parse exception
      */
     public void jspError(String msg, Exception exception)
-	throws JasperException;
+            throws JasperException;
 
     /**
      * Processes the given javac compilation errors.
      *
      * @param details Array of JavacErrorDetail instances corresponding to the
-     * compilation errors
+     *                compilation errors
      */
     public void javacError(JavacErrorDetail[] details)
-	throws JasperException;
+            throws JasperException;
 
     /**
      * Processes the given javac error report and exception.
      *
      * @param errorReport Compilation error report
-     * @param exception Compilation exception
+     * @param exception   Compilation exception
      */
     public void javacError(String errorReport, Exception exception)
-        throws JasperException;
+            throws JasperException;
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Generator.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Generator.java
index 4967fb0..0b3eef9 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Generator.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Generator.java
@@ -44,8 +44,8 @@
  * @author Mandar Raje
  * @author Rajiv Mordani
  * @author Pierre Delisle
- *
- * Tomcat 4.1.x and Tomcat 5:
+ *         <p/>
+ *         Tomcat 4.1.x and Tomcat 5:
  * @author Kin-man Chung
  * @author Jan Luehe
  * @author Shawn Bayern
@@ -55,7 +55,7 @@
 
 class Generator {
 
-    private static final Class[] OBJECT_CLASS = { Object.class };
+    private static final Class[] OBJECT_CLASS = {Object.class};
     private ServletWriter out;
     private ArrayList methodsBuffered;
     private FragmentHelperClass fragmentHelperClass;
@@ -197,7 +197,7 @@
      * Compiles list of tag handler pool names.
      */
     private void compileTagHandlerPoolList(Node.Nodes page)
-        throws JasperException {
+            throws JasperException {
 
         class TagHandlerPoolVisitor extends Node.Visitor {
 
@@ -221,11 +221,11 @@
 
                 if (!n.implementsSimpleTag()) {
                     String name =
-                        createTagHandlerPoolName(
-                            n.getPrefix(),
-                            n.getLocalName(),
-                            n.getAttributes(),
-                            n.hasEmptyBody());
+                            createTagHandlerPoolName(
+                                    n.getPrefix(),
+                                    n.getLocalName(),
+                                    n.getAttributes(),
+                                    n.hasEmptyBody());
                     n.setTagHandlerPoolName(name);
                     if (!names.contains(name)) {
                         names.add(name);
@@ -241,10 +241,10 @@
              * @return The name of the tag handler pool
              */
             private String createTagHandlerPoolName(
-                String prefix,
-                String shortName,
-                Attributes attrs,
-                boolean hasEmptyBody) {
+                    String prefix,
+                    String shortName,
+                    Attributes attrs,
+                    boolean hasEmptyBody) {
                 String poolName = null;
 
                 poolName = "_jspx_tagPool_" + prefix + "_" + shortName;
@@ -272,7 +272,7 @@
     }
 
     private void declareTemporaryScriptingVars(Node.Nodes page)
-        throws JasperException {
+            throws JasperException {
 
         class ScriptingVarVisitor extends Node.Visitor {
 
@@ -292,10 +292,10 @@
                         for (int i = 0; i < varInfos.length; i++) {
                             String varName = varInfos[i].getVarName();
                             String tmpVarName =
-                                "_jspx_"
-                                    + varName
-                                    + "_"
-                                    + n.getCustomNestingLevel();
+                                    "_jspx_"
+                                            + varName
+                                            + "_"
+                                            + n.getCustomNestingLevel();
                             if (!vars.contains(tmpVarName)) {
                                 vars.add(tmpVarName);
                                 out.printin(varInfos[i].getClassName());
@@ -311,19 +311,19 @@
                             String varName = tagVarInfos[i].getNameGiven();
                             if (varName == null) {
                                 varName =
-                                    n.getTagData().getAttributeString(
-                                        tagVarInfos[i].getNameFromAttribute());
+                                        n.getTagData().getAttributeString(
+                                                tagVarInfos[i].getNameFromAttribute());
                             } else if (
-                                tagVarInfos[i].getNameFromAttribute()
-                                    != null) {
+                                    tagVarInfos[i].getNameFromAttribute()
+                                            != null) {
                                 // alias
                                 continue;
                             }
                             String tmpVarName =
-                                "_jspx_"
-                                    + varName
-                                    + "_"
-                                    + n.getCustomNestingLevel();
+                                    "_jspx_"
+                                            + varName
+                                            + "_"
+                                            + n.getCustomNestingLevel();
                             if (!vars.contains(tmpVarName)) {
                                 vars.add(tmpVarName);
                                 out.printin(tagVarInfos[i].getClassName());
@@ -359,9 +359,9 @@
 
         out.pushIndent();
         for (int i = 0; i < tagHandlerPoolNames.size(); i++) {
-            out.printin((String)tagHandlerPoolNames.elementAt(i));
+            out.printin((String) tagHandlerPoolNames.elementAt(i));
             out.print(
-                " = org.apache.struts2.jasper.runtime.TagHandlerPool.getTagHandlerPool(");
+                    " = org.apache.struts2.jasper.runtime.TagHandlerPool.getTagHandlerPool(");
             if (ctxt.isTagFile()) {
                 out.print("config");
             } else {
@@ -383,7 +383,7 @@
         out.printil("public void _jspDestroy() {");
         out.pushIndent();
         for (int i = 0; i < tagHandlerPoolNames.size(); i++) {
-            out.printin((String)tagHandlerPoolNames.elementAt(i));
+            out.printin((String) tagHandlerPoolNames.elementAt(i));
             out.println(".release();");
         }
         out.popIndent();
@@ -396,7 +396,7 @@
      * (shared by servlet and tag handler preamble generation)
      */
     private void genPreamblePackage(String packageName)
-        throws JasperException {
+            throws JasperException {
         if (!"".equals(packageName) && packageName != null) {
             out.printil("package " + packageName + ";");
             out.println();
@@ -411,7 +411,7 @@
         Iterator iter = pageInfo.getImports().iterator();
         while (iter.hasNext()) {
             out.printin("import ");
-            out.print((String)iter.next());
+            out.print((String) iter.next());
             out.println(";");
         }
         out.println();
@@ -436,7 +436,7 @@
             out.println(");");
             while (iter.hasNext()) {
                 out.printin("_jspx_dependants.add(\"");
-                out.print((String)iter.next());
+                out.print((String) iter.next());
                 out.println("\");");
             }
             out.popIndent();
@@ -451,13 +451,13 @@
      * (shared by servlet and tag handler preamble generation)
      */
     private void genPreambleClassVariableDeclarations(String className)
-        throws JasperException {
+            throws JasperException {
         if (isPoolingEnabled && !tagHandlerPoolNames.isEmpty()) {
             for (int i = 0; i < tagHandlerPoolNames.size(); i++) {
                 out.printil(
-                    "private org.apache.struts2.jasper.runtime.TagHandlerPool "
-                        + tagHandlerPoolNames.elementAt(i)
-                        + ";");
+                        "private org.apache.struts2.jasper.runtime.TagHandlerPool "
+                                + tagHandlerPoolNames.elementAt(i)
+                                + ";");
             }
             out.println();
         }
@@ -503,7 +503,7 @@
         out.print(" extends ");
         out.println(pageInfo.getExtends());
         out.printin(
-            "    implements org.apache.struts2.jasper.runtime.JspSourceDependent");
+                "    implements org.apache.struts2.jasper.runtime.JspSourceDependent");
         if (!pageInfo.isThreadSafe()) {
             out.println(",");
             out.printin("                 SingleThreadModel");
@@ -530,7 +530,7 @@
         out.printin("public void ");
         out.print(serviceMethodName);
         out.println(
-            "(HttpServletRequest request, HttpServletResponse response)");
+                "(HttpServletRequest request, HttpServletResponse response)");
         out.println("        throws java.io.IOException, ServletException {");
 
         out.pushIndent();
@@ -544,11 +544,11 @@
 
         if (pageInfo.isErrorPage()) {
             out.printil(
-                "Throwable exception = org.apache.struts2.jasper.runtime.JspRuntimeLibrary.getThrowable(request);");
+                    "Throwable exception = org.apache.struts2.jasper.runtime.JspRuntimeLibrary.getThrowable(request);");
             out.printil("if (exception != null) {");
             out.pushIndent();
             out.printil(
-                "response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);");
+                    "response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);");
             out.popIndent();
             out.printil("}");
         }
@@ -579,7 +579,7 @@
         }
 
         out.printil(
-            "pageContext = _jspxFactory.getPageContext(this, request, response,");
+                "pageContext = _jspxFactory.getPageContext(this, request, response,");
         out.printin("\t\t\t");
         out.print(quote(pageInfo.getErrorPage()));
         out.print(", " + pageInfo.isSession());
@@ -613,16 +613,16 @@
          */
         String omitXmlDecl = pageInfo.getOmitXmlDecl();
         if ((omitXmlDecl != null && !JspUtil.booleanValue(omitXmlDecl))
-            || (omitXmlDecl == null
+                || (omitXmlDecl == null
                 && page.getRoot().isXmlSyntax()
                 && !pageInfo.hasJspRoot()
                 && !ctxt.isTagFile())) {
             String cType = pageInfo.getContentType();
             String charSet = cType.substring(cType.indexOf("charset=") + 8);
             out.printil(
-                "out.write(\"<?xml version=\\\"1.0\\\" encoding=\\\""
-                    + charSet
-                    + "\\\"?>\\n\");");
+                    "out.write(\"<?xml version=\\\"1.0\\\" encoding=\\\""
+                            + charSet
+                            + "\\\"?>\\n\");");
         }
 
         /*
@@ -697,12 +697,12 @@
          * Constructor.
          */
         public GenerateVisitor(
-            boolean isTagFile,
-            ServletWriter out,
-            ArrayList methodsBuffered,
-            FragmentHelperClass fragmentHelperClass,
-            ClassLoader loader,
-            TagInfo tagInfo) {
+                boolean isTagFile,
+                ServletWriter out,
+                ArrayList methodsBuffered,
+                FragmentHelperClass fragmentHelperClass,
+                ClassLoader loader,
+                TagInfo tagInfo) {
 
             this.isTagFile = isTagFile;
             this.out = out;
@@ -724,15 +724,15 @@
          * we insert the generated variable name.  Otherwise the result is a
          * string literal, quoted and escaped.
          *
-         * @param attr An JspAttribute object
-         * @param encode true if to be URL encoded
+         * @param attr         An JspAttribute object
+         * @param encode       true if to be URL encoded
          * @param expectedType the expected type for an EL evaluation
-         *        (ignored for attributes that aren't EL expressions)
+         *                     (ignored for attributes that aren't EL expressions)
          */
         private String attributeValue(
-            Node.JspAttribute attr,
-            boolean encode,
-            Class expectedType) {
+                Node.JspAttribute attr,
+                boolean encode,
+                Class expectedType) {
             String v = attr.getValue();
             if (!attr.isNamedAttribute() && (v == null))
                 return "";
@@ -740,27 +740,27 @@
             if (attr.isExpression()) {
                 if (encode) {
                     return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.URLEncode(String.valueOf("
-                        + v
-                        + "), request.getCharacterEncoding())";
+                            + v
+                            + "), request.getCharacterEncoding())";
                 }
                 return v;
             } else if (attr.isELInterpreterInput()) {
                 boolean replaceESC = v.indexOf(Constants.HACK_CHAR) > 0;
                 v =
-                    JspUtil.interpreterCall(
-                        this.isTagFile,
-                        v,
-                        expectedType,
-                        attr.getEL().getMapName(),
-                        false);
+                        JspUtil.interpreterCall(
+                                this.isTagFile,
+                                v,
+                                expectedType,
+                                attr.getEL().getMapName(),
+                                false);
                 // XXX hack replacement
                 if (replaceESC) {
                     v = "(" + v + ").replace(" + Constants.HACK_STR + ", '$')";
                 }
                 if (encode) {
                     return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.URLEncode("
-                        + v
-                        + ", request.getCharacterEncoding())";
+                            + v
+                            + ", request.getCharacterEncoding())";
                 }
                 return v;
             } else if (attr.isNamedAttribute()) {
@@ -768,8 +768,8 @@
             } else {
                 if (encode) {
                     return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.URLEncode("
-                        + quote(v)
-                        + ", request.getCharacterEncoding())";
+                            + quote(v)
+                            + ", request.getCharacterEncoding())";
                 }
                 return quote(v);
             }
@@ -782,7 +782,7 @@
          * @param n the parent node for the param action nodes.
          */
         private void printParams(Node n, String pageParam, boolean literal)
-            throws JasperException {
+                throws JasperException {
 
             class ParamVisitor extends Node.Visitor {
                 String separator;
@@ -797,10 +797,10 @@
                     out.print(separator);
                     out.print(" + ");
                     out.print(
-                        "org.apache.struts2.jasper.runtime.JspRuntimeLibrary."
-                            + "URLEncode("
-                            + quote(n.getTextAttribute("name"))
-                            + ", request.getCharacterEncoding())");
+                            "org.apache.struts2.jasper.runtime.JspRuntimeLibrary."
+                                    + "URLEncode("
+                                    + quote(n.getTextAttribute("name"))
+                                    + ", request.getCharacterEncoding())");
                     out.print("+ \"=\" + ");
                     out.print(attributeValue(n.getValue(), true, String.class));
 
@@ -839,19 +839,19 @@
             n.setBeginJavaLine(out.getJavaLine());
             if (!pageInfo.isELIgnored()) {
                 out.printil(
-                    "out.write("
-                        + JspUtil.interpreterCall(
-                            this.isTagFile,
-                            "${" + new String(n.getText()) + "}",
-                            String.class,
-                            n.getEL().getMapName(),
-                            false)
-                        + ");");
+                        "out.write("
+                                + JspUtil.interpreterCall(
+                                this.isTagFile,
+                                "${" + new String(n.getText()) + "}",
+                                String.class,
+                                n.getEL().getMapName(),
+                                false)
+                                + ");");
             } else {
                 out.printil(
-                    "out.write("
-                        + quote("${" + new String(n.getText()) + "}")
-                        + ");");
+                        "out.write("
+                                + quote("${" + new String(n.getText()) + "}")
+                                + ");");
             }
             n.setEndJavaLine(out.getJavaLine());
         }
@@ -873,7 +873,7 @@
                 // jsp:attribute, first generate code to evaluate
                 // that body.
                 pageParam =
-                    generateNamedAttributeValue(page.getNamedAttributeNode());
+                        generateNamedAttributeValue(page.getNamedAttributeNode());
             } else {
                 pageParam = attributeValue(page, false, String.class);
             }
@@ -889,7 +889,7 @@
 
             out.printin(
                     JSPRuntime.class.getName() + ".handle("
-                    + pageParam);
+                            + pageParam);
             printParams(n, pageParam, page.isLiteral());
             out.println(", " + isFlush + ");");
 
@@ -901,7 +901,7 @@
          * <param> subelements.  For each <param> element, if its value
          * is specified via a Named Attribute (<jsp:attribute>),
          * generate the code to evaluate those bodies first.
-         * <p>
+         * <p/>
          * If parent is null, simply returns.
          */
         private void prepareParams(Node parent) throws JasperException {
@@ -915,13 +915,13 @@
                     if (n instanceof Node.ParamAction) {
                         Node.Nodes paramSubElements = n.getBody();
                         for (int j = 0;
-                            (paramSubElements != null)
-                                && (j < paramSubElements.size());
-                            j++) {
+                             (paramSubElements != null)
+                                     && (j < paramSubElements.size());
+                             j++) {
                             Node m = paramSubElements.getNode(j);
                             if (m instanceof Node.NamedAttribute) {
                                 generateNamedAttributeValue(
-                                    (Node.NamedAttribute)m);
+                                        (Node.NamedAttribute) m);
                             }
                         }
                     }
@@ -938,11 +938,11 @@
 
             Node.Nodes subelements = parent.getBody();
             for (int i = 0;
-                (subelements != null) && (i < subelements.size());
-                i++) {
+                 (subelements != null) && (i < subelements.size());
+                 i++) {
                 Node n = subelements.getNode(i);
                 if (n instanceof Node.JspBody) {
-                    result = (Node.JspBody)n;
+                    result = (Node.JspBody) n;
                     break;
                 }
             }
@@ -964,7 +964,7 @@
                 // jsp:attribute, first generate code to evaluate
                 // that body.
                 pageParam =
-                    generateNamedAttributeValue(page.getNamedAttributeNode());
+                        generateNamedAttributeValue(page.getNamedAttributeNode());
             } else {
                 pageParam = attributeValue(page, false, String.class);
             }
@@ -1005,30 +1005,30 @@
                 Class bean = beanInfo.getBeanType(name);
                 String beanName = JspUtil.getCanonicalName(bean);
                 java.lang.reflect.Method meth =
-                    JspRuntimeLibrary.getReadMethod(bean, property);
+                        JspRuntimeLibrary.getReadMethod(bean, property);
                 String methodName = meth.getName();
                 out.printil(
-                    "out.write(org.apache.struts2.jasper.runtime.JspRuntimeLibrary.toString("
-                        + "((("
-                        + beanName
-                        + ")_jspx_page_context.findAttribute("
-                        + "\""
-                        + name
-                        + "\"))."
-                        + methodName
-                        + "())));");
+                        "out.write(org.apache.struts2.jasper.runtime.JspRuntimeLibrary.toString("
+                                + "((("
+                                + beanName
+                                + ")_jspx_page_context.findAttribute("
+                                + "\""
+                                + name
+                                + "\"))."
+                                + methodName
+                                + "())));");
             } else {
                 // The object could be a custom action with an associated
                 // VariableInfo entry for this name.
                 // Get the class name and then introspect at runtime.
                 out.printil(
-                    "out.write(org.apache.struts2.jasper.runtime.JspRuntimeLibrary.toString"
-                        + "(org.apache.struts2.jasper.runtime.JspRuntimeLibrary.handleGetProperty"
-                        + "(_jspx_page_context.getAttribute(\""
-                        + name
-                        + "\", PageContext.PAGE_SCOPE), \""
-                        + property
-                        + "\")));");
+                        "out.write(org.apache.struts2.jasper.runtime.JspRuntimeLibrary.toString"
+                                + "(org.apache.struts2.jasper.runtime.JspRuntimeLibrary.handleGetProperty"
+                                + "(_jspx_page_context.getAttribute(\""
+                                + name
+                                + "\", PageContext.PAGE_SCOPE), \""
+                                + property
+                                + "\")));");
             }
 
             n.setEndJavaLine(out.getJavaLine());
@@ -1044,34 +1044,34 @@
 
             if ("*".equals(property)) {
                 out.printil(
-                    "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspect("
-                        + "_jspx_page_context.findAttribute("
-                        + "\""
-                        + name
-                        + "\"), request);");
+                        "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspect("
+                                + "_jspx_page_context.findAttribute("
+                                + "\""
+                                + name
+                                + "\"), request);");
             } else if (value == null) {
                 if (param == null)
                     param = property; // default to same as property
                 out.printil(
-                    "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspecthelper("
-                        + "_jspx_page_context.findAttribute(\""
-                        + name
-                        + "\"), \""
-                        + property
-                        + "\", request.getParameter(\""
-                        + param
-                        + "\"), "
-                        + "request, \""
-                        + param
-                        + "\", false);");
+                        "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspecthelper("
+                                + "_jspx_page_context.findAttribute(\""
+                                + name
+                                + "\"), \""
+                                + property
+                                + "\", request.getParameter(\""
+                                + param
+                                + "\"), "
+                                + "request, \""
+                                + param
+                                + "\", false);");
             } else if (value.isExpression()) {
                 out.printil(
-                    "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.handleSetProperty("
-                        + "_jspx_page_context.findAttribute(\""
-                        + name
-                        + "\"), \""
-                        + property
-                        + "\",");
+                        "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.handleSetProperty("
+                                + "_jspx_page_context.findAttribute(\""
+                                + name
+                                + "\"), \""
+                                + property
+                                + "\",");
                 out.print(attributeValue(value, false, null));
                 out.println(");");
             } else if (value.isELInterpreterInput()) {
@@ -1089,40 +1089,40 @@
                 // - 'this' (either the generated Servlet or the generated tag
                 //   handler for Tag files) is a FunctionMapper.
                 out.printil(
-                    "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.handleSetPropertyExpression("
-                        + "_jspx_page_context.findAttribute(\""
-                        + name
-                        + "\"), \""
-                        + property
-                        + "\", "
-                        + quote(value.getValue())
-                        + ", "
-                        + "_jspx_page_context, "
-                        + value.getEL().getMapName()
-                        + ");");
+                        "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.handleSetPropertyExpression("
+                                + "_jspx_page_context.findAttribute(\""
+                                + name
+                                + "\"), \""
+                                + property
+                                + "\", "
+                                + quote(value.getValue())
+                                + ", "
+                                + "_jspx_page_context, "
+                                + value.getEL().getMapName()
+                                + ");");
             } else if (value.isNamedAttribute()) {
                 // If the value for setProperty was specified via
                 // jsp:attribute, first generate code to evaluate
                 // that body.
                 String valueVarName =
-                    generateNamedAttributeValue(value.getNamedAttributeNode());
+                        generateNamedAttributeValue(value.getNamedAttributeNode());
                 out.printil(
-                    "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspecthelper("
-                        + "_jspx_page_context.findAttribute(\""
-                        + name
-                        + "\"), \""
-                        + property
-                        + "\", "
-                        + valueVarName
-                        + ", null, null, false);");
+                        "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspecthelper("
+                                + "_jspx_page_context.findAttribute(\""
+                                + name
+                                + "\"), \""
+                                + property
+                                + "\", "
+                                + valueVarName
+                                + ", null, null, false);");
             } else {
                 out.printin(
-                    "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspecthelper("
-                        + "_jspx_page_context.findAttribute(\""
-                        + name
-                        + "\"), \""
-                        + property
-                        + "\", ");
+                        "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.introspecthelper("
+                                + "_jspx_page_context.findAttribute(\""
+                                + name
+                                + "\"), \""
+                                + property
+                                + "\", ");
                 out.print(attributeValue(value, false, null));
                 out.println(", null, null, false);");
             }
@@ -1144,7 +1144,7 @@
             if (klass != null) {
                 try {
                     Class bean = ctxt.getClassLoader().loadClass(klass);
-                    if (klass.indexOf('$') >= 0)  {
+                    if (klass.indexOf('$') >= 0) {
                         // Obtain the canonical type name
                         canonicalName = JspUtil.getCanonicalName(bean);
                     } else {
@@ -1152,12 +1152,12 @@
                     }
                     int modifiers = bean.getModifiers();
                     if (!Modifier.isPublic(modifiers) ||
-                        Modifier.isInterface(modifiers) ||
-                        Modifier.isAbstract(modifiers)) {
+                            Modifier.isInterface(modifiers) ||
+                            Modifier.isAbstract(modifiers)) {
                         throw new Exception("Invalid bean class modifier");
                     }
                     // Check that there is a 0 arg constructor
-                    bean.getConstructor(new Class[] {});
+                    bean.getConstructor(new Class[]{});
                     // At compile time, we have determined that the bean class
                     // exists, with a public zero constructor, new() can be
                     // used for bean instantiation.
@@ -1166,13 +1166,13 @@
                     // Cannot instantiate the specified class, either a
                     // compilation error or a runtime error will be raised,
                     // depending on a compiler flag.
-                    if(ctxt.getOptions().getErrorOnUseBeanInvalidClassAttribute()) {
+                    if (ctxt.getOptions().getErrorOnUseBeanInvalidClassAttribute()) {
                         err.jspError(n, "jsp.error.invalid.bean", klass);
                     }
                     if (canonicalName == null) {
                         // Doing our best here to get a canonical name
                         // from the binary name, should work 99.99% of time.
-                        canonicalName = klass.replace('$','.');
+                        canonicalName = klass.replace('$', '.');
                     }
                 }
                 if (type == null) {
@@ -1233,7 +1233,7 @@
                  * must be found locally, otherwise it's an error
                  */
                 out.printin(
-                    "throw new java.lang.InstantiationException(\"bean ");
+                        "throw new java.lang.InstantiationException(\"bean ");
                 out.print(name);
                 out.println(" not found within scope\");");
             } else {
@@ -1248,11 +1248,11 @@
                             // jsp:attribute, first generate code to evaluate
                             // that body.
                             binaryName =
-                                generateNamedAttributeValue(
-                                    beanName.getNamedAttributeNode());
+                                    generateNamedAttributeValue(
+                                            beanName.getNamedAttributeNode());
                         } else {
                             binaryName =
-                                attributeValue(beanName, false, String.class);
+                                    attributeValue(beanName, false, String.class);
                         }
                     } else {
                         // Implies klass is not null
@@ -1275,7 +1275,7 @@
                     out.printil("} catch (ClassNotFoundException exc) {");
                     out.pushIndent();
                     out.printil(
-                        "throw new InstantiationException(exc.getMessage());");
+                            "throw new InstantiationException(exc.getMessage());");
                     out.popIndent();
                     out.printil("} catch (Exception exc) {");
                     out.pushIndent();
@@ -1359,27 +1359,27 @@
                         // out.println( "<param name=\"blah\"
                         //     value=\"" + ... + "\">" );
                         out.printil(
-                            "out.write( \"<param name=\\\""
-                                + escape(name)
-                                + "\\\" value=\\\"\" + "
-                                + attributeValue(
-                                    n.getValue(),
-                                    false,
-                                    String.class)
-                                + " + \"\\\">\" );");
+                                "out.write( \"<param name=\\\""
+                                        + escape(name)
+                                        + "\\\" value=\\\"\" + "
+                                        + attributeValue(
+                                        n.getValue(),
+                                        false,
+                                        String.class)
+                                        + " + \"\\\">\" );");
                         out.printil("out.write(\"\\n\");");
                     } else {
                         // We want something of the form
                         // out.print( " blah=\"" + ... + "\"" );
                         out.printil(
-                            "out.write( \" "
-                                + escape(name)
-                                + "=\\\"\" + "
-                                + attributeValue(
-                                    n.getValue(),
-                                    false,
-                                    String.class)
-                                + " + \"\\\"\" );");
+                                "out.write( \" "
+                                        + escape(name)
+                                        + "=\\\"\" + "
+                                        + attributeValue(
+                                        n.getValue(),
+                                        false,
+                                        String.class)
+                                        + " + \"\\\"\" );");
                     }
 
                     n.setEndJavaLine(out.getJavaLine());
@@ -1404,8 +1404,8 @@
             if (width != null) {
                 if (width.isNamedAttribute()) {
                     widthStr =
-                        generateNamedAttributeValue(
-                            width.getNamedAttributeNode());
+                            generateNamedAttributeValue(
+                                    width.getNamedAttributeNode());
                 } else {
                     widthStr = attributeValue(width, false, String.class);
                 }
@@ -1415,8 +1415,8 @@
             if (height != null) {
                 if (height.isNamedAttribute()) {
                     heightStr =
-                        generateNamedAttributeValue(
-                            height.getNamedAttributeNode());
+                            generateNamedAttributeValue(
+                                    height.getNamedAttributeNode());
                 } else {
                     heightStr = attributeValue(height, false, String.class);
                 }
@@ -1474,7 +1474,7 @@
 
             // Then print the output string to the java file
             out.printil(
-                "out.write(" + quote(s0) + s1 + s2 + " + " + quote(s3) + ");");
+                    "out.write(" + quote(s0) + s1 + s2 + " + " + quote(s3) + ");");
             out.printil("out.write(\"\\n\");");
 
             // <param > for java_code
@@ -1503,13 +1503,13 @@
             // <param > for type
             s0 = "<param name=\"type\""
                     + makeAttr(
-                        "value",
-                        "application/x-java-"
+                    "value",
+                    "application/x-java-"
                             + type
                             + ";"
                             + ((jreversion == null)
-                                ? ""
-                                : "version=" + jreversion))
+                            ? ""
+                            : "version=" + jreversion))
                     + '>';
             out.printil("out.write(" + quote(s0) + ");");
             out.printil("out.write(\"\\n\");");
@@ -1527,13 +1527,13 @@
             out.printil("out.write(\"\\n\");");
             s0 = "<embed"
                     + makeAttr(
-                        "type",
-                        "application/x-java-"
+                    "type",
+                    "application/x-java-"
                             + type
                             + ";"
                             + ((jreversion == null)
-                                ? ""
-                                : "version=" + jreversion))
+                            ? ""
+                            : "version=" + jreversion))
                     + makeAttr("name", name);
 
             // s1 and s2 are the same as before.
@@ -1546,7 +1546,7 @@
                     + makeAttr("java_codebase", codebase)
                     + makeAttr("java_archive", archive);
             out.printil(
-                "out.write(" + quote(s0) + s1 + s2 + " + " + quote(s3) + ");");
+                    "out.write(" + quote(s0) + s1 + s2 + " + " + quote(s3) + ");");
 
             /*
              * Generate a 'attr = "value"' for each <jsp:param> in plugin body
@@ -1596,7 +1596,7 @@
 
             // Create variable names
             String baseVar =
-                createTagVarName(n.getQName(), n.getPrefix(), n.getLocalName());
+                    createTagVarName(n.getQName(), n.getPrefix(), n.getLocalName());
             String tagEvalVar = "_jspx_eval_" + baseVar;
             String tagHandlerVar = "_jspx_th_" + baseVar;
             String tagPushBodyCountVar = "_jspx_push_body_count_" + baseVar;
@@ -1638,7 +1638,7 @@
                    adjustments.
                 */
                 GenBuffer genBuffer =
-                    new GenBuffer(n, n.implementsSimpleTag()? null: n.getBody());
+                        new GenBuffer(n, n.implementsSimpleTag() ? null : n.getBody());
                 methodsBuffered.add(genBuffer);
                 out = genBuffer.getOut();
 
@@ -1664,7 +1664,7 @@
                 out.pushIndent();
 
                 // Initilaize local variables used in this method.
-                if (! isTagFile) {
+                if (!isTagFile) {
                     out.printil("PageContext pageContext = _jspx_page_context;");
                 }
                 out.printil("JspWriter out = _jspx_page_context.getOut();");
@@ -1679,11 +1679,11 @@
                  * and end element
                  */
                 generateCustomStart(
-                    n,
-                    handlerInfo,
-                    tagHandlerVar,
-                    tagEvalVar,
-                    tagPushBodyCountVar);
+                        n,
+                        handlerInfo,
+                        tagHandlerVar,
+                        tagEvalVar,
+                        tagPushBodyCountVar);
 
                 // visit body
                 String tmpParent = parent;
@@ -1708,10 +1708,10 @@
                 isSimpleTagHandler = tmpIsSimpleTagHandler;
 
                 generateCustomEnd(
-                    n,
-                    tagHandlerVar,
-                    tagEvalVar,
-                    tagPushBodyCountVar);
+                        n,
+                        tagHandlerVar,
+                        tagEvalVar,
+                        tagPushBodyCountVar);
             }
 
             if (ci.isScriptless() && !ci.hasScriptingVars()) {
@@ -1813,32 +1813,32 @@
                 String attrStr = null;
                 if (attrs[i].isNamedAttribute()) {
                     attrStr =
-                        generateNamedAttributeValue(
-                            attrs[i].getNamedAttributeNode());
+                            generateNamedAttributeValue(
+                                    attrs[i].getNamedAttributeNode());
                 } else {
                     attrStr = attributeValue(attrs[i], false, Object.class);
                 }
                 String s =
-                    " + \" "
-                        + attrs[i].getName()
-                        + "=\\\"\" + "
-                        + attrStr
-                        + " + \"\\\"\"";
+                        " + \" "
+                                + attrs[i].getName()
+                                + "=\\\"\" + "
+                                + attrStr
+                                + " + \"\\\"\"";
                 map.put(attrs[i].getName(), s);
             }
 
             // Write begin tag, using XML-style 'name' attribute as the
             // element name
             String elemName =
-                attributeValue(n.getNameAttribute(), false, String.class);
+                    attributeValue(n.getNameAttribute(), false, String.class);
             out.printin("out.write(\"<\"");
             out.print(" + " + elemName);
 
             // Write remaining attributes
             Enumeration enumeration = map.keys();
             while (enumeration.hasMoreElements()) {
-                String attrName = (String)enumeration.nextElement();
-                out.print((String)map.get(attrName));
+                String attrName = (String) enumeration.nextElement();
+                out.print((String) map.get(attrName));
             }
 
             // Does the <jsp:element> have nested tags other than
@@ -1894,25 +1894,25 @@
             }
 
             if (textSize <= 3) {
-               // Special case small text strings
-               n.setBeginJavaLine(out.getJavaLine());
-               int lineInc = 0;
-               for (int i = 0; i < textSize; i++) {
-                   char ch = text.charAt(i);
-                   out.printil("out.write(" + quote(ch) + ");");
-                   if (i > 0) {
-                       n.addSmap(lineInc);
-                   }
-                   if (ch == '\n') {
-                       lineInc++;
-                   }
-               }
-               n.setEndJavaLine(out.getJavaLine());
-               return;
-           }
+                // Special case small text strings
+                n.setBeginJavaLine(out.getJavaLine());
+                int lineInc = 0;
+                for (int i = 0; i < textSize; i++) {
+                    char ch = text.charAt(i);
+                    out.printil("out.write(" + quote(ch) + ");");
+                    if (i > 0) {
+                        n.addSmap(lineInc);
+                    }
+                    if (ch == '\n') {
+                        lineInc++;
+                    }
+                }
+                n.setEndJavaLine(out.getJavaLine());
+                return;
+            }
 
             if (ctxt.getOptions().genStringAsCharArray()) {
-               // Generate Strings as char arrays, for performance
+                // Generate Strings as char arrays, for performance
                 ServletWriter caOut;
                 if (charArrayBuffer == null) {
                     charArrayBuffer = new GenBuffer();
@@ -1950,16 +1950,16 @@
                 char ch = text.charAt(i);
                 --count;
                 switch (ch) {
-                    case '"' :
+                    case '"':
                         sb.append('\\').append('\"');
                         break;
-                    case '\\' :
+                    case '\\':
                         sb.append('\\').append('\\');
                         break;
-                    case '\r' :
+                    case '\r':
                         sb.append('\\').append('r');
                         break;
-                    case '\n' :
+                    case '\n':
                         sb.append('\\').append('n');
                         srcLine++;
 
@@ -1976,10 +1976,10 @@
                         // add a Smap for this line
                         n.addSmap(srcLine);
                         break;
-                    case '\t' : // Not sure we need this
+                    case '\t': // Not sure we need this
                         sb.append('\\').append('t');
                         break;
-                    default :
+                    default:
                         sb.append(ch);
                 }
             }
@@ -2012,7 +2012,7 @@
             // Copy virtual page scope of tag file to page scope of invoking
             // page
             out.printil(
-                "((org.apache.struts2.jasper.runtime.JspContextWrapper) this.jspContext).syncBeforeInvoke();");
+                    "((org.apache.struts2.jasper.runtime.JspContextWrapper) this.jspContext).syncBeforeInvoke();");
             String varReaderAttr = n.getTextAttribute("varReader");
             String varAttr = n.getTextAttribute("var");
             if (varReaderAttr != null || varAttr != null) {
@@ -2038,7 +2038,7 @@
                 if (varReaderAttr != null) {
                     out.print(quote(varReaderAttr));
                     out.print(
-                        ", new java.io.StringReader(_jspx_sout.toString())");
+                            ", new java.io.StringReader(_jspx_sout.toString())");
                 } else {
                     out.print(quote(varAttr));
                     out.print(", _jspx_sout.toString()");
@@ -2060,7 +2060,7 @@
             // Copy virtual page scope of tag file to page scope of invoking
             // page
             out.printil(
-                "((org.apache.struts2.jasper.runtime.JspContextWrapper) this.jspContext).syncBeforeInvoke();");
+                    "((org.apache.struts2.jasper.runtime.JspContextWrapper) this.jspContext).syncBeforeInvoke();");
 
             // Invoke body
             String varReaderAttr = n.getTextAttribute("varReader");
@@ -2082,7 +2082,7 @@
                 if (varReaderAttr != null) {
                     out.print(quote(varReaderAttr));
                     out.print(
-                        ", new java.io.StringReader(_jspx_sout.toString())");
+                            ", new java.io.StringReader(_jspx_sout.toString())");
                 } else {
                     out.print(quote(varAttr));
                     out.print(", _jspx_sout.toString()");
@@ -2103,36 +2103,36 @@
             for (int i = 0; attrs != null && i < attrs.length; i++) {
                 if (attrs[i].getName().equals(n.getName())) {
                     out.print(
-                        evaluateAttribute(
-                            getTagHandlerInfo(tag),
-                            attrs[i],
-                            tag,
-                            null));
+                            evaluateAttribute(
+                                    getTagHandlerInfo(tag),
+                                    attrs[i],
+                                    tag,
+                                    null));
                     break;
                 }
             }
         }
 
         private TagHandlerInfo getTagHandlerInfo(Node.CustomTag n)
-            throws JasperException {
+                throws JasperException {
             Hashtable handlerInfosByShortName =
-                (Hashtable)handlerInfos.get(n.getPrefix());
+                    (Hashtable) handlerInfos.get(n.getPrefix());
             if (handlerInfosByShortName == null) {
                 handlerInfosByShortName = new Hashtable();
                 handlerInfos.put(n.getPrefix(), handlerInfosByShortName);
             }
             TagHandlerInfo handlerInfo =
-                (TagHandlerInfo)handlerInfosByShortName.get(n.getLocalName());
+                    (TagHandlerInfo) handlerInfosByShortName.get(n.getLocalName());
             if (handlerInfo == null) {
                 handlerInfo =
-                    new TagHandlerInfo(n, n.getTagHandlerClass(), err);
+                        new TagHandlerInfo(n, n.getTagHandlerClass(), err);
                 handlerInfosByShortName.put(n.getLocalName(), handlerInfo);
             }
             return handlerInfo;
         }
 
         private void generateTagPlugin(Node.CustomTag n)
-            throws JasperException {
+                throws JasperException {
             if (n.getAtSTag() != null) {
                 n.getAtSTag().visit(this);
             }
@@ -2143,12 +2143,12 @@
         }
 
         private void generateCustomStart(
-            Node.CustomTag n,
-            TagHandlerInfo handlerInfo,
-            String tagHandlerVar,
-            String tagEvalVar,
-            String tagPushBodyCountVar)
-            throws JasperException {
+                Node.CustomTag n,
+                TagHandlerInfo handlerInfo,
+                String tagHandlerVar,
+                String tagEvalVar,
+                String tagPushBodyCountVar)
+                throws JasperException {
 
             Class tagHandlerClass = handlerInfo.getTagHandlerClass();
 
@@ -2161,7 +2161,7 @@
             saveScriptingVars(n, VariableInfo.AT_BEGIN);
 
             String tagHandlerClassName =
-                JspUtil.getCanonicalName(tagHandlerClass);
+                    JspUtil.getCanonicalName(tagHandlerClass);
             out.printin(tagHandlerClassName);
             out.print(" ");
             out.print(tagHandlerVar);
@@ -2214,7 +2214,7 @@
                     out.printin("if (");
                     out.print(tagEvalVar);
                     out.println(
-                        " != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {");
+                            " != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {");
                     // Assume EVAL_BODY_BUFFERED
                     out.pushIndent();
                     out.printil("out = _jspx_page_context.pushBody();");
@@ -2227,7 +2227,7 @@
                     }
                     out.printin(tagHandlerVar);
                     out.println(
-                        ".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);");
+                            ".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);");
                     out.printin(tagHandlerVar);
                     out.println(".doInitBody();");
 
@@ -2254,10 +2254,10 @@
         }
 
         private void generateCustomEnd(
-            Node.CustomTag n,
-            String tagHandlerVar,
-            String tagEvalVar,
-            String tagPushBodyCountVar) {
+                Node.CustomTag n,
+                String tagHandlerVar,
+                String tagEvalVar,
+                String tagPushBodyCountVar) {
 
             if (!n.hasEmptyBody()) {
                 if (n.implementsIterationTag()) {
@@ -2270,7 +2270,7 @@
                     syncScriptingVars(n, VariableInfo.NESTED);
 
                     out.printil(
-                        "if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)");
+                            "if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)");
                     out.pushIndent();
                     out.printil("break;");
                     out.popIndent();
@@ -2285,7 +2285,7 @@
                     out.printin("if (");
                     out.print(tagEvalVar);
                     out.println(
-                        " != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {");
+                            " != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {");
                     out.pushIndent();
                     out.printil("out = _jspx_page_context.popBody();");
                     if (n.implementsTryCatchFinally()) {
@@ -2306,10 +2306,10 @@
             out.printin("if (");
             out.print(tagHandlerVar);
             out.println(
-                ".doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {");
+                    ".doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {");
             out.pushIndent();
-            if(!n.implementsTryCatchFinally()) {
-                if(isPoolingEnabled) {
+            if (!n.implementsTryCatchFinally()) {
+                if (isPoolingEnabled) {
                     out.printin(n.getTagHandlerPoolName());
                     out.print(".reuse(");
                     out.print(tagHandlerVar);
@@ -2375,10 +2375,10 @@
         }
 
         private void generateCustomDoTag(
-            Node.CustomTag n,
-            TagHandlerInfo handlerInfo,
-            String tagHandlerVar)
-            throws JasperException {
+                Node.CustomTag n,
+                TagHandlerInfo handlerInfo,
+                String tagHandlerVar)
+                throws JasperException {
 
             Class tagHandlerClass = handlerInfo.getTagHandlerClass();
 
@@ -2391,7 +2391,7 @@
             saveScriptingVars(n, VariableInfo.AT_BEGIN);
 
             String tagHandlerClassName =
-                JspUtil.getCanonicalName(tagHandlerClass);
+                    JspUtil.getCanonicalName(tagHandlerClass);
             out.printin(tagHandlerClassName);
             out.print(" ");
             out.print(tagHandlerVar);
@@ -2453,7 +2453,7 @@
                 for (int i = 0; i < vec.size(); i++) {
                     Object elem = vec.elementAt(i);
                     if (elem instanceof VariableInfo) {
-                        VariableInfo varInfo = (VariableInfo)elem;
+                        VariableInfo varInfo = (VariableInfo) elem;
                         if (varInfo.getDeclare()) {
                             out.printin(varInfo.getClassName());
                             out.print(" ");
@@ -2461,15 +2461,15 @@
                             out.println(" = null;");
                         }
                     } else {
-                        TagVariableInfo tagVarInfo = (TagVariableInfo)elem;
+                        TagVariableInfo tagVarInfo = (TagVariableInfo) elem;
                         if (tagVarInfo.getDeclare()) {
                             String varName = tagVarInfo.getNameGiven();
                             if (varName == null) {
                                 varName =
-                                    n.getTagData().getAttributeString(
-                                        tagVarInfo.getNameFromAttribute());
+                                        n.getTagData().getAttributeString(
+                                                tagVarInfo.getNameFromAttribute());
                             } else if (
-                                tagVarInfo.getNameFromAttribute() != null) {
+                                    tagVarInfo.getNameFromAttribute() != null) {
                                 // alias
                                 continue;
                             }
@@ -2513,7 +2513,7 @@
                         continue;
                     String varName = varInfos[i].getVarName();
                     String tmpVarName =
-                        "_jspx_" + varName + "_" + n.getCustomNestingLevel();
+                            "_jspx_" + varName + "_" + n.getCustomNestingLevel();
                     out.printin(tmpVarName);
                     out.print(" = ");
                     out.print(varName);
@@ -2530,14 +2530,14 @@
                     String varName = tagVarInfos[i].getNameGiven();
                     if (varName == null) {
                         varName =
-                            n.getTagData().getAttributeString(
-                                tagVarInfos[i].getNameFromAttribute());
+                                n.getTagData().getAttributeString(
+                                        tagVarInfos[i].getNameFromAttribute());
                     } else if (tagVarInfos[i].getNameFromAttribute() != null) {
                         // alias
                         continue;
                     }
                     String tmpVarName =
-                        "_jspx_" + varName + "_" + n.getCustomNestingLevel();
+                            "_jspx_" + varName + "_" + n.getCustomNestingLevel();
                     out.printin(tmpVarName);
                     out.print(" = ");
                     out.print(varName);
@@ -2574,7 +2574,7 @@
                         continue;
                     String varName = varInfos[i].getVarName();
                     String tmpVarName =
-                        "_jspx_" + varName + "_" + n.getCustomNestingLevel();
+                            "_jspx_" + varName + "_" + n.getCustomNestingLevel();
                     out.printin(varName);
                     out.print(" = ");
                     out.print(tmpVarName);
@@ -2591,14 +2591,14 @@
                     String varName = tagVarInfos[i].getNameGiven();
                     if (varName == null) {
                         varName =
-                            n.getTagData().getAttributeString(
-                                tagVarInfos[i].getNameFromAttribute());
+                                n.getTagData().getAttributeString(
+                                        tagVarInfos[i].getNameFromAttribute());
                     } else if (tagVarInfos[i].getNameFromAttribute() != null) {
                         // alias
                         continue;
                     }
                     String tmpVarName =
-                        "_jspx_" + varName + "_" + n.getCustomNestingLevel();
+                            "_jspx_" + varName + "_" + n.getCustomNestingLevel();
                     out.printin(varName);
                     out.print(" = ");
                     out.print(tmpVarName);
@@ -2636,10 +2636,10 @@
                         String name = tagVarInfos[i].getNameGiven();
                         if (name == null) {
                             name =
-                                n.getTagData().getAttributeString(
-                                    tagVarInfos[i].getNameFromAttribute());
+                                    n.getTagData().getAttributeString(
+                                            tagVarInfos[i].getNameFromAttribute());
                         } else if (
-                            tagVarInfos[i].getNameFromAttribute() != null) {
+                                tagVarInfos[i].getNameFromAttribute() != null) {
                             // alias
                             continue;
                         }
@@ -2660,15 +2660,15 @@
          * Identifier.
          */
         private String createTagVarName(
-            String fullName,
-            String prefix,
-            String shortName) {
+                String fullName,
+                String prefix,
+                String shortName) {
 
             String varName;
             synchronized (tagVarNumbers) {
                 varName = prefix + "_" + shortName + "_";
                 if (tagVarNumbers.get(fullName) != null) {
-                    Integer i = (Integer)tagVarNumbers.get(fullName);
+                    Integer i = (Integer) tagVarNumbers.get(fullName);
                     varName = varName + i.intValue();
                     tagVarNumbers.put(fullName, new Integer(i.intValue() + 1));
                 } else {
@@ -2680,11 +2680,11 @@
         }
 
         private String evaluateAttribute(
-            TagHandlerInfo handlerInfo,
-            Node.JspAttribute attr,
-            Node.CustomTag n,
-            String tagHandlerVar)
-            throws JasperException {
+                TagHandlerInfo handlerInfo,
+                Node.JspAttribute attr,
+                Node.CustomTag n,
+                String tagHandlerVar)
+                throws JasperException {
 
             String attrValue = attr.getValue();
             if (attrValue == null) {
@@ -2692,13 +2692,13 @@
                     if (n.checkIfAttributeIsJspFragment(attr.getName())) {
                         // XXX - no need to generate temporary variable here
                         attrValue =
-                            generateNamedAttributeJspFragment(
-                                attr.getNamedAttributeNode(),
-                                tagHandlerVar);
+                                generateNamedAttributeJspFragment(
+                                        attr.getNamedAttributeNode(),
+                                        tagHandlerVar);
                     } else {
                         attrValue =
-                            generateNamedAttributeValue(
-                                attr.getNamedAttributeNode());
+                                generateNamedAttributeValue(
+                                        attr.getNamedAttributeNode());
                     }
                 } else {
                     return null;
@@ -2715,9 +2715,9 @@
                 m = handlerInfo.getSetterMethod(localName);
                 if (m == null) {
                     err.jspError(
-                        n,
-                        "jsp.error.unable.to_find_method",
-                        attr.getName());
+                            n,
+                            "jsp.error.unable.to_find_method",
+                            attr.getName());
                 }
                 c = m.getParameterTypes();
                 // XXX assert(c.length > 0)
@@ -2727,52 +2727,53 @@
                 // Do nothing
             } else if (attr.isNamedAttribute()) {
                 if (!n.checkIfAttributeIsJspFragment(attr.getName())
-                    && !attr.isDynamic()) {
+                        && !attr.isDynamic()) {
                     attrValue =
-                        convertString(
-                            c[0],
-                            attrValue,
-                            localName,
-                            handlerInfo.getPropertyEditorClass(localName),
-                            true);
+                            convertString(
+                                    c[0],
+                                    attrValue,
+                                    localName,
+                                    handlerInfo.getPropertyEditorClass(localName),
+                                    true);
                 }
             } else if (attr.isELInterpreterInput()) {
                 // run attrValue through the expression interpreter
                 boolean replaceESC = attrValue.indexOf(Constants.HACK_CHAR) > 0;
                 attrValue =
-                    JspUtil.interpreterCall(
-                        this.isTagFile,
-                        attrValue,
-                        c[0],
-                        attr.getEL().getMapName(),
-                        false);
+                        JspUtil.interpreterCall(
+                                this.isTagFile,
+                                attrValue,
+                                c[0],
+                                attr.getEL().getMapName(),
+                                false);
                 // XXX hack: Replace ESC with '$'
                 if (replaceESC) {
                     attrValue =
-                        "("
-                            + attrValue
-                            + ").replace("
-                            + Constants.HACK_STR
-                            + ", '$')";
+                            "("
+                                    + attrValue
+                                    + ").replace("
+                                    + Constants.HACK_STR
+                                    + ", '$')";
                 }
             } else {
                 attrValue =
-                    convertString(
-                        c[0],
-                        attrValue,
-                        localName,
-                        handlerInfo.getPropertyEditorClass(localName),
-                        false);
+                        convertString(
+                                c[0],
+                                attrValue,
+                                localName,
+                                handlerInfo.getPropertyEditorClass(localName),
+                                false);
             }
             return attrValue;
         }
 
         /**
          * Generate code to create a map for the alias variables
+         *
          * @return the name of the map
          */
         private String generateAliasMap(Node.CustomTag n, String tagHandlerVar)
-            throws JasperException {
+                throws JasperException {
 
             TagVariableInfo[] tagVars = n.getTagVariableInfos();
             String aliasMapVar = null;
@@ -2805,11 +2806,11 @@
         }
 
         private void generateSetters(
-            Node.CustomTag n,
-            String tagHandlerVar,
-            TagHandlerInfo handlerInfo,
-            boolean simpleTag)
-            throws JasperException {
+                Node.CustomTag n,
+                String tagHandlerVar,
+                TagHandlerInfo handlerInfo,
+                boolean simpleTag)
+                throws JasperException {
 
             // Set context
             if (simpleTag) {
@@ -2868,7 +2869,7 @@
             Node.JspAttribute[] attrs = n.getJspAttributes();
             for (int i = 0; attrs != null && i < attrs.length; i++) {
                 String attrValue =
-                    evaluateAttribute(handlerInfo, attrs[i], n, tagHandlerVar);
+                        evaluateAttribute(handlerInfo, attrs[i], n, tagHandlerVar);
 
                 if (attrs[i].isDynamic()) {
                     out.printin(tagHandlerVar);
@@ -2889,9 +2890,9 @@
                     out.printin(tagHandlerVar);
                     out.print(".");
                     out.print(
-                        handlerInfo
-                            .getSetterMethod(attrs[i].getLocalName())
-                            .getName());
+                            handlerInfo
+                                    .getSetterMethod(attrs[i].getLocalName())
+                                    .getName());
                     out.print("(");
                     out.print(attrValue);
                     out.println(");");
@@ -2910,12 +2911,12 @@
          * action), and false otherwise
          */
         private String convertString(
-            Class c,
-            String s,
-            String attrName,
-            Class propEditorClass,
-            boolean isNamedAttribute)
-            throws JasperException {
+                Class c,
+                String s,
+                String attrName,
+                Class propEditorClass,
+                boolean isNamedAttribute)
+                throws JasperException {
 
             String quoted = s;
             if (!isNamedAttribute) {
@@ -2925,16 +2926,16 @@
             if (propEditorClass != null) {
                 String className = JspUtil.getCanonicalName(c);
                 return "("
-                    + className
-                    + ")org.apache.struts2.jasper.runtime.JspRuntimeLibrary.getValueFromBeanInfoPropertyEditor("
-                    + className
-                    + ".class, \""
-                    + attrName
-                    + "\", "
-                    + quoted
-                    + ", "
-                    + JspUtil.getCanonicalName(propEditorClass)
-                    + ".class)";
+                        + className
+                        + ")org.apache.struts2.jasper.runtime.JspRuntimeLibrary.getValueFromBeanInfoPropertyEditor("
+                        + className
+                        + ".class, \""
+                        + attrName
+                        + "\", "
+                        + quoted
+                        + ", "
+                        + JspUtil.getCanonicalName(propEditorClass)
+                        + ".class)";
             } else if (c == String.class) {
                 return quoted;
             } else if (c == boolean.class) {
@@ -2974,14 +2975,14 @@
             } else {
                 String className = JspUtil.getCanonicalName(c);
                 return "("
-                    + className
-                    + ")org.apache.struts2.jasper.runtime.JspRuntimeLibrary.getValueFromPropertyEditorManager("
-                    + className
-                    + ".class, \""
-                    + attrName
-                    + "\", "
-                    + quoted
-                    + ")";
+                        + className
+                        + ")org.apache.struts2.jasper.runtime.JspRuntimeLibrary.getValueFromPropertyEditorManager("
+                        + className
+                        + ".class, \""
+                        + attrName
+                        + "\", "
+                        + quoted
+                        + ")";
             }
         }
 
@@ -3009,7 +3010,7 @@
          * argument to SimpleTag.setJspBody().
          */
         private void generateJspFragment(Node n, String tagHandlerVar)
-            throws JasperException {
+                throws JasperException {
             // XXX - A possible optimization here would be to check to see
             // if the only child of the parent node is TemplateText.  If so,
             // we know there won't be any parameters, etc, so we can
@@ -3017,10 +3018,10 @@
             // body.  The implementation of this fragment can come from
             // the org.apache.struts2.jasper.runtime package as a support class.
             FragmentHelperClass.Fragment fragment =
-                fragmentHelperClass.openFragment(
-                    n,
-                    tagHandlerVar,
-                    methodNesting);
+                    fragmentHelperClass.openFragment(
+                            n,
+                            tagHandlerVar,
+                            methodNesting);
             ServletWriter outSave = out;
             out = fragment.getGenBuffer().getOut();
             String tmpParent = parent;
@@ -3045,15 +3046,15 @@
             // we're not in a place where pageContext is defined (e.g.
             // in a fragment or in a tag file.
             out.print(
-                "new "
-                    + fragmentHelperClass.getClassName()
-                    + "( "
-                    + fragment.getId()
-                    + ", _jspx_page_context, "
-                    + tagHandlerVar
-                    + ", "
-                    + pushBodyCountVar
-                    + ")");
+                    "new "
+                            + fragmentHelperClass.getClassName()
+                            + "( "
+                            + fragment.getId()
+                            + ", _jspx_page_context, "
+                            + tagHandlerVar
+                            + ", "
+                            + pushBodyCountVar
+                            + ")");
         }
 
         /**
@@ -3063,7 +3064,7 @@
          * @return The name of the temporary variable the result is stored in.
          */
         public String generateNamedAttributeValue(Node.NamedAttribute n)
-            throws JasperException {
+                throws JasperException {
 
             String varName = n.getTemporaryVariableName();
 
@@ -3080,14 +3081,14 @@
                     if (bodyElement instanceof Node.TemplateText) {
                         templateTextOptimization = true;
                         out.printil(
-                            "String "
-                                + varName
-                                + " = "
-                                + quote(
-                                    new String(
-                                        ((Node.TemplateText)bodyElement)
-                                            .getText()))
-                                + ";");
+                                "String "
+                                        + varName
+                                        + " = "
+                                        + quote(
+                                        new String(
+                                                ((Node.TemplateText) bodyElement)
+                                                        .getText()))
+                                        + ";");
                     }
                 }
 
@@ -3098,11 +3099,11 @@
                     out.printil("out = _jspx_page_context.pushBody();");
                     visitBody(n);
                     out.printil(
-                        "String "
-                            + varName
-                            + " = "
-                            + "((javax.servlet.jsp.tagext.BodyContent)"
-                            + "out).getString();");
+                            "String "
+                                    + varName
+                                    + " = "
+                                    + "((javax.servlet.jsp.tagext.BodyContent)"
+                                    + "out).getString();");
                     out.printil("out = _jspx_page_context.popBody();");
                 }
             } else {
@@ -3117,20 +3118,20 @@
          * Similar to generateNamedAttributeValue, but create a JspFragment
          * instead.
          *
-         * @param n The parent node of the named attribute
+         * @param n             The parent node of the named attribute
          * @param tagHandlerVar The variable the tag handler is stored in,
-         *     so the fragment knows its parent tag.
+         *                      so the fragment knows its parent tag.
          * @return The name of the temporary variable the fragment
-         *     is stored in.
+         *         is stored in.
          */
         public String generateNamedAttributeJspFragment(
-            Node.NamedAttribute n,
-            String tagHandlerVar)
-            throws JasperException {
+                Node.NamedAttribute n,
+                String tagHandlerVar)
+                throws JasperException {
             String varName = n.getTemporaryVariableName();
 
             out.printin(
-                "javax.servlet.jsp.tagext.JspFragment " + varName + " = ");
+                    "javax.servlet.jsp.tagext.JspFragment " + varName + " = ");
             generateJspFragment(n, tagHandlerVar);
             out.println(";");
 
@@ -3139,14 +3140,14 @@
     }
 
     private static void generateLocalVariables(ServletWriter out, Node n)
-        throws JasperException {
+            throws JasperException {
         Node.ChildInfo ci;
         if (n instanceof Node.CustomTag) {
-            ci = ((Node.CustomTag)n).getChildInfo();
+            ci = ((Node.CustomTag) n).getChildInfo();
         } else if (n instanceof Node.JspBody) {
-            ci = ((Node.JspBody)n).getChildInfo();
+            ci = ((Node.JspBody) n).getChildInfo();
         } else if (n instanceof Node.NamedAttribute) {
-            ci = ((Node.NamedAttribute)n).getChildInfo();
+            ci = ((Node.NamedAttribute) n).getChildInfo();
         } else {
             // Cannot access err since this method is static, but at
             // least flag an error.
@@ -3158,18 +3159,18 @@
         if (ci.hasUseBean()) {
             out.printil("HttpSession session = _jspx_page_context.getSession();");
             out.printil(
-                "ServletContext application = _jspx_page_context.getServletContext();");
+                    "ServletContext application = _jspx_page_context.getServletContext();");
         }
         if (ci.hasUseBean()
-            || ci.hasIncludeAction()
-            || ci.hasSetProperty()
-            || ci.hasParamAction()) {
+                || ci.hasIncludeAction()
+                || ci.hasSetProperty()
+                || ci.hasParamAction()) {
             out.printil(
-                "HttpServletRequest request = (HttpServletRequest)_jspx_page_context.getRequest();");
+                    "HttpServletRequest request = (HttpServletRequest)_jspx_page_context.getRequest();");
         }
         if (ci.hasIncludeAction()) {
             out.printil(
-                "HttpServletResponse response = (HttpServletResponse)_jspx_page_context.getResponse();");
+                    "HttpServletResponse response = (HttpServletResponse)_jspx_page_context.getResponse();");
         }
     }
 
@@ -3179,7 +3180,7 @@
     private void genCommonPostamble() {
         // Append any methods that were generated in the buffer.
         for (int i = 0; i < methodsBuffered.size(); i++) {
-            GenBuffer methodBuffer = (GenBuffer)methodsBuffered.get(i);
+            GenBuffer methodBuffer = (GenBuffer) methodsBuffered.get(i);
             methodBuffer.adjustJavaLines(out.getJavaLine() - 1);
             out.printMultiLn(methodBuffer.toString());
         }
@@ -3209,7 +3210,7 @@
         out.printil("} catch (Throwable t) {");
         out.pushIndent();
         out.printil(
-            "if (!(t instanceof SkipPageException)){");
+                "if (!(t instanceof SkipPageException)){");
         out.pushIndent();
         out.printil("out = _jspx_out;");
         out.printil("if (out != null && out.getBufferSize() != 0)");
@@ -3218,7 +3219,7 @@
         out.popIndent();
 
         out.printil(
-            "if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);");
+                "if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);");
         out.popIndent();
         out.printil("}");
         out.popIndent();
@@ -3226,7 +3227,7 @@
         out.pushIndent();
 
         out.printil(
-            "if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);");
+                "if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);");
 
         out.popIndent();
         out.printil("}");
@@ -3275,15 +3276,16 @@
 
     /**
      * The main entry for Generator.
-     * @param out The servlet output writer
+     *
+     * @param out      The servlet output writer
      * @param compiler The compiler
-     * @param page The input page
+     * @param page     The input page
      */
     public static void generate(
-        ServletWriter out,
-        Compiler compiler,
-        Node.Nodes page)
-        throws JasperException {
+            ServletWriter out,
+            Compiler compiler,
+            Node.Nodes page)
+            throws JasperException {
 
         Generator gen = new Generator(out, compiler);
 
@@ -3291,7 +3293,7 @@
             gen.compileTagHandlerPoolList(page);
         }
         if (gen.ctxt.isTagFile()) {
-            JasperTagInfo tagInfo = (JasperTagInfo)gen.ctxt.getTagInfo();
+            JasperTagInfo tagInfo = (JasperTagInfo) gen.ctxt.getTagInfo();
             gen.generateTagHandlerPreamble(tagInfo, page);
 
             if (gen.ctxt.isPrototypeMode()) {
@@ -3301,26 +3303,26 @@
             gen.generateXmlProlog(page);
             gen.fragmentHelperClass.generatePreamble();
             page.visit(
-                gen.new GenerateVisitor(
-                    gen.ctxt.isTagFile(),
-                    out,
-                    gen.methodsBuffered,
-                    gen.fragmentHelperClass,
-                    gen.ctxt.getClassLoader(),
-                    tagInfo));
+                    gen.new GenerateVisitor(
+                            gen.ctxt.isTagFile(),
+                            out,
+                            gen.methodsBuffered,
+                            gen.fragmentHelperClass,
+                            gen.ctxt.getClassLoader(),
+                            tagInfo));
             gen.generateTagHandlerPostamble(tagInfo);
         } else {
             gen.generatePreamble(page);
             gen.generateXmlProlog(page);
             gen.fragmentHelperClass.generatePreamble();
             page.visit(
-                gen.new GenerateVisitor(
-                    gen.ctxt.isTagFile(),
-                    out,
-                    gen.methodsBuffered,
-                    gen.fragmentHelperClass,
-                    gen.ctxt.getClassLoader(),
-                    null));
+                    gen.new GenerateVisitor(
+                            gen.ctxt.isTagFile(),
+                            out,
+                            gen.methodsBuffered,
+                            gen.fragmentHelperClass,
+                            gen.ctxt.getClassLoader(),
+                            null));
             gen.generatePostamble(page);
         }
     }
@@ -3329,9 +3331,9 @@
      * Generates tag handler preamble.
      */
     private void generateTagHandlerPreamble(
-        JasperTagInfo tagInfo,
-        Node.Nodes tag)
-        throws JasperException {
+            JasperTagInfo tagInfo,
+            Node.Nodes tag)
+            throws JasperException {
 
         // Generate package declaration
         String className = tagInfo.getTagClassName();
@@ -3350,11 +3352,11 @@
         out.println(className);
         out.printil("    extends javax.servlet.jsp.tagext.SimpleTagSupport");
         out.printin(
-            "    implements org.apache.struts2.jasper.runtime.JspSourceDependent");
+                "    implements org.apache.struts2.jasper.runtime.JspSourceDependent");
         if (tagInfo.hasDynamicAttributes()) {
             out.println(",");
             out.printin(
-                "               javax.servlet.jsp.tagext.DynamicAttributes");
+                    "               javax.servlet.jsp.tagext.DynamicAttributes");
         }
         out.println(" {");
         out.println();
@@ -3390,7 +3392,7 @@
 
         // Now the doTag() method
         out.printil(
-            "public void doTag() throws JspException, java.io.IOException {");
+                "public void doTag() throws JspException, java.io.IOException {");
 
         if (ctxt.isPrototypeMode()) {
             out.printil("}");
@@ -3411,14 +3413,14 @@
 
         // Declare implicit objects.
         out.printil(
-            "HttpServletRequest request = "
-                + "(HttpServletRequest) _jspx_page_context.getRequest();");
+                "HttpServletRequest request = "
+                        + "(HttpServletRequest) _jspx_page_context.getRequest();");
         out.printil(
-            "HttpServletResponse response = "
-                + "(HttpServletResponse) _jspx_page_context.getResponse();");
+                "HttpServletResponse response = "
+                        + "(HttpServletResponse) _jspx_page_context.getResponse();");
         out.printil("HttpSession session = _jspx_page_context.getSession();");
         out.printil(
-            "ServletContext application = _jspx_page_context.getServletContext();");
+                "ServletContext application = _jspx_page_context.getServletContext();");
         out.printil("ServletConfig config = _jspx_page_context.getServletConfig();");
         out.printil("JspWriter out = jspContext.getOut();");
         if (isPoolingEnabled && !tagHandlerPoolNames.isEmpty()) {
@@ -3453,7 +3455,7 @@
         out.printil("} finally {");
         out.pushIndent();
         out.printil(
-            "((org.apache.struts2.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();");
+                "((org.apache.struts2.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();");
         if (isPoolingEnabled && !tagHandlerPoolNames.isEmpty()) {
             out.printil("_jspDestroy();");
         }
@@ -3473,11 +3475,11 @@
      * getter and setter methods for each.
      */
     private void generateTagHandlerAttributes(TagInfo tagInfo)
-        throws JasperException {
+            throws JasperException {
 
         if (tagInfo.hasDynamicAttributes()) {
             out.printil(
-                "private java.util.HashMap _jspx_dynamic_attrs = new java.util.HashMap();");
+                    "private java.util.HashMap _jspx_dynamic_attrs = new java.util.HashMap();");
         }
 
         // Declare attributes
@@ -3559,7 +3561,7 @@
         TagVariableInfo[] tagVars = tagInfo.getTagVariableInfos();
         for (int i = 0; i < tagVars.length; i++) {
             if (tagVars[i].getNameFromAttribute() != null
-                && tagVars[i].getNameGiven() != null) {
+                    && tagVars[i].getNameGiven() != null) {
                 aliasSeen = true;
                 break;
             }
@@ -3567,7 +3569,7 @@
 
         if (aliasSeen) {
             out.printil(
-                "public void setJspContext(JspContext ctx, java.util.Map aliasMap) {");
+                    "public void setJspContext(JspContext ctx, java.util.Map aliasMap) {");
         } else {
             out.printil("public void setJspContext(JspContext ctx) {");
         }
@@ -3580,28 +3582,28 @@
         for (int i = 0; i < tagVars.length; i++) {
 
             switch (tagVars[i].getScope()) {
-                case VariableInfo.NESTED :
+                case VariableInfo.NESTED:
                     if (!nestedSeen) {
                         out.printil(
-                            "_jspx_nested = new java.util.ArrayList();");
+                                "_jspx_nested = new java.util.ArrayList();");
                         nestedSeen = true;
                     }
                     out.printin("_jspx_nested.add(");
                     break;
 
-                case VariableInfo.AT_BEGIN :
+                case VariableInfo.AT_BEGIN:
                     if (!atBeginSeen) {
                         out.printil(
-                            "_jspx_at_begin = new java.util.ArrayList();");
+                                "_jspx_at_begin = new java.util.ArrayList();");
                         atBeginSeen = true;
                     }
                     out.printin("_jspx_at_begin.add(");
                     break;
 
-                case VariableInfo.AT_END :
+                case VariableInfo.AT_END:
                     if (!atEndSeen) {
                         out.printil(
-                            "_jspx_at_end = new java.util.ArrayList();");
+                                "_jspx_at_end = new java.util.ArrayList();");
                         atEndSeen = true;
                     }
                     out.printin("_jspx_at_end.add(");
@@ -3613,10 +3615,10 @@
         }
         if (aliasSeen) {
             out.printil(
-                "this.jspContext = new org.apache.struts2.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, aliasMap);");
+                    "this.jspContext = new org.apache.struts2.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, aliasMap);");
         } else {
             out.printil(
-                "this.jspContext = new org.apache.struts2.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, null);");
+                    "this.jspContext = new org.apache.struts2.jasper.runtime.JspContextWrapper(ctx, _jspx_nested, _jspx_at_begin, _jspx_at_end, null);");
         }
         out.popIndent();
         out.printil("}");
@@ -3636,7 +3638,7 @@
      */
     public void generateSetDynamicAttribute() {
         out.printil(
-            "public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {");
+                "public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {");
         out.pushIndent();
         /*
          * According to the spec, only dynamic attributes with no uri are to
@@ -3709,20 +3711,20 @@
         /**
          * Constructor.
          *
-         * @param n The custom tag whose tag handler class is to be
-         * introspected
+         * @param n               The custom tag whose tag handler class is to be
+         *                        introspected
          * @param tagHandlerClass Tag handler class
-         * @param err Error dispatcher
+         * @param err             Error dispatcher
          */
         TagHandlerInfo(Node n, Class tagHandlerClass, ErrorDispatcher err)
-            throws JasperException {
+                throws JasperException {
             this.tagHandlerClass = tagHandlerClass;
             this.methodMaps = new Hashtable();
             this.propertyEditorMaps = new Hashtable();
 
             try {
                 BeanInfo tagClassInfo =
-                    Introspector.getBeanInfo(tagHandlerClass);
+                        Introspector.getBeanInfo(tagHandlerClass);
                 PropertyDescriptor[] pd = tagClassInfo.getPropertyDescriptors();
                 for (int i = 0; i < pd.length; i++) {
                     /*
@@ -3734,15 +3736,15 @@
                     }
                     if (pd[i].getPropertyEditorClass() != null)
                         propertyEditorMaps.put(
-                            pd[i].getName(),
-                            pd[i].getPropertyEditorClass());
+                                pd[i].getName(),
+                                pd[i].getPropertyEditorClass());
                 }
             } catch (IntrospectionException ie) {
                 err.jspError(
-                    n,
-                    "jsp.error.introspect.taghandler",
-                    tagHandlerClass.getName(),
-                    ie);
+                        n,
+                        "jsp.error.introspect.taghandler",
+                        tagHandlerClass.getName(),
+                        ie);
             }
         }
 
@@ -3750,14 +3752,14 @@
          * XXX
          */
         public Method getSetterMethod(String attrName) {
-            return (Method)methodMaps.get(attrName);
+            return (Method) methodMaps.get(attrName);
         }
 
         /**
          * XXX
          */
         public Class getPropertyEditorClass(String attrName) {
-            return (Class)propertyEditorMaps.get(attrName);
+            return (Class) propertyEditorMaps.get(attrName);
         }
 
         /**
@@ -3828,7 +3830,7 @@
                         }
 
                         public void visit(Node.CustomTag n)
-                            throws JasperException {
+                                throws JasperException {
                             Node.Nodes b = n.getBody();
                             if (b != null && !b.isGeneratedInBuffer()) {
                                 // Don't adjust lines for the nested tags that
@@ -3904,19 +3906,19 @@
             // _jspx_meth_*
             out.printil("private class " + className);
             out.printil(
-                "    extends " + "org.apache.struts2.jasper.runtime.JspFragmentHelper");
+                    "    extends " + "org.apache.struts2.jasper.runtime.JspFragmentHelper");
             out.printil("{");
             out.pushIndent();
             out.printil(
-                "private javax.servlet.jsp.tagext.JspTag _jspx_parent;");
+                    "private javax.servlet.jsp.tagext.JspTag _jspx_parent;");
             out.printil("private int[] _jspx_push_body_count;");
             out.println();
             out.printil(
-                "public "
-                    + className
-                    + "( int discriminator, JspContext jspContext, "
-                    + "javax.servlet.jsp.tagext.JspTag _jspx_parent, "
-                    + "int[] _jspx_push_body_count ) {");
+                    "public "
+                            + className
+                            + "( int discriminator, JspContext jspContext, "
+                            + "javax.servlet.jsp.tagext.JspTag _jspx_parent, "
+                            + "int[] _jspx_push_body_count ) {");
             out.pushIndent();
             out.printil("super( discriminator, jspContext, _jspx_parent );");
             out.printil("this._jspx_parent = _jspx_parent;");
@@ -3926,10 +3928,10 @@
         }
 
         public Fragment openFragment(
-            Node parent,
-            String tagHandlerVar,
-            int methodNesting)
-            throws JasperException {
+                Node parent,
+                String tagHandlerVar,
+                int methodNesting)
+                throws JasperException {
             Fragment result = new Fragment(fragments.size(), parent);
             fragments.add(result);
             this.used = true;
@@ -3978,7 +3980,7 @@
             ServletWriter out = this.classBuffer.getOut();
             // Generate all fragment methods:
             for (int i = 0; i < fragments.size(); i++) {
-                Fragment fragment = (Fragment)fragments.get(i);
+                Fragment fragment = (Fragment) fragments.get(i);
                 fragment.getGenBuffer().adjustJavaLines(out.getJavaLine() - 1);
                 out.printMultiLn(fragment.getGenBuffer().toString());
             }
@@ -4018,7 +4020,7 @@
             out.printil("catch( Throwable e ) {");
             out.pushIndent();
             out.printil(
-                "if (e instanceof SkipPageException)");
+                    "if (e instanceof SkipPageException)");
             out.printil("    throw (SkipPageException) e;");
             out.printil("throw new JspException( e );");
             out.popIndent();
@@ -4047,7 +4049,7 @@
 
         public void adjustJavaLines(int offset) {
             for (int i = 0; i < fragments.size(); i++) {
-                Fragment fragment = (Fragment)fragments.get(i);
+                Fragment fragment = (Fragment) fragments.get(i);
                 fragment.getGenBuffer().adjustJavaLines(offset);
             }
         }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ImplicitTagLibraryInfo.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ImplicitTagLibraryInfo.java
index 7c4763c..4e72ac4 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ImplicitTagLibraryInfo.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ImplicitTagLibraryInfo.java
@@ -31,7 +31,7 @@
 
 /**
  * Class responsible for generating an implicit tag library containing tag
- * handlers corresponding to the tag files in "/WEB-INF/tags/" or a 
+ * handlers corresponding to the tag files in "/WEB-INF/tags/" or a
  * subdirectory of it.
  *
  * @author Jan Luehe
@@ -55,57 +55,57 @@
      * Constructor.
      */
     public ImplicitTagLibraryInfo(JspCompilationContext ctxt,
-				  ParserController pc,
-				  String prefix,
-				  String tagdir,
-				  ErrorDispatcher err) throws JasperException {
+                                  ParserController pc,
+                                  String prefix,
+                                  String tagdir,
+                                  ErrorDispatcher err) throws JasperException {
         super(prefix, null);
-	this.pc = pc;
-	this.tagFileMap = new Hashtable();
-	this.vec = new Vector();
+        this.pc = pc;
+        this.tagFileMap = new Hashtable();
+        this.vec = new Vector();
 
         // Implicit tag libraries have no functions:
         this.functions = new FunctionInfo[0];
 
-	tlibversion = TLIB_VERSION;
-	jspversion = JSP_VERSION;
+        tlibversion = TLIB_VERSION;
+        jspversion = JSP_VERSION;
 
-	if (!tagdir.startsWith(WEB_INF_TAGS)) {
-	    err.jspError("jsp.error.invalid.tagdir", tagdir);
-	}
-	
-	// Determine the value of the <short-name> subelement of the
-	// "imaginary" <taglib> element
-	if (tagdir.equals(WEB_INF_TAGS)
-	        || tagdir.equals( WEB_INF_TAGS + "/")) {
-	    shortname = TAGS_SHORTNAME;
-	} else {
-	    shortname = tagdir.substring(WEB_INF_TAGS.length());
-	    shortname = shortname.replace('/', '-');
-	}
+        if (!tagdir.startsWith(WEB_INF_TAGS)) {
+            err.jspError("jsp.error.invalid.tagdir", tagdir);
+        }
 
-	// Populate mapping of tag names to tag file paths
-	Set dirList = ctxt.getResourcePaths(tagdir);
-	if (dirList != null) {
-	    Iterator it = dirList.iterator();
-	    while (it.hasNext()) {
-		String path = (String) it.next();
-		if (path.endsWith(TAG_FILE_SUFFIX)
-		        || path.endsWith(TAGX_FILE_SUFFIX)) {
-		    /*
-		     * Use the filename of the tag file, without the .tag or
-		     * .tagx extension, respectively, as the <name> subelement
-		     * of the "imaginary" <tag-file> element
-		     */
-		    String suffix = path.endsWith(TAG_FILE_SUFFIX) ?
-			TAG_FILE_SUFFIX : TAGX_FILE_SUFFIX; 
-		    String tagName = path.substring(path.lastIndexOf("/") + 1);
-		    tagName = tagName.substring(0,
-						tagName.lastIndexOf(suffix));
-		    tagFileMap.put(tagName, path);
-		}
-	    }
-	}
+        // Determine the value of the <short-name> subelement of the
+        // "imaginary" <taglib> element
+        if (tagdir.equals(WEB_INF_TAGS)
+                || tagdir.equals(WEB_INF_TAGS + "/")) {
+            shortname = TAGS_SHORTNAME;
+        } else {
+            shortname = tagdir.substring(WEB_INF_TAGS.length());
+            shortname = shortname.replace('/', '-');
+        }
+
+        // Populate mapping of tag names to tag file paths
+        Set dirList = ctxt.getResourcePaths(tagdir);
+        if (dirList != null) {
+            Iterator it = dirList.iterator();
+            while (it.hasNext()) {
+                String path = (String) it.next();
+                if (path.endsWith(TAG_FILE_SUFFIX)
+                        || path.endsWith(TAGX_FILE_SUFFIX)) {
+                    /*
+                  * Use the filename of the tag file, without the .tag or
+                  * .tagx extension, respectively, as the <name> subelement
+                  * of the "imaginary" <tag-file> element
+                  */
+                    String suffix = path.endsWith(TAG_FILE_SUFFIX) ?
+                            TAG_FILE_SUFFIX : TAGX_FILE_SUFFIX;
+                    String tagName = path.substring(path.lastIndexOf("/") + 1);
+                    tagName = tagName.substring(0,
+                            tagName.lastIndexOf(suffix));
+                    tagFileMap.put(tagName, path);
+                }
+            }
+        }
     }
 
     /**
@@ -113,34 +113,34 @@
      * and if so, parses the corresponding tag file.
      *
      * @return The TagFileInfo corresponding to the given tag name, or null if
-     * the given tag name is not implemented as a tag file
+     *         the given tag name is not implemented as a tag file
      */
     public TagFileInfo getTagFile(String shortName) {
 
-	TagFileInfo tagFile = super.getTagFile(shortName);
-	if (tagFile == null) {
-	    String path = (String) tagFileMap.get(shortName);
-	    if (path == null) {
-		return null;
-	    }
+        TagFileInfo tagFile = super.getTagFile(shortName);
+        if (tagFile == null) {
+            String path = (String) tagFileMap.get(shortName);
+            if (path == null) {
+                return null;
+            }
 
-	    TagInfo tagInfo = null;
-	    try {
-		tagInfo = TagFileProcessor.parseTagFileDirectives(pc,
-								  shortName,
-								  path,
-								  this);
-	    } catch (JasperException je) {
-		throw new RuntimeException(je.toString());
-	    }
+            TagInfo tagInfo = null;
+            try {
+                tagInfo = TagFileProcessor.parseTagFileDirectives(pc,
+                        shortName,
+                        path,
+                        this);
+            } catch (JasperException je) {
+                throw new RuntimeException(je.toString());
+            }
 
-	    tagFile = new TagFileInfo(shortName, path, tagInfo);
-	    vec.addElement(tagFile);
+            tagFile = new TagFileInfo(shortName, path, tagInfo);
+            vec.addElement(tagFile);
 
-	    this.tagFiles = new TagFileInfo[vec.size()];
-	    vec.copyInto(this.tagFiles);
-	}
+            this.tagFiles = new TagFileInfo[vec.size()];
+            vec.copyInto(this.tagFiles);
+        }
 
-	return tagFile;
+        return tagFile;
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JasperTagInfo.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JasperTagInfo.java
index ce47150..8f02f51 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JasperTagInfo.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JasperTagInfo.java
@@ -30,26 +30,26 @@
     private String dynamicAttrsMapName;
 
     public JasperTagInfo(String tagName,
-			 String tagClassName,
-			 String bodyContent,
-			 String infoString,
-			 TagLibraryInfo taglib,
-			 TagExtraInfo tagExtraInfo,
-			 TagAttributeInfo[] attributeInfo,
-			 String displayName,
-			 String smallIcon,
-			 String largeIcon,
-			 TagVariableInfo[] tvi,
-			 String mapName) {
+                         String tagClassName,
+                         String bodyContent,
+                         String infoString,
+                         TagLibraryInfo taglib,
+                         TagExtraInfo tagExtraInfo,
+                         TagAttributeInfo[] attributeInfo,
+                         String displayName,
+                         String smallIcon,
+                         String largeIcon,
+                         TagVariableInfo[] tvi,
+                         String mapName) {
 
-	super(tagName, tagClassName, bodyContent, infoString, taglib,
-	      tagExtraInfo, attributeInfo, displayName, smallIcon, largeIcon,
-	      tvi);
-	this.dynamicAttrsMapName = mapName;
+        super(tagName, tagClassName, bodyContent, infoString, taglib,
+                tagExtraInfo, attributeInfo, displayName, smallIcon, largeIcon,
+                tvi);
+        this.dynamicAttrsMapName = mapName;
     }
 
     public String getDynamicAttributesMapName() {
-	return dynamicAttrsMapName;
+        return dynamicAttrsMapName;
     }
 
     public boolean hasDynamicAttributes() {
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JavacErrorDetail.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JavacErrorDetail.java
index 52158ce..301962d 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JavacErrorDetail.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JavacErrorDetail.java
@@ -41,10 +41,10 @@
     /**
      * Constructor.
      *
-     * @param javaFileName The name of the Java file in which the 
-     * compilation error occurred
-     * @param javaLineNum The compilation error line number
-     * @param errMsg The compilation error message
+     * @param javaFileName The name of the Java file in which the
+     *                     compilation error occurred
+     * @param javaLineNum  The compilation error line number
+     * @param errMsg       The compilation error message
      */
     public JavacErrorDetail(String javaFileName,
                             int javaLineNum,
@@ -59,14 +59,14 @@
     /**
      * Constructor.
      *
-     * @param javaFileName The name of the Java file in which the 
-     * compilation error occurred
-     * @param javaLineNum The compilation error line number
-     * @param jspFileName The name of the JSP file from which the Java source
-     * file was generated
+     * @param javaFileName    The name of the Java file in which the
+     *                        compilation error occurred
+     * @param javaLineNum     The compilation error line number
+     * @param jspFileName     The name of the JSP file from which the Java source
+     *                        file was generated
      * @param jspBeginLineNum The start line number of the JSP element
-     * responsible for the compilation error
-     * @param errMsg The compilation error message
+     *                        responsible for the compilation error
+     * @param errMsg          The compilation error message
      */
     public JavacErrorDetail(String javaFileName,
                             int javaLineNum,
@@ -79,15 +79,15 @@
     }
 
     public JavacErrorDetail(String javaFileName,
-            int javaLineNum,
-            String jspFileName,
-            int jspBeginLineNum,
-            StringBuffer errMsg,
-            JspCompilationContext ctxt) {
+                            int javaLineNum,
+                            String jspFileName,
+                            int jspBeginLineNum,
+                            StringBuffer errMsg,
+                            JspCompilationContext ctxt) {
         this(javaFileName, javaLineNum, errMsg);
         this.jspFileName = jspFileName;
         this.jspBeginLineNum = jspBeginLineNum;
-        
+
         if (jspBeginLineNum > 0 && ctxt != null) {
             InputStream is = null;
             FileInputStream fis = null;
@@ -95,40 +95,40 @@
                 // Read both files in, so we can inspect them
                 is = ctxt.getResourceAsStream(jspFileName);
                 String[] jspLines = readFile(is);
-    
+
                 fis = new FileInputStream(ctxt.getServletJavaFileName());
                 String[] javaLines = readFile(fis);
-    
+
                 // If the line contains the opening of a multi-line scriptlet
                 // block, then the JSP line number we got back is probably
                 // faulty.  Scan forward to match the java line...
-                if (jspLines[jspBeginLineNum-1].lastIndexOf("<%") >
-                    jspLines[jspBeginLineNum-1].lastIndexOf("%>")) {
-                    String javaLine = javaLines[javaLineNum-1].trim();
-    
-                    for (int i=jspBeginLineNum-1; i<jspLines.length; i++) {
+                if (jspLines[jspBeginLineNum - 1].lastIndexOf("<%") >
+                        jspLines[jspBeginLineNum - 1].lastIndexOf("%>")) {
+                    String javaLine = javaLines[javaLineNum - 1].trim();
+
+                    for (int i = jspBeginLineNum - 1; i < jspLines.length; i++) {
                         if (jspLines[i].indexOf(javaLine) != -1) {
                             // Update jsp line number
-                            this.jspBeginLineNum = i+1;
+                            this.jspBeginLineNum = i + 1;
                             break;
                         }
                     }
                 }
-    
+
                 // copy out a fragment of JSP to display to the user
                 StringBuffer fragment = new StringBuffer(1024);
-                int startIndex = Math.max(0, this.jspBeginLineNum-1-3);
+                int startIndex = Math.max(0, this.jspBeginLineNum - 1 - 3);
                 int endIndex = Math.min(
-                        jspLines.length-1, this.jspBeginLineNum-1+3);
-    
-                for (int i=startIndex;i<=endIndex; ++i) {
-                    fragment.append(i+1);
+                        jspLines.length - 1, this.jspBeginLineNum - 1 + 3);
+
+                for (int i = startIndex; i <= endIndex; ++i) {
+                    fragment.append(i + 1);
                     fragment.append(": ");
                     fragment.append(jspLines[i]);
                     fragment.append("\n");
                 }
                 jspExtract = fragment.toString();
-    
+
             } catch (IOException ioe) {
                 // Can't read files - ignore
             } finally {
@@ -150,6 +150,7 @@
         }
 
     }
+
     /**
      * Gets the name of the Java source file in which the compilation error
      * occurred.
@@ -162,7 +163,7 @@
 
     /**
      * Gets the compilation error line number.
-     * 
+     *
      * @return Compilation error line number
      */
     public int getJavaLineNumber() {
@@ -184,7 +185,7 @@
      * responsible for the compilation error.
      *
      * @return Start line number of the JSP element responsible for the
-     * compilation error
+     *         compilation error
      */
     public int getJspBeginLineNumber() {
         return this.jspBeginLineNum;
@@ -198,7 +199,7 @@
     public String getErrorMessage() {
         return this.errMsg.toString();
     }
-    
+
     /**
      * Gets the extract of the JSP that corresponds to this message.
      *
@@ -207,7 +208,7 @@
     public String getJspExtract() {
         return this.jspExtract;
     }
-    
+
     /**
      * Reads a text file from an input stream into a String[]. Used to read in
      * the JSP and generated Java file when generating error messages.
@@ -217,10 +218,10 @@
         List lines = new ArrayList();
         String line;
 
-        while ( (line = reader.readLine()) != null ) {
+        while ((line = reader.readLine()) != null) {
             lines.add(line);
         }
 
-        return (String[]) lines.toArray( new String[lines.size()] );
+        return (String[]) lines.toArray(new String[lines.size()]);
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspConfig.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspConfig.java
index 605a4b8..b43ec54 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspConfig.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspConfig.java
@@ -17,8 +17,8 @@
 
 package org.apache.struts2.jasper.compiler;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.JasperException;
 import org.apache.struts2.jasper.xmlparser.ParserUtils;
 import org.apache.struts2.jasper.xmlparser.TreeNode;
@@ -42,7 +42,7 @@
     private static final String WEB_XML = "/WEB-INF/web.xml";
 
     // Logger
-    private Log log = LogFactory.getLog(JspConfig.class);
+    private Logger log = LoggerFactory.getLogger(JspConfig.class);
 
     private Vector jspProperties = null;
     private ServletContext ctxt;
@@ -70,7 +70,7 @@
 
             is = uri.openStream();
             InputSource ip = new InputSource(is);
-            ip.setSystemId(uri.toExternalForm()); 
+            ip.setSystemId(uri.toExternalForm());
 
             ParserUtils pu = new ParserUtils();
             TreeNode webApp = pu.parseXMLDocument(WEB_XML, ip);
@@ -106,7 +106,7 @@
                     String tname = element.getName();
 
                     if ("url-pattern".equals(tname))
-                        urlPatterns.addElement( element.getBody() );
+                        urlPatterns.addElement(element.getBody());
                     else if ("page-encoding".equals(tname))
                         pageEncoding = element.getBody();
                     else if ("is-xml".equals(tname))
@@ -124,14 +124,14 @@
                 if (urlPatterns.size() == 0) {
                     continue;
                 }
- 
+
                 // Add one JspPropertyGroup for each URL Pattern.  This makes
                 // the matching logic easier.
-                for( int p = 0; p < urlPatterns.size(); p++ ) {
-                    String urlPattern = (String)urlPatterns.elementAt( p );
+                for (int p = 0; p < urlPatterns.size(); p++) {
+                    String urlPattern = (String) urlPatterns.elementAt(p);
                     String path = null;
                     String extension = null;
- 
+
                     if (urlPattern.indexOf('*') < 0) {
                         // Exact match
                         path = urlPattern;
@@ -139,17 +139,17 @@
                         int i = urlPattern.lastIndexOf('/');
                         String file;
                         if (i >= 0) {
-                            path = urlPattern.substring(0,i+1);
-                            file = urlPattern.substring(i+1);
+                            path = urlPattern.substring(0, i + 1);
+                            file = urlPattern.substring(i + 1);
                         } else {
                             file = urlPattern;
                         }
- 
+
                         // pattern must be "*", or of the form "*.jsp"
                         if (file.equals("*")) {
                             extension = "*";
                         } else if (file.startsWith("*.")) {
-                            extension = file.substring(file.indexOf('.')+1);
+                            extension = file.substring(file.indexOf('.') + 1);
                         }
 
                         // The url patterns are reconstructed as the follwoing:
@@ -161,21 +161,21 @@
                                 || (path != null && !isStar)) {
                             if (log.isWarnEnabled()) {
                                 log.warn(Localizer.getMessage(
-                                    "jsp.warning.bad.urlpattern.propertygroup",
-                                    urlPattern));
+                                        "jsp.warning.bad.urlpattern.propertygroup",
+                                        urlPattern));
                             }
                             continue;
                         }
                     }
 
                     JspProperty property = new JspProperty(isXml,
-                                                           elIgnored,
-                                                           scriptingInvalid,
-                                                           pageEncoding,
-                                                           includePrelude,
-                                                           includeCoda);
+                            elIgnored,
+                            scriptingInvalid,
+                            pageEncoding,
+                            includePrelude,
+                            includeCoda);
                     JspPropertyGroup propertyGroup =
-                        new JspPropertyGroup(path, extension, property);
+                            new JspPropertyGroup(path, extension, property);
 
                     jspProperties.addElement(propertyGroup);
                 }
@@ -186,7 +186,8 @@
             if (is != null) {
                 try {
                     is.close();
-                } catch (Throwable t) {}
+                } catch (Throwable t) {
+                }
             }
         }
     }
@@ -196,9 +197,9 @@
         if (!initialized) {
             processWebDotXml(ctxt);
             defaultJspProperty = new JspProperty(defaultIsXml,
-                                                 defaultIsELIgnored,
-                                                 defaultIsScriptingInvalid,
-                                                 null, null, null);
+                    defaultIsELIgnored,
+                    defaultIsScriptingInvalid,
+                    null, null, null);
             initialized = true;
         }
     }
@@ -237,10 +238,11 @@
         }
         return curr;
     }
-            
+
 
     /**
      * Find a property that best matches the supplied resource.
+     *
      * @param uri the resource supplied.
      * @return a JspProperty indicating the best match, or some default.
      */
@@ -256,13 +258,13 @@
 
         String uriPath = null;
         int index = uri.lastIndexOf('/');
-        if (index >=0 ) {
-            uriPath = uri.substring(0, index+1);
+        if (index >= 0) {
+            uriPath = uri.substring(0, index + 1);
         }
         String uriExtension = null;
         index = uri.lastIndexOf('.');
-        if (index >=0) {
-            uriExtension = uri.substring(index+1);
+        if (index >= 0) {
+            uriExtension = uri.substring(index + 1);
         }
 
         Vector includePreludes = new Vector();
@@ -279,53 +281,53 @@
             JspPropertyGroup jpg = (JspPropertyGroup) iter.next();
             JspProperty jp = jpg.getJspProperty();
 
-             // (arrays will be the same length)
-             String extension = jpg.getExtension();
-             String path = jpg.getPath();
- 
-             if (extension == null) {
-                 // exact match pattern: /a/foo.jsp
-                 if (!uri.equals(path)) {
-                     // not matched;
-                     continue;
-                 }
-             } else {
-                 // Matching patterns *.ext or /p/*
-                 if (path != null && uriPath != null &&
-                         ! uriPath.startsWith(path)) {
-                     // not matched
-                     continue;
-                 }
-                 if (!extension.equals("*") &&
-                                 !extension.equals(uriExtension)) {
-                     // not matched
-                     continue;
-                 }
-             }
-             // We have a match
-             // Add include-preludes and include-codas
-             if (jp.getIncludePrelude() != null) {
-                 includePreludes.addAll(jp.getIncludePrelude());
-             }
-             if (jp.getIncludeCoda() != null) {
-                 includeCodas.addAll(jp.getIncludeCoda());
-             }
+            // (arrays will be the same length)
+            String extension = jpg.getExtension();
+            String path = jpg.getPath();
 
-             // If there is a previous match for the same property, remember
-             // the one that is more restrictive.
-             if (jp.isXml() != null) {
-                 isXmlMatch = selectProperty(isXmlMatch, jpg);
-             }
-             if (jp.isELIgnored() != null) {
-                 elIgnoredMatch = selectProperty(elIgnoredMatch, jpg);
-             }
-             if (jp.isScriptingInvalid() != null) {
-                 scriptingInvalidMatch =
-                     selectProperty(scriptingInvalidMatch, jpg);
-             }
-             if (jp.getPageEncoding() != null) {
-                 pageEncodingMatch = selectProperty(pageEncodingMatch, jpg);
-             }
+            if (extension == null) {
+                // exact match pattern: /a/foo.jsp
+                if (!uri.equals(path)) {
+                    // not matched;
+                    continue;
+                }
+            } else {
+                // Matching patterns *.ext or /p/*
+                if (path != null && uriPath != null &&
+                        !uriPath.startsWith(path)) {
+                    // not matched
+                    continue;
+                }
+                if (!extension.equals("*") &&
+                        !extension.equals(uriExtension)) {
+                    // not matched
+                    continue;
+                }
+            }
+            // We have a match
+            // Add include-preludes and include-codas
+            if (jp.getIncludePrelude() != null) {
+                includePreludes.addAll(jp.getIncludePrelude());
+            }
+            if (jp.getIncludeCoda() != null) {
+                includeCodas.addAll(jp.getIncludeCoda());
+            }
+
+            // If there is a previous match for the same property, remember
+            // the one that is more restrictive.
+            if (jp.isXml() != null) {
+                isXmlMatch = selectProperty(isXmlMatch, jpg);
+            }
+            if (jp.isELIgnored() != null) {
+                elIgnoredMatch = selectProperty(elIgnoredMatch, jpg);
+            }
+            if (jp.isScriptingInvalid() != null) {
+                scriptingInvalidMatch =
+                        selectProperty(scriptingInvalidMatch, jpg);
+            }
+            if (jp.getPageEncoding() != null) {
+                pageEncodingMatch = selectProperty(pageEncodingMatch, jpg);
+            }
         }
 
 
@@ -342,14 +344,14 @@
         }
         if (scriptingInvalidMatch != null) {
             isScriptingInvalid =
-                scriptingInvalidMatch.getJspProperty().isScriptingInvalid();
+                    scriptingInvalidMatch.getJspProperty().isScriptingInvalid();
         }
         if (pageEncodingMatch != null) {
             pageEncoding = pageEncodingMatch.getJspProperty().getPageEncoding();
         }
 
         return new JspProperty(isXml, isELIgnored, isScriptingInvalid,
-                               pageEncoding, includePreludes, includeCodas);
+                pageEncoding, includePreludes, includeCodas);
     }
 
     /**
@@ -365,13 +367,13 @@
 
         String uriPath = null;
         int index = uri.lastIndexOf('/');
-        if (index >=0 ) {
-            uriPath = uri.substring(0, index+1);
+        if (index >= 0) {
+            uriPath = uri.substring(0, index + 1);
         }
         String uriExtension = null;
         index = uri.lastIndexOf('.');
-        if (index >=0) {
-            uriExtension = uri.substring(index+1);
+        if (index >= 0) {
+            uriExtension = uri.substring(index + 1);
         }
 
         Iterator iter = jspProperties.iterator();
@@ -389,7 +391,7 @@
                 }
             } else {
                 if ((path == null || path.equals(uriPath)) &&
-                    (extension.equals("*") || extension.equals(uriExtension))) {
+                        (extension.equals("*") || extension.equals(uriExtension))) {
                     // Matches *, *.ext, /p/*, or /p/*.ext
                     return true;
                 }
@@ -433,8 +435,8 @@
         private Vector includeCoda;
 
         public JspProperty(String isXml, String elIgnored,
-                    String scriptingInvalid, String pageEncoding,
-                    Vector includePrelude, Vector includeCoda) {
+                           String scriptingInvalid, String pageEncoding,
+                           Vector includePrelude, Vector includeCoda) {
 
             this.isXml = isXml;
             this.elIgnored = elIgnored;
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspDocumentParser.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspDocumentParser.java
index 432e7b2..607f525 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspDocumentParser.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspDocumentParser.java
@@ -45,18 +45,18 @@
  */
 
 class JspDocumentParser
-    extends DefaultHandler
-    implements LexicalHandler, TagConstants {
+        extends DefaultHandler
+        implements LexicalHandler, TagConstants {
 
     private static final String JSP_VERSION = "version";
     private static final String LEXICAL_HANDLER_PROPERTY =
-        "http://xml.org/sax/properties/lexical-handler";
+            "http://xml.org/sax/properties/lexical-handler";
     private static final String JSP_URI = "http://java.sun.com/JSP/Page";
 
     private static final EnableDTDValidationException ENABLE_DTD_VALIDATION_EXCEPTION =
-        new EnableDTDValidationException(
-            "jsp.error.enable_dtd_validation",
-            null);
+            new EnableDTDValidationException(
+                    "jsp.error.enable_dtd_validation",
+                    null);
 
     private ParserController parserController;
     private JspCompilationContext ctxt;
@@ -71,7 +71,7 @@
      * Outermost (in the nesting hierarchy) node whose body is declared to be
      * scriptless. If a node's body is declared to be scriptless, all its
      * nested nodes must be scriptless, too.
-     */ 
+     */
     private Node scriptlessBodyNode;
 
     private Locator locator;
@@ -108,10 +108,10 @@
      * Constructor
      */
     public JspDocumentParser(
-        ParserController pc,
-        String path,
-        boolean isTagFile,
-        boolean directivesOnly) {
+            ParserController pc,
+            String path,
+            boolean isTagFile,
+            boolean directivesOnly) {
         this.parserController = pc;
         this.ctxt = pc.getJspCompilationContext();
         this.pageInfo = pc.getCompiler().getPageInfo();
@@ -128,19 +128,19 @@
      * @throws JasperException
      */
     public static Node.Nodes parse(
-        ParserController pc,
-        String path,
-        JarFile jarFile,
-        Node parent,
-        boolean isTagFile,
-        boolean directivesOnly,
-        String pageEnc,
-        String jspConfigPageEnc,
-        boolean isEncodingSpecifiedInProlog)
-        throws JasperException {
+            ParserController pc,
+            String path,
+            JarFile jarFile,
+            Node parent,
+            boolean isTagFile,
+            boolean directivesOnly,
+            String pageEnc,
+            String jspConfigPageEnc,
+            boolean isEncodingSpecifiedInProlog)
+            throws JasperException {
 
         JspDocumentParser jspDocParser =
-            new JspDocumentParser(pc, path, isTagFile, directivesOnly);
+                new JspDocumentParser(pc, path, isTagFile, directivesOnly);
         Node.Nodes pageNodes = null;
 
         try {
@@ -150,12 +150,12 @@
             dummyRoot.setPageEncoding(pageEnc);
             dummyRoot.setJspConfigPageEncoding(jspConfigPageEnc);
             dummyRoot.setIsEncodingSpecifiedInProlog(
-                isEncodingSpecifiedInProlog);
+                    isEncodingSpecifiedInProlog);
             jspDocParser.current = dummyRoot;
             if (parent == null) {
                 jspDocParser.addInclude(
-                    dummyRoot,
-                    jspDocParser.pageInfo.getIncludePrelude());
+                        dummyRoot,
+                        jspDocParser.pageInfo.getIncludePrelude());
             } else {
                 jspDocParser.isTop = false;
             }
@@ -165,8 +165,8 @@
             InputStream inStream = null;
             try {
                 inStream = JspUtil.getInputStream(path, jarFile,
-                                                  jspDocParser.ctxt,
-                                                  jspDocParser.err);
+                        jspDocParser.ctxt,
+                        jspDocParser.err);
                 saxParser.parse(new InputSource(inStream), jspDocParser);
             } catch (EnableDTDValidationException e) {
                 saxParser = getSAXParser(true, jspDocParser);
@@ -178,8 +178,8 @@
                     }
                 }
                 inStream = JspUtil.getInputStream(path, jarFile,
-                                                  jspDocParser.ctxt,
-                                                  jspDocParser.err);
+                        jspDocParser.ctxt,
+                        jspDocParser.err);
                 saxParser.parse(new InputSource(inStream), jspDocParser);
             } finally {
                 if (inStream != null) {
@@ -192,8 +192,8 @@
 
             if (parent == null) {
                 jspDocParser.addInclude(
-                    dummyRoot,
-                    jspDocParser.pageInfo.getIncludeCoda());
+                        dummyRoot,
+                        jspDocParser.pageInfo.getIncludeCoda());
             }
 
             // Create Node.Nodes from dummy root
@@ -203,9 +203,9 @@
             jspDocParser.err.jspError("jsp.error.data.file.read", path, ioe);
         } catch (SAXParseException e) {
             jspDocParser.err.jspError
-                (new Mark(jspDocParser.ctxt, path, e.getLineNumber(),
-                          e.getColumnNumber()),
-                 e.getMessage());
+                    (new Mark(jspDocParser.ctxt, path, e.getLineNumber(),
+                            e.getColumnNumber()),
+                            e.getMessage());
         } catch (Exception e) {
             jspDocParser.err.jspError(e);
         }
@@ -223,14 +223,14 @@
         if (files != null) {
             Iterator iter = files.iterator();
             while (iter.hasNext()) {
-                String file = (String)iter.next();
+                String file = (String) iter.next();
                 AttributesImpl attrs = new AttributesImpl();
                 attrs.addAttribute("", "file", "file", "CDATA", file);
 
                 // Create a dummy Include directive node
-                    Node includeDir =
+                Node includeDir =
                         new Node.IncludeDirective(attrs, null, // XXX
-    parent);
+                                parent);
                 processIncludeDirective(file, includeDir);
             }
         }
@@ -250,11 +250,11 @@
      * tag libraries.
      */
     public void startElement(
-        String uri,
-        String localName,
-        String qName,
-        Attributes attrs)
-        throws SAXException {
+            String uri,
+            String localName,
+            String qName,
+            Attributes attrs)
+            throws SAXException {
 
         AttributesImpl taglibAttrs = null;
         AttributesImpl nonTaglibAttrs = null;
@@ -265,22 +265,22 @@
         checkPrefixes(uri, qName, attrs);
 
         if (directivesOnly &&
-            !(JSP_URI.equals(uri) && localName.startsWith(DIRECTIVE_ACTION))) {
+                !(JSP_URI.equals(uri) && localName.startsWith(DIRECTIVE_ACTION))) {
             return;
         }
 
         String currentPrefix = getPrefix(current.getQName());
-        
+
         // jsp:text must not have any subelements
         if (JSP_URI.equals(uri) && TEXT_ACTION.equals(current.getLocalName())
                 && "jsp".equals(currentPrefix)) {
             throw new SAXParseException(
-                Localizer.getMessage("jsp.error.text.has_subelement"),
-                locator);
+                    Localizer.getMessage("jsp.error.text.has_subelement"),
+                    locator);
         }
 
         startMark = new Mark(ctxt, path, locator.getLineNumber(),
-                             locator.getColumnNumber());
+                locator.getColumnNumber());
 
         if (attrs != null) {
             /*
@@ -296,11 +296,11 @@
                         nonTaglibAttrs = new AttributesImpl();
                     }
                     nonTaglibAttrs.addAttribute(
-                        attrs.getURI(i),
-                        attrs.getLocalName(i),
-                        attrs.getQName(i),
-                        attrs.getType(i),
-                        attrs.getValue(i));
+                            attrs.getURI(i),
+                            attrs.getLocalName(i),
+                            attrs.getQName(i),
+                            attrs.getType(i),
+                            attrs.getValue(i));
                 } else {
                     if (attrQName.startsWith("xmlns:jsp")) {
                         isTaglib = true;
@@ -315,21 +315,21 @@
                             taglibAttrs = new AttributesImpl();
                         }
                         taglibAttrs.addAttribute(
-                            attrs.getURI(i),
-                            attrs.getLocalName(i),
-                            attrs.getQName(i),
-                            attrs.getType(i),
-                            attrs.getValue(i));
+                                attrs.getURI(i),
+                                attrs.getLocalName(i),
+                                attrs.getQName(i),
+                                attrs.getType(i),
+                                attrs.getValue(i));
                     } else {
                         if (nonTaglibXmlnsAttrs == null) {
                             nonTaglibXmlnsAttrs = new AttributesImpl();
                         }
                         nonTaglibXmlnsAttrs.addAttribute(
-                            attrs.getURI(i),
-                            attrs.getLocalName(i),
-                            attrs.getQName(i),
-                            attrs.getType(i),
-                            attrs.getValue(i));
+                                attrs.getURI(i),
+                                attrs.getLocalName(i),
+                                attrs.getQName(i),
+                                attrs.getType(i),
+                                attrs.getValue(i));
                     }
                 }
             }
@@ -338,32 +338,32 @@
         Node node = null;
 
         if (tagDependentPending && JSP_URI.equals(uri) &&
-                     localName.equals(BODY_ACTION)) {
+                localName.equals(BODY_ACTION)) {
             tagDependentPending = false;
             tagDependentNesting++;
             current =
-                parseStandardAction(
-                    qName,
-                    localName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    startMark,
-                    current);
+                    parseStandardAction(
+                            qName,
+                            localName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            startMark,
+                            current);
             return;
         }
 
         if (tagDependentPending && JSP_URI.equals(uri) &&
-                     localName.equals(ATTRIBUTE_ACTION)) {
+                localName.equals(ATTRIBUTE_ACTION)) {
             current =
-                parseStandardAction(
-                    qName,
-                    localName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    startMark,
-                    current);
+                    parseStandardAction(
+                            qName,
+                            localName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            startMark,
+                            current);
             return;
         }
 
@@ -374,45 +374,45 @@
 
         if (tagDependentNesting > 0) {
             node =
-                new Node.UninterpretedTag(
-                    qName,
-                    localName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    startMark,
-                    current);
+                    new Node.UninterpretedTag(
+                            qName,
+                            localName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            startMark,
+                            current);
         } else if (JSP_URI.equals(uri)) {
             node =
-                parseStandardAction(
-                    qName,
-                    localName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    startMark,
-                    current);
+                    parseStandardAction(
+                            qName,
+                            localName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            startMark,
+                            current);
         } else {
             node =
-                parseCustomAction(
-                    qName,
-                    localName,
-                    uri,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    startMark,
-                    current);
+                    parseCustomAction(
+                            qName,
+                            localName,
+                            uri,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            startMark,
+                            current);
             if (node == null) {
                 node =
-                    new Node.UninterpretedTag(
-                        qName,
-                        localName,
-                        nonTaglibAttrs,
-                        nonTaglibXmlnsAttrs,
-                        taglibAttrs,
-                        startMark,
-                        current);
+                        new Node.UninterpretedTag(
+                                qName,
+                                localName,
+                                nonTaglibAttrs,
+                                nonTaglibXmlnsAttrs,
+                                taglibAttrs,
+                                startMark,
+                                current);
             } else {
                 // custom action
                 String bodyType = getBodyType((Node.CustomTag) node);
@@ -420,8 +420,7 @@
                 if (scriptlessBodyNode == null
                         && bodyType.equalsIgnoreCase(TagInfo.BODY_CONTENT_SCRIPTLESS)) {
                     scriptlessBodyNode = node;
-                }
-                else if (TagInfo.BODY_CONTENT_TAG_DEPENDENT.equalsIgnoreCase(bodyType)) {
+                } else if (TagInfo.BODY_CONTENT_TAG_DEPENDENT.equalsIgnoreCase(bodyType)) {
                     tagDependentPending = true;
                 }
             }
@@ -470,12 +469,12 @@
          */
         boolean isAllSpace = true;
         if (!(current instanceof Node.JspText)
-            && !(current instanceof Node.NamedAttribute)) {
+                && !(current instanceof Node.NamedAttribute)) {
             for (int i = 0; i < charBuffer.length(); i++) {
                 if (!(charBuffer.charAt(i) == ' '
-                    || charBuffer.charAt(i) == '\n'
-                    || charBuffer.charAt(i) == '\r'
-                    || charBuffer.charAt(i) == '\t')) {
+                        || charBuffer.charAt(i) == '\n'
+                        || charBuffer.charAt(i) == '\r'
+                        || charBuffer.charAt(i) == '\t')) {
                     isAllSpace = false;
                     break;
                 }
@@ -492,14 +491,14 @@
                 new Node.TemplateText(charBuffer.toString(), startMark, current);
             }
             startMark = new Mark(ctxt, path, locator.getLineNumber(),
-                                 locator.getColumnNumber());
+                    locator.getColumnNumber());
             charBuffer = null;
             return;
         }
 
         if ((current instanceof Node.JspText)
-            || (current instanceof Node.NamedAttribute)
-            || !isAllSpace) {
+                || (current instanceof Node.NamedAttribute)
+                || !isAllSpace) {
 
             int line = startMark.getLineNumber();
             int column = startMark.getColumnNumber();
@@ -518,9 +517,9 @@
                 if (lastCh == '$' && ch == '{') {
                     if (ttext.size() > 0) {
                         new Node.TemplateText(
-                            ttext.toString(),
-                            startMark,
-                            current);
+                                ttext.toString(),
+                                startMark,
+                                current);
                         ttext = new CharArrayWriter();
                         //We subtract two from the column number to
                         //account for the '${' that we've already parsed
@@ -531,13 +530,13 @@
                     boolean singleQ = false;
                     boolean doubleQ = false;
                     lastCh = 0;
-                    for (;; i++) {
+                    for (; ; i++) {
                         if (i >= charBuffer.length()) {
                             throw new SAXParseException(
-                                Localizer.getMessage(
-                                    "jsp.error.unterminated",
-                                    "${"),
-                                locator);
+                                    Localizer.getMessage(
+                                            "jsp.error.unterminated",
+                                            "${"),
+                                    locator);
 
                         }
                         ch = charBuffer.charAt(i);
@@ -554,9 +553,9 @@
                         }
                         if (ch == '}') {
                             new Node.ELExpression(
-                                ttext.toString(),
-                                startMark,
-                                current);
+                                    ttext.toString(),
+                                    startMark,
+                                    current);
                             ttext = new CharArrayWriter();
                             startMark = new Mark(ctxt, path, line, column);
                             break;
@@ -590,7 +589,7 @@
             }
         }
         startMark = new Mark(ctxt, path, locator.getLineNumber(),
-                             locator.getColumnNumber());
+                locator.getColumnNumber());
 
         charBuffer = null;
     }
@@ -599,18 +598,18 @@
      * Receives notification of the end of an element.
      */
     public void endElement(String uri, String localName, String qName)
-        throws SAXException {
+            throws SAXException {
 
         processChars();
 
         if (directivesOnly &&
-            !(JSP_URI.equals(uri) && localName.startsWith(DIRECTIVE_ACTION))) {
+                !(JSP_URI.equals(uri) && localName.startsWith(DIRECTIVE_ACTION))) {
             return;
         }
 
         if (current instanceof Node.NamedAttribute) {
-            boolean isTrim = ((Node.NamedAttribute)current).isTrim();
-            Node.Nodes subElems = ((Node.NamedAttribute)current).getBody();
+            boolean isTrim = ((Node.NamedAttribute) current).isTrim();
+            Node.Nodes subElems = ((Node.NamedAttribute) current).getBody();
             for (int i = 0; subElems != null && i < subElems.size(); i++) {
                 Node subElem = subElems.getNode(i);
                 if (!(subElem instanceof Node.TemplateText)) {
@@ -627,23 +626,23 @@
                 // is set to FALSE, which must be kept verbatim.
                 if (i == 0) {
                     if (isTrim) {
-                        ((Node.TemplateText)subElem).ltrim();
+                        ((Node.TemplateText) subElem).ltrim();
                     }
                 } else if (i == subElems.size() - 1) {
                     if (isTrim) {
-                        ((Node.TemplateText)subElem).rtrim();
+                        ((Node.TemplateText) subElem).rtrim();
                     }
                 } else {
-                    if (((Node.TemplateText)subElem).isAllSpace()) {
+                    if (((Node.TemplateText) subElem).isAllSpace()) {
                         subElems.remove(subElem);
                     }
                 }
             }
         } else if (current instanceof Node.ScriptingElement) {
-            checkScriptingBody((Node.ScriptingElement)current);
+            checkScriptingBody((Node.ScriptingElement) current);
         }
 
-        if ( isTagDependent(current)) {
+        if (isTagDependent(current)) {
             tagDependentNesting--;
         }
 
@@ -676,11 +675,11 @@
         // ignore comments in the DTD
         if (!inDTD) {
             startMark =
-                new Mark(
-                    ctxt,
-                    path,
-                    locator.getLineNumber(),
-                    locator.getColumnNumber());
+                    new Mark(
+                            ctxt,
+                            path,
+                            locator.getLineNumber(),
+                            locator.getColumnNumber());
             new Node.Comment(new String(buf, offset, len), startMark, current);
         }
     }
@@ -692,7 +691,7 @@
 
         processChars();  // Flush char buffer and remove white spaces
         startMark = new Mark(ctxt, path, locator.getLineNumber(),
-                             locator.getColumnNumber());
+                locator.getColumnNumber());
     }
 
     /*
@@ -720,7 +719,7 @@
      * See org.xml.sax.ext.LexicalHandler.
      */
     public void startDTD(String name, String publicId, String systemId)
-        throws SAXException {
+            throws SAXException {
         if (!isValidating) {
             fatalError(ENABLE_DTD_VALIDATION_EXCEPTION);
         }
@@ -753,20 +752,20 @@
      * Receives notification of the start of a Namespace mapping. 
      */
     public void startPrefixMapping(String prefix, String uri)
-        throws SAXException {
+            throws SAXException {
         TagLibraryInfo taglibInfo;
 
         if (directivesOnly && !(JSP_URI.equals(uri))) {
             return;
         }
-        
+
         try {
             taglibInfo = getTaglibInfo(prefix, uri);
         } catch (JasperException je) {
             throw new SAXParseException(
-                Localizer.getMessage("jsp.error.could.not.add.taglibraries"),
-                locator,
-                je);
+                    Localizer.getMessage("jsp.error.could.not.add.taglibraries"),
+                    locator,
+                    je);
         }
 
         if (taglibInfo != null) {
@@ -798,329 +797,329 @@
     // Private utility methods
 
     private Node parseStandardAction(
-        String qName,
-        String localName,
-        Attributes nonTaglibAttrs,
-        Attributes nonTaglibXmlnsAttrs,
-        Attributes taglibAttrs,
-        Mark start,
-        Node parent)
-        throws SAXException {
+            String qName,
+            String localName,
+            Attributes nonTaglibAttrs,
+            Attributes nonTaglibXmlnsAttrs,
+            Attributes taglibAttrs,
+            Mark start,
+            Node parent)
+            throws SAXException {
 
         Node node = null;
 
         if (localName.equals(ROOT_ACTION)) {
             if (!(current instanceof Node.Root)) {
                 throw new SAXParseException(
-                    Localizer.getMessage("jsp.error.nested_jsproot"),
-                    locator);
+                        Localizer.getMessage("jsp.error.nested_jsproot"),
+                        locator);
             }
             node =
-                new Node.JspRoot(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.JspRoot(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
             if (isTop) {
                 pageInfo.setHasJspRoot(true);
             }
         } else if (localName.equals(PAGE_DIRECTIVE_ACTION)) {
             if (isTagFile) {
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.action.istagfile",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.action.istagfile",
+                                localName),
+                        locator);
             }
             node =
-                new Node.PageDirective(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.PageDirective(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
             String imports = nonTaglibAttrs.getValue("import");
             // There can only be one 'import' attribute per page directive
             if (imports != null) {
-                ((Node.PageDirective)node).addImport(imports);
+                ((Node.PageDirective) node).addImport(imports);
             }
         } else if (localName.equals(INCLUDE_DIRECTIVE_ACTION)) {
             node =
-                new Node.IncludeDirective(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.IncludeDirective(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
             processIncludeDirective(nonTaglibAttrs.getValue("file"), node);
         } else if (localName.equals(DECLARATION_ACTION)) {
             if (scriptlessBodyNode != null) {
                 // We're nested inside a node whose body is
                 // declared to be scriptless
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.no.scriptlets",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.no.scriptlets",
+                                localName),
+                        locator);
             }
             node =
-                new Node.Declaration(
-                    qName,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.Declaration(
+                            qName,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(SCRIPTLET_ACTION)) {
             if (scriptlessBodyNode != null) {
                 // We're nested inside a node whose body is
                 // declared to be scriptless
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.no.scriptlets",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.no.scriptlets",
+                                localName),
+                        locator);
             }
             node =
-                new Node.Scriptlet(
-                    qName,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.Scriptlet(
+                            qName,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(EXPRESSION_ACTION)) {
             if (scriptlessBodyNode != null) {
                 // We're nested inside a node whose body is
                 // declared to be scriptless
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.no.scriptlets",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.no.scriptlets",
+                                localName),
+                        locator);
             }
             node =
-                new Node.Expression(
-                    qName,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.Expression(
+                            qName,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(USE_BEAN_ACTION)) {
             node =
-                new Node.UseBean(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.UseBean(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(SET_PROPERTY_ACTION)) {
             node =
-                new Node.SetProperty(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.SetProperty(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(GET_PROPERTY_ACTION)) {
             node =
-                new Node.GetProperty(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.GetProperty(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(INCLUDE_ACTION)) {
             node =
-                new Node.IncludeAction(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.IncludeAction(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(FORWARD_ACTION)) {
             node =
-                new Node.ForwardAction(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.ForwardAction(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(PARAM_ACTION)) {
             node =
-                new Node.ParamAction(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.ParamAction(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(PARAMS_ACTION)) {
             node =
-                new Node.ParamsAction(
-                    qName,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.ParamsAction(
+                            qName,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(PLUGIN_ACTION)) {
             node =
-                new Node.PlugIn(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.PlugIn(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(TEXT_ACTION)) {
             node =
-                new Node.JspText(
-                    qName,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.JspText(
+                            qName,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(BODY_ACTION)) {
             node =
-                new Node.JspBody(
-                    qName,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.JspBody(
+                            qName,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(ATTRIBUTE_ACTION)) {
             node =
-                new Node.NamedAttribute(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.NamedAttribute(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(OUTPUT_ACTION)) {
             node =
-                new Node.JspOutput(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.JspOutput(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(TAG_DIRECTIVE_ACTION)) {
             if (!isTagFile) {
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.action.isnottagfile",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.action.isnottagfile",
+                                localName),
+                        locator);
             }
             node =
-                new Node.TagDirective(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.TagDirective(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
             String imports = nonTaglibAttrs.getValue("import");
             // There can only be one 'import' attribute per tag directive
             if (imports != null) {
-                ((Node.TagDirective)node).addImport(imports);
+                ((Node.TagDirective) node).addImport(imports);
             }
         } else if (localName.equals(ATTRIBUTE_DIRECTIVE_ACTION)) {
             if (!isTagFile) {
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.action.isnottagfile",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.action.isnottagfile",
+                                localName),
+                        locator);
             }
             node =
-                new Node.AttributeDirective(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.AttributeDirective(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(VARIABLE_DIRECTIVE_ACTION)) {
             if (!isTagFile) {
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.action.isnottagfile",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.action.isnottagfile",
+                                localName),
+                        locator);
             }
             node =
-                new Node.VariableDirective(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.VariableDirective(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(INVOKE_ACTION)) {
             if (!isTagFile) {
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.action.isnottagfile",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.action.isnottagfile",
+                                localName),
+                        locator);
             }
             node =
-                new Node.InvokeAction(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.InvokeAction(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(DOBODY_ACTION)) {
             if (!isTagFile) {
                 throw new SAXParseException(
-                    Localizer.getMessage(
-                        "jsp.error.action.isnottagfile",
-                        localName),
-                    locator);
+                        Localizer.getMessage(
+                                "jsp.error.action.isnottagfile",
+                                localName),
+                        locator);
             }
             node =
-                new Node.DoBodyAction(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.DoBodyAction(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(ELEMENT_ACTION)) {
             node =
-                new Node.JspElement(
-                    qName,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.JspElement(
+                            qName,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else if (localName.equals(FALLBACK_ACTION)) {
             node =
-                new Node.FallBackAction(
-                    qName,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    current);
+                    new Node.FallBackAction(
+                            qName,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            current);
         } else {
             throw new SAXParseException(
-                Localizer.getMessage(
-                    "jsp.error.xml.badStandardAction",
-                    localName),
-                locator);
+                    Localizer.getMessage(
+                            "jsp.error.xml.badStandardAction",
+                            localName),
+                    locator);
         }
 
         return node;
@@ -1131,15 +1130,15 @@
      * and returns the corresponding Node object.
      */
     private Node parseCustomAction(
-        String qName,
-        String localName,
-        String uri,
-        Attributes nonTaglibAttrs,
-        Attributes nonTaglibXmlnsAttrs,
-        Attributes taglibAttrs,
-        Mark start,
-        Node parent)
-        throws SAXException {
+            String qName,
+            String localName,
+            String uri,
+            Attributes nonTaglibAttrs,
+            Attributes nonTaglibXmlnsAttrs,
+            Attributes taglibAttrs,
+            Mark start,
+            Node parent)
+            throws SAXException {
 
         // Check if this is a user-defined (custom) tag
         TagLibraryInfo tagLibInfo = pageInfo.getTaglib(uri);
@@ -1151,20 +1150,20 @@
         TagFileInfo tagFileInfo = tagLibInfo.getTagFile(localName);
         if (tagInfo == null && tagFileInfo == null) {
             throw new SAXException(
-                Localizer.getMessage("jsp.error.xml.bad_tag", localName, uri));
+                    Localizer.getMessage("jsp.error.xml.bad_tag", localName, uri));
         }
         Class tagHandlerClass = null;
         if (tagInfo != null) {
             String handlerClassName = tagInfo.getTagClassName();
             try {
                 tagHandlerClass =
-                    ctxt.getClassLoader().loadClass(handlerClassName);
+                        ctxt.getClassLoader().loadClass(handlerClassName);
             } catch (Exception e) {
                 throw new SAXException(
-                    Localizer.getMessage("jsp.error.loadclass.taghandler",
-                                         handlerClassName,
-                                         qName),
-                    e);
+                        Localizer.getMessage("jsp.error.loadclass.taghandler",
+                                handlerClassName,
+                                qName),
+                        e);
             }
         }
 
@@ -1173,31 +1172,31 @@
         Node.CustomTag ret = null;
         if (tagInfo != null) {
             ret =
-                new Node.CustomTag(
-                    qName,
-                    prefix,
-                    localName,
-                    uri,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    parent,
-                    tagInfo,
-                    tagHandlerClass);
+                    new Node.CustomTag(
+                            qName,
+                            prefix,
+                            localName,
+                            uri,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            parent,
+                            tagInfo,
+                            tagHandlerClass);
         } else {
             ret =
-                new Node.CustomTag(
-                    qName,
-                    prefix,
-                    localName,
-                    uri,
-                    nonTaglibAttrs,
-                    nonTaglibXmlnsAttrs,
-                    taglibAttrs,
-                    start,
-                    parent,
-                    tagFileInfo);
+                    new Node.CustomTag(
+                            qName,
+                            prefix,
+                            localName,
+                            uri,
+                            nonTaglibAttrs,
+                            nonTaglibXmlnsAttrs,
+                            taglibAttrs,
+                            start,
+                            parent,
+                            tagFileInfo);
         }
 
         return ret;
@@ -1213,7 +1212,7 @@
      * @return The tag library associated with the given uri namespace
      */
     private TagLibraryInfo getTaglibInfo(String prefix, String uri)
-        throws JasperException {
+            throws JasperException {
 
         TagLibraryInfo result = null;
 
@@ -1221,12 +1220,12 @@
             // uri (of the form "urn:jsptagdir:path") references tag file dir
             String tagdir = uri.substring(URN_JSPTAGDIR.length());
             result =
-                new ImplicitTagLibraryInfo(
-                    ctxt,
-                    parserController,
-                    prefix,
-                    tagdir,
-                    err);
+                    new ImplicitTagLibraryInfo(
+                            ctxt,
+                            parserController,
+                            prefix,
+                            tagdir,
+                            err);
         } else {
             // uri references TLD file
             boolean isPlainUri = false;
@@ -1250,13 +1249,13 @@
                      * value must be treated as uninterpreted.
                      */
                     result =
-                        new TagLibraryInfoImpl(
-                            ctxt,
-                            parserController,
-                            prefix,
-                            uri,
-                            location,
-                            err);
+                            new TagLibraryInfoImpl(
+                                    ctxt,
+                                    parserController,
+                                    prefix,
+                                    uri,
+                                    location,
+                                    err);
                     if (ctxt.getOptions().isCaching()) {
                         ctxt.getOptions().getCache().put(uri, result);
                     }
@@ -1276,7 +1275,7 @@
      * scripting element has been reached.
      */
     private void checkScriptingBody(Node.ScriptingElement scriptingElem)
-        throws SAXException {
+            throws SAXException {
         Node.Nodes body = scriptingElem.getBody();
         if (body != null) {
             int size = body.size();
@@ -1289,9 +1288,9 @@
                     if (scriptingElem instanceof Node.Expression)
                         elemType = EXPRESSION_ACTION;
                     String msg =
-                        Localizer.getMessage(
-                            "jsp.error.parse.xml.scripting.invalid.body",
-                            elemType);
+                            Localizer.getMessage(
+                                    "jsp.error.parse.xml.scripting.invalid.body",
+                                    elemType);
                     throw new SAXException(msg);
                 }
             }
@@ -1306,7 +1305,7 @@
      * @param parent The Node representing the include directive
      */
     private void processIncludeDirective(String fname, Node parent)
-        throws SAXException {
+            throws SAXException {
 
         if (fname == null) {
             return;
@@ -1316,9 +1315,9 @@
             parserController.parse(fname, parent, null);
         } catch (FileNotFoundException fnfe) {
             throw new SAXParseException(
-                Localizer.getMessage("jsp.error.file.not.found", fname),
-                locator,
-                fnfe);
+                    Localizer.getMessage("jsp.error.file.not.found", fname),
+                    locator,
+                    fnfe);
         } catch (Exception e) {
             throw new SAXException(e);
         }
@@ -1380,22 +1379,22 @@
      * @return The SAXParser
      */
     private static SAXParser getSAXParser(
-        boolean validating,
-        JspDocumentParser jspDocParser)
-        throws Exception {
+            boolean validating,
+            JspDocumentParser jspDocParser)
+            throws Exception {
 
         SAXParserFactory factory = SAXParserFactory.newInstance();
         factory.setNamespaceAware(true);
 
         // Preserve xmlns attributes
         factory.setFeature(
-            "http://xml.org/sax/features/namespace-prefixes",
-            true);
+                "http://xml.org/sax/features/namespace-prefixes",
+                true);
         factory.setValidating(validating);
         //factory.setFeature(
         //    "http://xml.org/sax/features/validation",
         //    validating);
-        
+
         // Configure the parser
         SAXParser saxParser = factory.newSAXParser();
         XMLReader xmlReader = saxParser.getXMLReader();
@@ -1410,7 +1409,7 @@
      * validation is turned off.
      */
     private static class EnableDTDValidationException
-        extends SAXParseException {
+            extends SAXParseException {
 
         EnableDTDValidationException(String message, Locator loc) {
             super(message, loc);
@@ -1431,7 +1430,7 @@
         if (n instanceof Node.CustomTag) {
             String bodyType = getBodyType((Node.CustomTag) n);
             return
-                TagInfo.BODY_CONTENT_TAG_DEPENDENT.equalsIgnoreCase(bodyType);
+                    TagInfo.BODY_CONTENT_TAG_DEPENDENT.equalsIgnoreCase(bodyType);
         }
         return false;
     }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspReader.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspReader.java
index 457f44a..ccb4a9f 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspReader.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspReader.java
@@ -17,8 +17,8 @@
 
 package org.apache.struts2.jasper.compiler;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.JasperException;
 import org.apache.struts2.jasper.JspCompilationContext;
 
@@ -53,7 +53,7 @@
     /**
      * Logger.
      */
-    private Log log = LogFactory.getLog(JspReader.class);
+    private Logger log = LoggerFactory.getLogger(JspReader.class);
 
     /**
      * The current spot in the file.
@@ -100,14 +100,14 @@
     /**
      * Constructor.
      *
-     * @param ctxt The compilation context
-     * @param fname The file name
+     * @param ctxt     The compilation context
+     * @param fname    The file name
      * @param encoding The file encoding
-     * @param jarFile ?
-     * @param err The error dispatcher
-     * @throws JasperException If a Jasper-internal error occurs
+     * @param jarFile  ?
+     * @param err      The error dispatcher
+     * @throws JasperException       If a Jasper-internal error occurs
      * @throws FileNotFoundException If the JSP file is not found (or is unreadable)
-     * @throws IOException If an IO-level error occurs, e.g. reading the file
+     * @throws IOException           If an IO-level error occurs, e.g. reading the file
      */
     public JspReader(JspCompilationContext ctxt,
                      String fname,
@@ -117,8 +117,8 @@
             throws JasperException, FileNotFoundException, IOException {
 
         this(ctxt, fname, encoding,
-             JspUtil.getReader(fname, encoding, jarFile, ctxt, err),
-             err);
+                JspUtil.getReader(fname, encoding, jarFile, ctxt, err),
+                err);
     }
 
     /**
@@ -142,13 +142,13 @@
     }
 
     /**
-     * @return JSP compilation context with which this JspReader is 
-     * associated
+     * @return JSP compilation context with which this JspReader is
+     *         associated
      */
     JspCompilationContext getJspCompilationContext() {
         return context;
     }
-    
+
     /**
      * Returns the file at the given position in the list.
      *
@@ -158,16 +158,16 @@
     String getFile(final int fileid) {
         return (String) sourceFiles.get(fileid);
     }
-       
+
     /**
      * Checks if the current file has more input.
      *
      * @return True if more reading is possible
      * @throws JasperException if an error occurs
-     */ 
+     */
     boolean hasMoreInput() throws JasperException {
         if (current.cursor >= current.stream.length) {
-            if (singleFile) return false; 
+            if (singleFile) return false;
             while (popFile()) {
                 if (current.cursor < current.stream.length) return true;
             }
@@ -175,15 +175,15 @@
         }
         return true;
     }
-    
+
     int nextChar() throws JasperException {
         if (!hasMoreInput())
             return -1;
-        
+
         int ch = current.stream[current.cursor];
 
         current.cursor++;
-        
+
         if (ch == '\n') {
             current.line++;
             current.col = 0;
@@ -244,10 +244,11 @@
 
     /**
      * search the stream for a match to a string
+     *
      * @param string The string to match
      * @return <strong>true</strong> is one is found, the current position
      *         in stream is positioned after the search string, <strong>
-     *               false</strong> otherwise, position in stream unchanged.
+     *         false</strong> otherwise, position in stream unchanged.
      */
     boolean matches(String string) throws JasperException {
         Mark mark = mark();
@@ -277,18 +278,17 @@
     }
 
     boolean matchesETagWithoutLessThan(String tagName)
-        throws JasperException
-    {
-       Mark mark = mark();
+            throws JasperException {
+        Mark mark = mark();
 
-       if (!matches("/" + tagName))
-           return false;
-       skipSpaces();
-       if (nextChar() == '>')
-           return true;
+        if (!matches("/" + tagName))
+            return false;
+        skipSpaces();
+        if (nextChar() == '>')
+            return true;
 
-       reset(mark);
-       return false;
+        reset(mark);
+        return false;
     }
 
 
@@ -298,15 +298,14 @@
      * characters are skipped.  If not, false is returned and the
      * position is restored to where we were before.
      */
-    boolean matchesOptionalSpacesFollowedBy( String s )
-        throws JasperException
-    {
+    boolean matchesOptionalSpacesFollowedBy(String s)
+            throws JasperException {
         Mark mark = mark();
 
         skipSpaces();
-        boolean result = matches( s );
-        if( !result ) {
-            reset( mark );
+        boolean result = matches(s);
+        if (!result) {
+            reset(mark);
         }
 
         return result;
@@ -335,12 +334,12 @@
         int limlen = limit.length();
         int ch;
 
-    skip:
-        for (ret = mark(), ch = nextChar() ; ch != -1 ;
-                 ret = mark(), ch = nextChar()) {
+        skip:
+        for (ret = mark(), ch = nextChar(); ch != -1;
+             ret = mark(), ch = nextChar()) {
             if (ch == limit.charAt(0)) {
                 Mark restart = mark();
-                for (int i = 1 ; i < limlen ; i++) {
+                for (int i = 1; i < limlen; i++) {
                     if (peekChar() == limit.charAt(i))
                         nextChar();
                     else {
@@ -369,15 +368,14 @@
         int limlen = limit.length();
         int ch;
         int prev = 'x';        // Doesn't matter
-        
-    skip:
-        for (ret = mark(), ch = nextChar() ; ch != -1 ;
-                 ret = mark(), prev = ch, ch = nextChar()) {            
+
+        skip:
+        for (ret = mark(), ch = nextChar(); ch != -1;
+             ret = mark(), prev = ch, ch = nextChar()) {
             if (ch == '\\' && prev == '\\') {
                 ch = 0;                // Double \ is not an escape char anymore
-            }
-            else if (ch == limit.charAt(0) && prev != '\\') {
-                for (int i = 1 ; i < limlen ; i++) {
+            } else if (ch == limit.charAt(0) && prev != '\\') {
+                for (int i = 1; i < limlen; i++) {
                     if (peekChar() == limit.charAt(i))
                         nextChar();
                     else
@@ -388,14 +386,14 @@
         }
         return null;
     }
-    
+
     /**
      * Skip until the given end tag is matched in the stream.
      * When returned, the context is positioned past the end of the tag.
      *
      * @param tag The name of the tag whose ETag (</tag>) to match.
      * @return A non-null <code>Mark</code> instance (positioned immediately
-     *               before the ETag) if found, <strong>null</strong> otherwise.
+     *         before the ETag) if found, <strong>null</strong> otherwise.
      */
     Mark skipUntilETag(String tag) throws JasperException {
         Mark ret = skipUntil("</" + tag);
@@ -423,13 +421,13 @@
         StringBuffer stringBuffer = new StringBuffer();
         skipSpaces();
         stringBuffer.setLength(0);
-        
+
         if (!hasMoreInput()) {
             return "";
         }
 
         int ch = peekChar();
-        
+
         if (quoted) {
             if (ch == '"' || ch == '\'') {
 
@@ -437,8 +435,8 @@
                 // Consume the open quote: 
                 ch = nextChar();
                 for (ch = nextChar(); ch != -1 && ch != endQuote;
-                         ch = nextChar()) {
-                    if (ch == '\\') 
+                     ch = nextChar()) {
+                    if (ch == '\\')
                         ch = nextChar();
                     stringBuffer.append((char) ch);
                 }
@@ -457,7 +455,7 @@
                     // Take care of the quoting here.
                     if (ch == '\\') {
                         if (peekChar() == '"' || peekChar() == '\'' ||
-                               peekChar() == '>' || peekChar() == '%')
+                                peekChar() == '>' || peekChar() == '%')
                             ch = nextChar();
                     }
                     stringBuffer.append((char) ch);
@@ -477,11 +475,9 @@
      * Gets the URL for the given path name.
      *
      * @param path Path name
-     *
      * @return URL for the given path name.
-     *
-     * @exception MalformedURLException if the path name is not given in 
-     * the correct form
+     * @throws MalformedURLException if the path name is not given in
+     *                               the correct form
      */
     URL getResource(String path) throws MalformedURLException {
         return context.getResource(path);
@@ -496,7 +492,7 @@
      * @return A boolean.
      */
     private boolean isDelimiter() throws JasperException {
-        if (! isSpace()) {
+        if (!isSpace()) {
             int ch = peekChar();
             // Look for a single-char work delimiter:
             if (ch == '=' || ch == '>' || ch == '"' || ch == '\''
@@ -539,7 +535,7 @@
 
         return sourceFiles.size() - 1;
     }
-    
+
 
     /**
      * Unregister the source file.
@@ -563,9 +559,9 @@
      * Push a file (and its associated Stream) on the file stack.  THe
      * current position in the current file is remembered.
      */
-    private void pushFile(String file, String encoding, 
-                           InputStreamReader reader) 
-                throws JasperException, FileNotFoundException {
+    private void pushFile(String file, String encoding,
+                          InputStreamReader reader)
+            throws JasperException, FileNotFoundException {
 
         // Register the file
         String longName = file;
@@ -574,11 +570,11 @@
 
         if (fileid == -1) {
             // Bugzilla 37407: http://issues.apache.org/bugzilla/show_bug.cgi?id=37407
-            if(reader != null) {
+            if (reader != null) {
                 try {
                     reader.close();
                 } catch (Exception any) {
-                    if(log.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         log.debug("Exception closing reader: ", any);
                     }
                 }
@@ -592,15 +588,15 @@
         try {
             CharArrayWriter caw = new CharArrayWriter();
             char buf[] = new char[1024];
-            for (int i = 0 ; (i = reader.read(buf)) != -1 ;)
+            for (int i = 0; (i = reader.read(buf)) != -1;)
                 caw.write(buf, 0, i);
             caw.close();
             if (current == null) {
-                current = new Mark(this, caw.toCharArray(), fileid, 
-                                   getFile(fileid), master, encoding);
+                current = new Mark(this, caw.toCharArray(), fileid,
+                        getFile(fileid), master, encoding);
             } else {
                 current.pushStream(caw.toCharArray(), fileid, getFile(fileid),
-                                   longName, encoding);
+                        longName, encoding);
             }
         } catch (Throwable ex) {
             log.error("Exception parsing file ", ex);
@@ -612,7 +608,7 @@
                 try {
                     reader.close();
                 } catch (Exception any) {
-                    if(log.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         log.debug("Exception closing reader: ", any);
                     }
                 }
@@ -624,6 +620,7 @@
      * Pop a file from the file stack.  The field "current" is retored
      * to the value to point to the previous files, if any, and is set
      * to null otherwise.
+     *
      * @return true is there is a previous file on the stack.
      *         false otherwise.
      */
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java
index 75143e7..cc64f6c 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java
@@ -17,8 +17,8 @@
 
 package org.apache.struts2.jasper.compiler;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.Constants;
 import org.apache.struts2.jasper.JspCompilationContext;
 import org.apache.struts2.jasper.Options;
@@ -45,11 +45,11 @@
 /**
  * Class for tracking JSP compile time file dependencies when the
  * &060;%@include file="..."%&062; directive is used.
- *
+ * <p/>
  * A background thread periodically checks the files a JSP page
  * is dependent upon.  If a dpendent file changes the JSP page
  * which included it is recompiled.
- *
+ * <p/>
  * Only used if a web application context is a directory.
  *
  * @author Glenn L. Nielsen
@@ -58,7 +58,7 @@
 public final class JspRuntimeContext implements Runnable {
 
     // Logger
-    private Log log = LogFactory.getLog(JspRuntimeContext.class);
+    private Logger log = LoggerFactory.getLogger(JspRuntimeContext.class);
 
     /*
      * Counts how many times the webapp's JSPs have been reloaded.
@@ -79,7 +79,7 @@
 
     /**
      * Create a JspRuntimeContext for a web application context.
-     *
+     * <p/>
      * Loads in any previously generated dependencies from file.
      *
      * @param context ServletContext for web application
@@ -91,27 +91,27 @@
 
         // Get the parent class loader
         parentClassLoader =
-            (URLClassLoader) Thread.currentThread().getContextClassLoader();
+                (URLClassLoader) Thread.currentThread().getContextClassLoader();
         if (parentClassLoader == null) {
             parentClassLoader =
-                (URLClassLoader)this.getClass().getClassLoader();
+                    (URLClassLoader) this.getClass().getClassLoader();
         }
 
-	if (log.isDebugEnabled()) {
-	    if (parentClassLoader != null) {
-		log.debug(Localizer.getMessage("jsp.message.parent_class_loader_is",
-					       parentClassLoader.toString()));
-	    } else {
-		log.debug(Localizer.getMessage("jsp.message.parent_class_loader_is",
-					       "<none>"));
-	    }
+        if (log.isDebugEnabled()) {
+            if (parentClassLoader != null) {
+                log.debug(Localizer.getMessage("jsp.message.parent_class_loader_is",
+                        parentClassLoader.toString()));
+            } else {
+                log.debug(Localizer.getMessage("jsp.message.parent_class_loader_is",
+                        "<none>"));
+            }
         }
 
         initClassPath();
 
-	if (context instanceof org.apache.struts2.jasper.servlet.JspCServletContext) {
-	    return;
-	}
+        if (context instanceof org.apache.struts2.jasper.servlet.JspCServletContext) {
+            return;
+        }
 
         if (System.getSecurityManager() != null) {
             initSecurity();
@@ -119,18 +119,18 @@
 
         // If this web application context is running from a
         // directory, start the background compilation thread
-        String appBase = context.getRealPath("/");         
+        String appBase = context.getRealPath("/");
         if (!options.getDevelopment()
                 && appBase != null
                 && options.getCheckInterval() > 0) {
-            if (appBase.endsWith(File.separator) ) {
-                appBase = appBase.substring(0,appBase.length()-1);
+            if (appBase.endsWith(File.separator)) {
+                appBase = appBase.substring(0, appBase.length() - 1);
             }
             String directory =
-                appBase.substring(appBase.lastIndexOf(File.separator));
+                    appBase.substring(appBase.lastIndexOf(File.separator));
             threadName = threadName + "[" + directory + "]";
             threadStart();
-        }                                            
+        }
     }
 
     // ----------------------------------------------------- Instance Variables
@@ -142,14 +142,14 @@
     private Options options;
     private URLClassLoader parentClassLoader;
     private PermissionCollection permissionCollection;
-    private CodeSource codeSource;                    
+    private CodeSource codeSource;
     private String classpath;
 
     /**
      * Maps JSP pages to their JspServletWrapper's
      */
-    private Map jsps = Collections.synchronizedMap( new HashMap());
- 
+    private Map jsps = Collections.synchronizedMap(new HashMap());
+
 
     /**
      * The background thread.
@@ -174,11 +174,11 @@
      * Add a new JspServletWrapper.
      *
      * @param jspUri JSP URI
-     * @param jsw Servlet wrapper for JSP
+     * @param jsw    Servlet wrapper for JSP
      */
     public void addWrapper(String jspUri, JspServletWrapper jsw) {
         jsps.remove(jspUri);
-        jsps.put(jspUri,jsw);
+        jsps.put(jspUri, jsw);
     }
 
     /**
@@ -241,7 +241,7 @@
 
     /**
      * Process a "destory" event for this web application context.
-     */                                                        
+     */
     public void destroy() {
         threadStop();
 
@@ -284,20 +284,20 @@
      * registered with this class for JSP's.
      */
     private void checkCompile() {
-        Object [] wrappers = jsps.values().toArray();
-        for (int i = 0; i < wrappers.length; i++ ) {
-            JspServletWrapper jsw = (JspServletWrapper)wrappers[i];
+        Object[] wrappers = jsps.values().toArray();
+        for (int i = 0; i < wrappers.length; i++) {
+            JspServletWrapper jsw = (JspServletWrapper) wrappers[i];
             JspCompilationContext ctxt = jsw.getJspEngineContext();
             // JspServletWrapper also synchronizes on this when
             // it detects it has to do a reload
-            synchronized(jsw) {
+            synchronized (jsw) {
                 try {
                     ctxt.compile();
                 } catch (FileNotFoundException ex) {
                     ctxt.incrementRemoved();
                 } catch (Throwable t) {
                     jsw.getServletContext().log("Background compile failed",
-						t);
+                            t);
                 }
             }
         }
@@ -315,22 +315,22 @@
      */
     private void initClassPath() {
 
-        URL [] urls = parentClassLoader.getURLs();
+        URL[] urls = parentClassLoader.getURLs();
         StringBuffer cpath = new StringBuffer();
         String sep = System.getProperty("path.separator");
 
-        for(int i = 0; i < urls.length; i++) {
+        for (int i = 0; i < urls.length; i++) {
             // Tomcat 4 can use URL's other than file URL's,
             // a protocol other than file: will generate a
             // bad file system path, so only add file:
             // protocol URL's to the classpath.
-            
-            if( urls[i].getProtocol().equals("file") ) {
-                cpath.append((String)urls[i].getFile()+sep);
-            }
-        }    
 
-	cpath.append(options.getScratchDir() + sep);
+            if (urls[i].getProtocol().equals("file")) {
+                cpath.append((String) urls[i].getFile() + sep);
+            }
+        }
+
+        cpath.append(options.getScratchDir() + sep);
 
         String cp = (String) context.getAttribute(Constants.SERVLET_CLASSPATH);
         if (cp == null || cp.equals("")) {
@@ -339,7 +339,7 @@
 
         classpath = cpath.toString() + cp;
 
-        if(log.isDebugEnabled()) {
+        if (log.isDebugEnabled()) {
             log.debug("Compilation classpath initialized: " + getClassPath());
         }
     }
@@ -354,80 +354,80 @@
         // web app context directory, then add a file read permission
         // for that directory.
         Policy policy = Policy.getPolicy();
-        if( policy != null ) {
-            try {          
+        if (policy != null) {
+            try {
                 // Get the permissions for the web app context
                 String docBase = context.getRealPath("/");
-                if( docBase == null ) {
+                if (docBase == null) {
                     docBase = options.getScratchDir().toString();
                 }
                 String codeBase = docBase;
-                if (!codeBase.endsWith(File.separator)){
+                if (!codeBase.endsWith(File.separator)) {
                     codeBase = codeBase + File.separator;
                 }
                 File contextDir = new File(codeBase);
                 URL url = contextDir.getCanonicalFile().toURL();
-                codeSource = new CodeSource(url,(Certificate[])null);
+                codeSource = new CodeSource(url, (Certificate[]) null);
                 permissionCollection = policy.getPermissions(codeSource);
 
                 // Create a file read permission for web app context directory
-                if (!docBase.endsWith(File.separator)){
+                if (!docBase.endsWith(File.separator)) {
                     permissionCollection.add
-                        (new FilePermission(docBase,"read"));
+                            (new FilePermission(docBase, "read"));
                     docBase = docBase + File.separator;
                 } else {
                     permissionCollection.add
-                        (new FilePermission
-                            (docBase.substring(0,docBase.length() - 1),"read"));
+                            (new FilePermission
+                                    (docBase.substring(0, docBase.length() - 1), "read"));
                 }
                 docBase = docBase + "-";
-                permissionCollection.add(new FilePermission(docBase,"read"));
+                permissionCollection.add(new FilePermission(docBase, "read"));
 
                 // Create a file read permission for web app tempdir (work)
                 // directory
                 String workDir = options.getScratchDir().toString();
-                if (!workDir.endsWith(File.separator)){
+                if (!workDir.endsWith(File.separator)) {
                     permissionCollection.add
-                        (new FilePermission(workDir,"read"));
+                            (new FilePermission(workDir, "read"));
                     workDir = workDir + File.separator;
                 }
                 workDir = workDir + "-";
-                permissionCollection.add(new FilePermission(workDir,"read"));
+                permissionCollection.add(new FilePermission(workDir, "read"));
 
                 // Allow the JSP to access org.apache.struts2.jasper.runtime.HttpJspBase
-                permissionCollection.add( new RuntimePermission(
-                    "accessClassInPackage.org.apache.struts2.jasper.runtime") );
+                permissionCollection.add(new RuntimePermission(
+                        "accessClassInPackage.org.apache.struts2.jasper.runtime"));
 
                 if (parentClassLoader instanceof URLClassLoader) {
-                    URL [] urls = parentClassLoader.getURLs();
+                    URL[] urls = parentClassLoader.getURLs();
                     String jarUrl = null;
                     String jndiUrl = null;
-                    for (int i=0; i<urls.length; i++) {
+                    for (int i = 0; i < urls.length; i++) {
                         if (jndiUrl == null
-                                && urls[i].toString().startsWith("jndi:") ) {
+                                && urls[i].toString().startsWith("jndi:")) {
                             jndiUrl = urls[i].toString() + "-";
                         }
                         if (jarUrl == null
                                 && urls[i].toString().startsWith("jar:jndi:")
                                 ) {
                             jarUrl = urls[i].toString();
-                            jarUrl = jarUrl.substring(0,jarUrl.length() - 2);
+                            jarUrl = jarUrl.substring(0, jarUrl.length() - 2);
                             jarUrl = jarUrl.substring(0,
-                                     jarUrl.lastIndexOf('/')) + "/-";
+                                    jarUrl.lastIndexOf('/')) + "/-";
                         }
                     }
                     if (jarUrl != null) {
                         permissionCollection.add(
-                                new FilePermission(jarUrl,"read"));
+                                new FilePermission(jarUrl, "read"));
                         permissionCollection.add(
-                                new FilePermission(jarUrl.substring(4),"read"));
+                                new FilePermission(jarUrl.substring(4), "read"));
                     }
                     if (jndiUrl != null)
                         permissionCollection.add(
-                                new FilePermission(jndiUrl,"read") );
+                                new FilePermission(jndiUrl, "read"));
                 }
-            } catch(Exception e) {
-                context.log("Security Init for context failed",e);
+            } catch (Exception e) {
+                context.log("Security Init for context failed", e);
             }
         }
     }
@@ -439,8 +439,8 @@
      * Start the background thread that will periodically check for
      * changes to compile time included files in a JSP.
      *
-     * @exception IllegalStateException if we should not be starting
-     *  a background thread now
+     * @throws IllegalStateException if we should not be starting
+     *                               a background thread now
      */
     protected void threadStart() {
 
@@ -461,7 +461,7 @@
     /**
      * Stop the background thread that is periodically checking for
      * changes to compile time included files in a JSP.
-     */ 
+     */
     protected void threadStop() {
 
         if (thread == null) {
@@ -475,35 +475,35 @@
         } catch (InterruptedException e) {
             ;
         }
-        
+
         thread = null;
-        
+
     }
 
     /**
      * Sleep for the duration specified by the <code>checkInterval</code>
      * property.
-     */ 
+     */
     protected void threadSleep() {
-        
+
         try {
             Thread.sleep(options.getCheckInterval() * 1000L);
         } catch (InterruptedException e) {
             ;
         }
-        
-    }   
-    
-    
+
+    }
+
+
     // ------------------------------------------------------ Background Thread
-        
-        
+
+
     /**
      * The background thread that checks for changes to files
      * included by a JSP and flags that a recompile is required.
-     */ 
+     */
     public void run() {
-        
+
         // Loop until the termination semaphore is set
         while (!threadDone) {
 
@@ -518,7 +518,7 @@
                 log.error("Exception checking if recompile needed: ", t);
             }
         }
-        
+
     }
 
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspUtil.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspUtil.java
index 13cb75c..aa6ea6b 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspUtil.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/JspUtil.java
@@ -31,7 +31,7 @@
 import java.util.jar.JarFile;
 import java.util.zip.ZipEntry;
 
-/** 
+/**
  * This class has all the utility method(s).
  * Ideally should move all the bean containers here.
  *
@@ -48,34 +48,34 @@
     private static final String META_INF_TAGS = "/META-INF/tags/";
 
     // Delimiters for request-time expressions (JSP and XML syntax)
-    private static final String OPEN_EXPR  = "<%=";
+    private static final String OPEN_EXPR = "<%=";
     private static final String CLOSE_EXPR = "%>";
-    private static final String OPEN_EXPR_XML  = "%=";
+    private static final String OPEN_EXPR_XML = "%=";
     private static final String CLOSE_EXPR_XML = "%";
 
     private static int tempSequenceNumber = 0;
     private static ExpressionEvaluatorImpl expressionEvaluator
-	= new ExpressionEvaluatorImpl();
+            = new ExpressionEvaluatorImpl();
 
     private static final String javaKeywords[] = {
-        "abstract", "assert", "boolean", "break", "byte", "case",
-        "catch", "char", "class", "const", "continue",
-        "default", "do", "double", "else", "enum", "extends",
-        "final", "finally", "float", "for", "goto",
-        "if", "implements", "import", "instanceof", "int",
-        "interface", "long", "native", "new", "package",
-        "private", "protected", "public", "return", "short",
-        "static", "strictfp", "super", "switch", "synchronized",
-        "this", "throws", "transient", "try", "void",
-        "volatile", "while" };
+            "abstract", "assert", "boolean", "break", "byte", "case",
+            "catch", "char", "class", "const", "continue",
+            "default", "do", "double", "else", "enum", "extends",
+            "final", "finally", "float", "for", "goto",
+            "if", "implements", "import", "instanceof", "int",
+            "interface", "long", "native", "new", "package",
+            "private", "protected", "public", "return", "short",
+            "static", "strictfp", "super", "switch", "synchronized",
+            "this", "throws", "transient", "try", "void",
+            "volatile", "while"};
 
     public static final int CHUNKSIZE = 1024;
-        
-    public static char[] removeQuotes(char []chars) {
+
+    public static char[] removeQuotes(char[] chars) {
         CharArrayWriter caw = new CharArrayWriter();
         for (int i = 0; i < chars.length; i++) {
-            if (chars[i] == '%' && chars[i+1] == '\\' &&
-                chars[i+2] == '>') {
+            if (chars[i] == '%' && chars[i + 1] == '\\' &&
+                    chars[i + 2] == '>') {
                 caw.write('%');
                 caw.write('>');
                 i = i + 2;
@@ -86,7 +86,7 @@
         return caw.toCharArray();
     }
 
-    public static char[] escapeQuotes (char []chars) {
+    public static char[] escapeQuotes(char[] chars) {
         // Prescan to convert %\> to %>
         String s = new String(chars);
         while (true) {
@@ -123,49 +123,49 @@
      * expression starts with '%=' and ends with '%'.
      *
      * @param token The token to be checked
-     * return whether the token is a runtime expression or not.
+     *              return whether the token is a runtime expression or not.
      */
     public static boolean isExpression(String token, boolean isXml) {
-	String openExpr;
-	String closeExpr;
-	if (isXml) {
-	    openExpr = OPEN_EXPR_XML;
-	    closeExpr = CLOSE_EXPR_XML;
-	} else {
-	    openExpr = OPEN_EXPR;
-	    closeExpr = CLOSE_EXPR;
-	}
-	if (token.startsWith(openExpr) && token.endsWith(closeExpr)) {
-	    return true;
-	} else {
-	    return false;
-	}
+        String openExpr;
+        String closeExpr;
+        if (isXml) {
+            openExpr = OPEN_EXPR_XML;
+            closeExpr = CLOSE_EXPR_XML;
+        } else {
+            openExpr = OPEN_EXPR;
+            closeExpr = CLOSE_EXPR;
+        }
+        if (token.startsWith(openExpr) && token.endsWith(closeExpr)) {
+            return true;
+        } else {
+            return false;
+        }
     }
 
     /**
-     * @return the "expression" part of a runtime expression, 
-     * taking the delimiters out.
+     * @return the "expression" part of a runtime expression,
+     *         taking the delimiters out.
      */
-    public static String getExpr (String expression, boolean isXml) {
-	String returnString;
-	String openExpr;
-	String closeExpr;
-	if (isXml) {
-	    openExpr = OPEN_EXPR_XML;
-	    closeExpr = CLOSE_EXPR_XML;
-	} else {
-	    openExpr = OPEN_EXPR;
-	    closeExpr = CLOSE_EXPR;
-	}
-	int length = expression.length();
-	if (expression.startsWith(openExpr) && 
+    public static String getExpr(String expression, boolean isXml) {
+        String returnString;
+        String openExpr;
+        String closeExpr;
+        if (isXml) {
+            openExpr = OPEN_EXPR_XML;
+            closeExpr = CLOSE_EXPR_XML;
+        } else {
+            openExpr = OPEN_EXPR;
+            closeExpr = CLOSE_EXPR;
+        }
+        int length = expression.length();
+        if (expression.startsWith(openExpr) &&
                 expression.endsWith(closeExpr)) {
-	    returnString = expression.substring(
-                               openExpr.length(), length - closeExpr.length());
-	} else {
-	    returnString = "";
-	}
-	return returnString;
+            returnString = expression.substring(
+                    openExpr.length(), length - closeExpr.length());
+        } else {
+            returnString = "";
+        }
+        return returnString;
     }
 
     /**
@@ -175,9 +175,9 @@
         String returnString;
         int length = expression.length();
 
-        if (expression.startsWith(OPEN_EXPR) 
+        if (expression.startsWith(OPEN_EXPR)
                 && expression.endsWith(CLOSE_EXPR)) {
-            returnString = expression.substring (1, length - 1);
+            returnString = expression.substring(1, length - 1);
         } else {
             returnString = expression;
         }
@@ -189,40 +189,39 @@
      * Checks to see if the given scope is valid.
      *
      * @param scope The scope to be checked
-     * @param n The Node containing the 'scope' attribute whose value is to be
-     * checked
-     * @param err error dispatcher
-     *
+     * @param n     The Node containing the 'scope' attribute whose value is to be
+     *              checked
+     * @param err   error dispatcher
      * @throws JasperException if scope is not null and different from
-     * &quot;page&quot;, &quot;request&quot;, &quot;session&quot;, and
-     * &quot;application&quot;
+     *                         &quot;page&quot;, &quot;request&quot;, &quot;session&quot;, and
+     *                         &quot;application&quot;
      */
     public static void checkScope(String scope, Node n, ErrorDispatcher err)
             throws JasperException {
-	if (scope != null && !scope.equals("page") && !scope.equals("request")
-		&& !scope.equals("session") && !scope.equals("application")) {
-	    err.jspError(n, "jsp.error.invalid.scope", scope);
-	}
+        if (scope != null && !scope.equals("page") && !scope.equals("request")
+                && !scope.equals("session") && !scope.equals("application")) {
+            err.jspError(n, "jsp.error.invalid.scope", scope);
+        }
     }
 
     /**
      * Checks if all mandatory attributes are present and if all attributes
      * present have valid names.  Checks attributes specified as XML-style
      * attributes as well as attributes specified using the jsp:attribute
-     * standard action. 
+     * standard action.
      */
     public static void checkAttributes(String typeOfTag,
-				       Node n,
-				       ValidAttribute[] validAttributes,
-				       ErrorDispatcher err)
-				throws JasperException {
+                                       Node n,
+                                       ValidAttribute[] validAttributes,
+                                       ErrorDispatcher err)
+            throws JasperException {
         Attributes attrs = n.getAttributes();
         Mark start = n.getStart();
-	boolean valid = true;
+        boolean valid = true;
 
         // AttributesImpl.removeAttribute is broken, so we do this...
         int tempLength = (attrs == null) ? 0 : attrs.getLength();
-	Vector temp = new Vector(tempLength, 1);
+        Vector temp = new Vector(tempLength, 1);
         for (int i = 0; i < tempLength; i++) {
             String qName = attrs.getQName(i);
             if ((!qName.equals("xmlns")) && (!qName.startsWith("xmlns:")))
@@ -231,20 +230,19 @@
 
         // Add names of attributes specified using jsp:attribute
         Node.Nodes tagBody = n.getBody();
-        if( tagBody != null ) {
+        if (tagBody != null) {
             int numSubElements = tagBody.size();
-            for( int i = 0; i < numSubElements; i++ ) {
-                Node node = tagBody.getNode( i );
-                if( node instanceof Node.NamedAttribute ) {
-                    String attrName = node.getAttributeValue( "name" );
-                    temp.addElement( attrName );
-		    // Check if this value appear in the attribute of the node
-		    if (n.getAttributeValue(attrName) != null) {
-			err.jspError(n, "jsp.error.duplicate.name.jspattribute",
-					attrName);
-		    }
-                }
-                else {
+            for (int i = 0; i < numSubElements; i++) {
+                Node node = tagBody.getNode(i);
+                if (node instanceof Node.NamedAttribute) {
+                    String attrName = node.getAttributeValue("name");
+                    temp.addElement(attrName);
+                    // Check if this value appear in the attribute of the node
+                    if (n.getAttributeValue(attrName) != null) {
+                        err.jspError(n, "jsp.error.duplicate.name.jspattribute",
+                                attrName);
+                    }
+                } else {
                     // Nothing can come before jsp:attribute, and only
                     // jsp:body can come after it.
                     break;
@@ -252,82 +250,82 @@
             }
         }
 
-	/*
-	 * First check to see if all the mandatory attributes are present.
-	 * If so only then proceed to see if the other attributes are valid
-	 * for the particular tag.
-	 */
-	String missingAttribute = null;
+        /*
+       * First check to see if all the mandatory attributes are present.
+       * If so only then proceed to see if the other attributes are valid
+       * for the particular tag.
+       */
+        String missingAttribute = null;
 
-	for (int i = 0; i < validAttributes.length; i++) {
-	    int attrPos;    
-	    if (validAttributes[i].mandatory) {
+        for (int i = 0; i < validAttributes.length; i++) {
+            int attrPos;
+            if (validAttributes[i].mandatory) {
                 attrPos = temp.indexOf(validAttributes[i].name);
-		if (attrPos != -1) {
-		    temp.remove(attrPos);
-		    valid = true;
-		} else {
-		    valid = false;
-		    missingAttribute = validAttributes[i].name;
-		    break;
-		}
-	    }
-	}
+                if (attrPos != -1) {
+                    temp.remove(attrPos);
+                    valid = true;
+                } else {
+                    valid = false;
+                    missingAttribute = validAttributes[i].name;
+                    break;
+                }
+            }
+        }
 
-	// If mandatory attribute is missing then the exception is thrown
-	if (!valid)
-	    err.jspError(start, "jsp.error.mandatory.attribute", typeOfTag,
-			 missingAttribute);
+        // If mandatory attribute is missing then the exception is thrown
+        if (!valid)
+            err.jspError(start, "jsp.error.mandatory.attribute", typeOfTag,
+                    missingAttribute);
 
-	// Check to see if there are any more attributes for the specified tag.
+        // Check to see if there are any more attributes for the specified tag.
         int attrLeftLength = temp.size();
-	if (attrLeftLength == 0)
-	    return;
+        if (attrLeftLength == 0)
+            return;
 
-	// Now check to see if the rest of the attributes are valid too.
-	String attribute = null;
+        // Now check to see if the rest of the attributes are valid too.
+        String attribute = null;
 
-	for (int j = 0; j < attrLeftLength; j++) {
-	    valid = false;
-	    attribute = (String) temp.elementAt(j);
-	    for (int i = 0; i < validAttributes.length; i++) {
-		if (attribute.equals(validAttributes[i].name)) {
-		    valid = true;
-		    break;
-		}
-	    }
-	    if (!valid)
-		err.jspError(start, "jsp.error.invalid.attribute", typeOfTag,
-			     attribute);
-	}
-	// XXX *could* move EL-syntax validation here... (sb)
+        for (int j = 0; j < attrLeftLength; j++) {
+            valid = false;
+            attribute = (String) temp.elementAt(j);
+            for (int i = 0; i < validAttributes.length; i++) {
+                if (attribute.equals(validAttributes[i].name)) {
+                    valid = true;
+                    break;
+                }
+            }
+            if (!valid)
+                err.jspError(start, "jsp.error.invalid.attribute", typeOfTag,
+                        attribute);
+        }
+        // XXX *could* move EL-syntax validation here... (sb)
     }
-    
+
     public static String escapeQueryString(String unescString) {
-	if ( unescString == null )
-	    return null;
-	
-	String escString    = "";
-	String shellSpChars = "\\\"";
-	
-	for(int index=0; index<unescString.length(); index++) {
-	    char nextChar = unescString.charAt(index);
-	    
-	    if( shellSpChars.indexOf(nextChar) != -1 )
-		escString += "\\";
-	    
-	    escString += nextChar;
-	}
-	return escString;
+        if (unescString == null)
+            return null;
+
+        String escString = "";
+        String shellSpChars = "\\\"";
+
+        for (int index = 0; index < unescString.length(); index++) {
+            char nextChar = unescString.charAt(index);
+
+            if (shellSpChars.indexOf(nextChar) != -1)
+                escString += "\\";
+
+            escString += nextChar;
+        }
+        return escString;
     }
- 
+
     /**
-     *  Escape the 5 entities defined by XML.
+     * Escape the 5 entities defined by XML.
      */
     public static String escapeXml(String s) {
         if (s == null) return null;
         StringBuffer sb = new StringBuffer();
-        for(int i=0; i<s.length(); i++) {
+        for (int i = 0; i < s.length(); i++) {
             char c = s.charAt(i);
             if (c == '<') {
                 sb.append("&lt;");
@@ -351,189 +349,188 @@
      * string <tt>with</tt>.
      */
     public static String replace(String name, char replace, String with) {
-	StringBuffer buf = new StringBuffer();
-	int begin = 0;
-	int end;
-	int last = name.length();
+        StringBuffer buf = new StringBuffer();
+        int begin = 0;
+        int end;
+        int last = name.length();
 
-	while (true) {
-	    end = name.indexOf(replace, begin);
-	    if (end < 0) {
-		end = last;
-	    }
-	    buf.append(name.substring(begin, end));
-	    if (end == last) {
-		break;
-	    }
-	    buf.append(with);
-	    begin = end + 1;
-	}
-	
-	return buf.toString();
+        while (true) {
+            end = name.indexOf(replace, begin);
+            if (end < 0) {
+                end = last;
+            }
+            buf.append(name.substring(begin, end));
+            if (end == last) {
+                break;
+            }
+            buf.append(with);
+            begin = end + 1;
+        }
+
+        return buf.toString();
     }
 
     public static class ValidAttribute {
-	String name;
-	boolean mandatory;
-	boolean rtexprvalue;	// not used now
+        String name;
+        boolean mandatory;
+        boolean rtexprvalue;    // not used now
 
-	public ValidAttribute (String name, boolean mandatory,
-            boolean rtexprvalue )
-        {
-	    this.name = name;
-	    this.mandatory = mandatory;
+        public ValidAttribute(String name, boolean mandatory,
+                              boolean rtexprvalue) {
+            this.name = name;
+            this.mandatory = mandatory;
             this.rtexprvalue = rtexprvalue;
         }
 
-       public ValidAttribute (String name, boolean mandatory) {
-            this( name, mandatory, false );
-	}
+        public ValidAttribute(String name, boolean mandatory) {
+            this(name, mandatory, false);
+        }
 
-	public ValidAttribute (String name) {
-	    this (name, false);
-	}
+        public ValidAttribute(String name) {
+            this(name, false);
+        }
     }
-    
+
     /**
      * Convert a String value to 'boolean'.
      * Besides the standard conversions done by
      * Boolean.valueOf(s).booleanValue(), the value "yes"
-     * (ignore case) is also converted to 'true'. 
+     * (ignore case) is also converted to 'true'.
      * If 's' is null, then 'false' is returned.
      *
      * @param s the string to be converted
      * @return the boolean value associated with the string s
      */
     public static boolean booleanValue(String s) {
-	boolean b = false;
-	if (s != null) {
-	    if (s.equalsIgnoreCase("yes")) {
-		b = true;
-	    } else {
-		b = Boolean.valueOf(s).booleanValue();
-	    }
-	}
-	return b;
+        boolean b = false;
+        if (s != null) {
+            if (s.equalsIgnoreCase("yes")) {
+                b = true;
+            } else {
+                b = Boolean.valueOf(s).booleanValue();
+            }
+        }
+        return b;
     }
 
     /**
      * Returns the <tt>Class</tt> object associated with the class or
      * interface with the given string name.
-     *
+     * <p/>
      * <p> The <tt>Class</tt> object is determined by passing the given string
      * name to the <tt>Class.forName()</tt> method, unless the given string
      * name represents a primitive type, in which case it is converted to a
      * <tt>Class</tt> object by appending ".class" to it (e.g., "int.class").
      */
     public static Class toClass(String type, ClassLoader loader)
-	    throws ClassNotFoundException {
+            throws ClassNotFoundException {
 
-	Class c = null;
-	int i0 = type.indexOf('[');
-	int dims = 0;
-	if (i0 > 0) {
-	    // This is an array.  Count the dimensions
-	    for (int i = 0; i < type.length(); i++) {
-		if (type.charAt(i) == '[')
-		    dims++;
-	    }
-	    type = type.substring(0, i0);
-	}
+        Class c = null;
+        int i0 = type.indexOf('[');
+        int dims = 0;
+        if (i0 > 0) {
+            // This is an array.  Count the dimensions
+            for (int i = 0; i < type.length(); i++) {
+                if (type.charAt(i) == '[')
+                    dims++;
+            }
+            type = type.substring(0, i0);
+        }
 
-	if ("boolean".equals(type))
-	    c = boolean.class;
-	else if ("char".equals(type))
-	    c = char.class;
-	else if ("byte".equals(type))
-	    c =  byte.class;
-	else if ("short".equals(type))
-	    c = short.class;
-	else if ("int".equals(type))
-	    c = int.class;
-	else if ("long".equals(type))
-	    c = long.class;
-	else if ("float".equals(type))
-	    c = float.class;
-	else if ("double".equals(type))
-	    c = double.class;
-	else if (type.indexOf('[') < 0)
-	    c = loader.loadClass(type);
+        if ("boolean".equals(type))
+            c = boolean.class;
+        else if ("char".equals(type))
+            c = char.class;
+        else if ("byte".equals(type))
+            c = byte.class;
+        else if ("short".equals(type))
+            c = short.class;
+        else if ("int".equals(type))
+            c = int.class;
+        else if ("long".equals(type))
+            c = long.class;
+        else if ("float".equals(type))
+            c = float.class;
+        else if ("double".equals(type))
+            c = double.class;
+        else if (type.indexOf('[') < 0)
+            c = loader.loadClass(type);
 
-	if (dims == 0)
-	    return c;
+        if (dims == 0)
+            return c;
 
-	if (dims == 1)
-	    return java.lang.reflect.Array.newInstance(c, 1).getClass();
+        if (dims == 1)
+            return java.lang.reflect.Array.newInstance(c, 1).getClass();
 
-	// Array of more than i dimension
-	return java.lang.reflect.Array.newInstance(c, new int[dims]).getClass();
+        // Array of more than i dimension
+        return java.lang.reflect.Array.newInstance(c, new int[dims]).getClass();
     }
 
     /**
      * Produces a String representing a call to the EL interpreter.
-     * @param expression a String containing zero or more "${}" expressions
+     *
+     * @param expression   a String containing zero or more "${}" expressions
      * @param expectedType the expected type of the interpreted result
-     * @param fnmapvar Variable pointing to a function map.
-     * @param XmlEscape True if the result should do XML escaping
+     * @param fnmapvar     Variable pointing to a function map.
+     * @param XmlEscape    True if the result should do XML escaping
      * @return a String representing a call to the EL interpreter.
      */
     public static String interpreterCall(boolean isTagFile,
-					 String expression,
+                                         String expression,
                                          Class expectedType,
                                          String fnmapvar,
-                                         boolean XmlEscape ) 
-    {
+                                         boolean XmlEscape) {
         /*
          * Determine which context object to use.
          */
-	String jspCtxt = null;
-	if (isTagFile)
-	    jspCtxt = "this.getJspContext()";
-	else
-	    jspCtxt = "_jspx_page_context";
+        String jspCtxt = null;
+        if (isTagFile)
+            jspCtxt = "this.getJspContext()";
+        else
+            jspCtxt = "_jspx_page_context";
 
-	/*
-         * Determine whether to use the expected type's textual name
-	 * or, if it's a primitive, the name of its correspondent boxed
-	 * type.
-         */
-	String targetType = expectedType.getName();
-	String primitiveConverterMethod = null;
-	if (expectedType.isPrimitive()) {
-	    if (expectedType.equals(Boolean.TYPE)) {
-		targetType = Boolean.class.getName();
-		primitiveConverterMethod = "booleanValue";
-	    } else if (expectedType.equals(Byte.TYPE)) {
-		targetType = Byte.class.getName();
-		primitiveConverterMethod = "byteValue";
-	    } else if (expectedType.equals(Character.TYPE)) {
-		targetType = Character.class.getName();
-		primitiveConverterMethod = "charValue";
-	    } else if (expectedType.equals(Short.TYPE)) {
-		targetType = Short.class.getName();
-		primitiveConverterMethod = "shortValue";
-	    } else if (expectedType.equals(Integer.TYPE)) {
-		targetType = Integer.class.getName();
-		primitiveConverterMethod = "intValue";
-	    } else if (expectedType.equals(Long.TYPE)) {
-		targetType = Long.class.getName();
-		primitiveConverterMethod = "longValue";
-	    } else if (expectedType.equals(Float.TYPE)) {
-		targetType = Float.class.getName();
-		primitiveConverterMethod = "floatValue";
-	    } else if (expectedType.equals(Double.TYPE)) { 
-		targetType = Double.class.getName();
-		primitiveConverterMethod = "doubleValue";
-	    }
-	}
- 
-	if (primitiveConverterMethod != null) {
-	    XmlEscape = false;
-	}
+        /*
+        * Determine whether to use the expected type's textual name
+    * or, if it's a primitive, the name of its correspondent boxed
+    * type.
+        */
+        String targetType = expectedType.getName();
+        String primitiveConverterMethod = null;
+        if (expectedType.isPrimitive()) {
+            if (expectedType.equals(Boolean.TYPE)) {
+                targetType = Boolean.class.getName();
+                primitiveConverterMethod = "booleanValue";
+            } else if (expectedType.equals(Byte.TYPE)) {
+                targetType = Byte.class.getName();
+                primitiveConverterMethod = "byteValue";
+            } else if (expectedType.equals(Character.TYPE)) {
+                targetType = Character.class.getName();
+                primitiveConverterMethod = "charValue";
+            } else if (expectedType.equals(Short.TYPE)) {
+                targetType = Short.class.getName();
+                primitiveConverterMethod = "shortValue";
+            } else if (expectedType.equals(Integer.TYPE)) {
+                targetType = Integer.class.getName();
+                primitiveConverterMethod = "intValue";
+            } else if (expectedType.equals(Long.TYPE)) {
+                targetType = Long.class.getName();
+                primitiveConverterMethod = "longValue";
+            } else if (expectedType.equals(Float.TYPE)) {
+                targetType = Float.class.getName();
+                primitiveConverterMethod = "floatValue";
+            } else if (expectedType.equals(Double.TYPE)) {
+                targetType = Double.class.getName();
+                primitiveConverterMethod = "doubleValue";
+            }
+        }
 
-	/*
-         * Build up the base call to the interpreter.
-         */
+        if (primitiveConverterMethod != null) {
+            XmlEscape = false;
+        }
+
+        /*
+        * Build up the base call to the interpreter.
+        */
         // XXX - We use a proprietary call to the interpreter for now
         // as the current standard machinery is inefficient and requires
         // lots of wrappers and adapters.  This should all clear up once
@@ -545,33 +542,34 @@
         // Note that PageContextImpl implements VariableResolver and
         // the generated Servlet/SimpleTag implements FunctionMapper, so
         // that machinery is already in place (mroth).
-	targetType = toJavaSourceType(targetType);
-	StringBuffer call = new StringBuffer(
-             "(" + targetType + ") "
-               + "org.apache.struts2.jasper.runtime.PageContextImpl.proprietaryEvaluate"
-               + "(" + Generator.quote(expression) + ", "
-               +       targetType + ".class, "
-	       +       "(PageContext)" + jspCtxt 
-               +       ", " + fnmapvar
-	       + ", " + XmlEscape
-               + ")");
- 
-	/*
-         * Add the primitive converter method if we need to.
-         */
-	if (primitiveConverterMethod != null) {
-	    call.insert(0, "(");
-	    call.append(")." + primitiveConverterMethod + "()");
-	}
- 
-	return call.toString();
+        targetType = toJavaSourceType(targetType);
+        StringBuffer call = new StringBuffer(
+                "(" + targetType + ") "
+                        + "org.apache.struts2.jasper.runtime.PageContextImpl.proprietaryEvaluate"
+                        + "(" + Generator.quote(expression) + ", "
+                        + targetType + ".class, "
+                        + "(PageContext)" + jspCtxt
+                        + ", " + fnmapvar
+                        + ", " + XmlEscape
+                        + ")");
+
+        /*
+        * Add the primitive converter method if we need to.
+        */
+        if (primitiveConverterMethod != null) {
+            call.insert(0, "(");
+            call.append(")." + primitiveConverterMethod + "()");
+        }
+
+        return call.toString();
     }
 
     /**
      * Validates the syntax of all ${} expressions within the given string.
-     * @param where the approximate location of the expressions in the JSP page
+     *
+     * @param where       the approximate location of the expressions in the JSP page
      * @param expressions a string containing zero or more "${}" expressions
-     * @param err an error dispatcher to use
+     * @param err         an error dispatcher to use
      */
     public static void validateExpressions(Mark where,
                                            String expressions,
@@ -581,16 +579,16 @@
             throws JasperException {
 
         try {
-            JspUtil.expressionEvaluator.parseExpression( expressions, 
-                expectedType, null );
+            JspUtil.expressionEvaluator.parseExpression(expressions,
+                    expectedType, null);
         }
-        catch( ELParseException e ) {
+        catch (ELParseException e) {
             err.jspError(where, "jsp.error.invalid.expression", expressions,
-                e.toString() );
+                    e.toString());
         }
-        catch( ELException e ) {
+        catch (ELException e) {
             err.jspError(where, "jsp.error.invalid.expression", expressions,
-                e.toString() );
+                    e.toString());
         }
     }
 
@@ -611,230 +609,230 @@
     }
 
     public static String coerceToPrimitiveBoolean(String s,
-						  boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToBoolean(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0)
-		return "false";
-	    else
-		return Boolean.valueOf(s).toString();
-	}
+                                                  boolean isNamedAttribute) {
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToBoolean(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0)
+                return "false";
+            else
+                return Boolean.valueOf(s).toString();
+        }
     }
 
     public static String coerceToBoolean(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Boolean) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Boolean.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Boolean(false)";
-	    } else {
-		// Detect format error at translation time
-		return "new Boolean(" + Boolean.valueOf(s).toString() + ")";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Boolean) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Boolean.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Boolean(false)";
+            } else {
+                // Detect format error at translation time
+                return "new Boolean(" + Boolean.valueOf(s).toString() + ")";
+            }
+        }
     }
 
     public static String coerceToPrimitiveByte(String s,
-					       boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToByte(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0)
-		return "(byte) 0";
-	    else
-		return "((byte)" + Byte.valueOf(s).toString() + ")";
-	}
+                                               boolean isNamedAttribute) {
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToByte(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0)
+                return "(byte) 0";
+            else
+                return "((byte)" + Byte.valueOf(s).toString() + ")";
+        }
     }
 
     public static String coerceToByte(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Byte) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Byte.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Byte((byte) 0)";
-	    } else {
-		// Detect format error at translation time
-		return "new Byte((byte)" + Byte.valueOf(s).toString() + ")";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Byte) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Byte.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Byte((byte) 0)";
+            } else {
+                // Detect format error at translation time
+                return "new Byte((byte)" + Byte.valueOf(s).toString() + ")";
+            }
+        }
     }
 
     public static String coerceToChar(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToChar(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "(char) 0";
-	    } else {
-		char ch = s.charAt(0);
-		// this trick avoids escaping issues
-		return "((char) " + (int) ch + ")";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToChar(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "(char) 0";
+            } else {
+                char ch = s.charAt(0);
+                // this trick avoids escaping issues
+                return "((char) " + (int) ch + ")";
+            }
+        }
     }
 
     public static String coerceToCharacter(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Character) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Character.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Character((char) 0)";
-	    } else {
-		char ch = s.charAt(0);
-		// this trick avoids escaping issues
-		return "new Character((char) " + (int) ch + ")";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Character) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Character.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Character((char) 0)";
+            } else {
+                char ch = s.charAt(0);
+                // this trick avoids escaping issues
+                return "new Character((char) " + (int) ch + ")";
+            }
+        }
     }
 
     public static String coerceToPrimitiveDouble(String s,
-						 boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToDouble(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0)
-		return "(double) 0";
-	    else
-		return Double.valueOf(s).toString();
-	}
+                                                 boolean isNamedAttribute) {
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToDouble(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0)
+                return "(double) 0";
+            else
+                return Double.valueOf(s).toString();
+        }
     }
 
     public static String coerceToDouble(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Double) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Double.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Double(0)";
-	    } else {
-		// Detect format error at translation time
-		return "new Double(" + Double.valueOf(s).toString() + ")";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Double) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Double.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Double(0)";
+            } else {
+                // Detect format error at translation time
+                return "new Double(" + Double.valueOf(s).toString() + ")";
+            }
+        }
     }
 
     public static String coerceToPrimitiveFloat(String s,
-						boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToFloat(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0)
-		return "(float) 0";
-	    else
-		return Float.valueOf(s).toString() + "f";
-	}
+                                                boolean isNamedAttribute) {
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToFloat(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0)
+                return "(float) 0";
+            else
+                return Float.valueOf(s).toString() + "f";
+        }
     }
 
     public static String coerceToFloat(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Float) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Float.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Float(0)";
-	    } else {
-		// Detect format error at translation time
-		return "new Float(" + Float.valueOf(s).toString() + "f)";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Float) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Float.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Float(0)";
+            } else {
+                // Detect format error at translation time
+                return "new Float(" + Float.valueOf(s).toString() + "f)";
+            }
+        }
     }
 
     public static String coerceToInt(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToInt(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0)
-		return "0";
-	    else
-		return Integer.valueOf(s).toString();
-	}
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToInt(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0)
+                return "0";
+            else
+                return Integer.valueOf(s).toString();
+        }
     }
 
     public static String coerceToInteger(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Integer) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Integer.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Integer(0)";
-	    } else {
-		// Detect format error at translation time
-		return "new Integer(" + Integer.valueOf(s).toString() + ")";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Integer) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Integer.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Integer(0)";
+            } else {
+                // Detect format error at translation time
+                return "new Integer(" + Integer.valueOf(s).toString() + ")";
+            }
+        }
     }
 
     public static String coerceToPrimitiveShort(String s,
-						boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToShort(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0)
-		return "(short) 0";
-	    else
-		return "((short) " + Short.valueOf(s).toString() + ")";
-	}
+                                                boolean isNamedAttribute) {
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToShort(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0)
+                return "(short) 0";
+            else
+                return "((short) " + Short.valueOf(s).toString() + ")";
+        }
     }
-    
+
     public static String coerceToShort(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Short) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Short.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Short((short) 0)";
-	    } else {
-		// Detect format error at translation time
-		return "new Short(\"" + Short.valueOf(s).toString() + "\")";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Short) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Short.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Short((short) 0)";
+            } else {
+                // Detect format error at translation time
+                return "new Short(\"" + Short.valueOf(s).toString() + "\")";
+            }
+        }
     }
-    
+
     public static String coerceToPrimitiveLong(String s,
-					       boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToLong(" + s + ")";
-	} else {
-	    if (s == null || s.length() == 0)
-		return "(long) 0";
-	    else
-		return Long.valueOf(s).toString() + "l";
-	}
+                                               boolean isNamedAttribute) {
+        if (isNamedAttribute) {
+            return "org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerceToLong(" + s + ")";
+        } else {
+            if (s == null || s.length() == 0)
+                return "(long) 0";
+            else
+                return Long.valueOf(s).toString() + "l";
+        }
     }
 
     public static String coerceToLong(String s, boolean isNamedAttribute) {
-	if (isNamedAttribute) {
-	    return "(Long) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Long.class)";
-	} else {
-	    if (s == null || s.length() == 0) {
-		return "new Long(0)";
-	    } else {
-		// Detect format error at translation time
-		return "new Long(" + Long.valueOf(s).toString() + "l)";
-	    }
-	}
+        if (isNamedAttribute) {
+            return "(Long) org.apache.struts2.jasper.runtime.JspRuntimeLibrary.coerce(" + s + ", Long.class)";
+        } else {
+            if (s == null || s.length() == 0) {
+                return "new Long(0)";
+            } else {
+                // Detect format error at translation time
+                return "new Long(" + Long.valueOf(s).toString() + "l)";
+            }
+        }
     }
 
     public static InputStream getInputStream(String fname, JarFile jarFile,
-					     JspCompilationContext ctxt,
-					     ErrorDispatcher err)
-		throws JasperException, IOException {
+                                             JspCompilationContext ctxt,
+                                             ErrorDispatcher err)
+            throws JasperException, IOException {
 
         InputStream in = null;
 
-	if (jarFile != null) {
-	    String jarEntryName = fname.substring(1, fname.length());
-	    ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
-	    if (jarEntry == null) {
-		err.jspError("jsp.error.file.not.found", fname);
-	    }
-	    in = jarFile.getInputStream(jarEntry);
-	} else {
-	    in = ctxt.getResourceAsStream(fname);
-	}
+        if (jarFile != null) {
+            String jarEntryName = fname.substring(1, fname.length());
+            ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
+            if (jarEntry == null) {
+                err.jspError("jsp.error.file.not.found", fname);
+            }
+            in = jarFile.getInputStream(jarEntry);
+        } else {
+            in = ctxt.getResourceAsStream(fname);
+        }
 
-	if (in == null) {
-	    err.jspError("jsp.error.file.not.found", fname);
-	}
+        if (in == null) {
+            err.jspError("jsp.error.file.not.found", fname);
+        }
 
-	return in;
+        return in;
     }
 
     /**
@@ -842,19 +840,18 @@
      * the given tag file path.
      *
      * @param path Tag file path
-     * @param err Error dispatcher
-     *
-     * @return Fully-qualified class name of the tag handler corresponding to 
-     * the given tag file path
+     * @param err  Error dispatcher
+     * @return Fully-qualified class name of the tag handler corresponding to
+     *         the given tag file path
      */
     public static String getTagHandlerClassName(String path,
-						ErrorDispatcher err)
-                throws JasperException {
+                                                ErrorDispatcher err)
+            throws JasperException {
 
         String className = null;
         int begin = 0;
         int index;
-        
+
         index = path.lastIndexOf(".tag");
         if (index == -1) {
             err.jspError("jsp.error.tagfile.badSuffix", path);
@@ -875,29 +872,28 @@
             className = "org.apache.jsp.tag.web.";
             begin = index + WEB_INF_TAGS.length();
         } else {
-	    index = path.indexOf(META_INF_TAGS);
-	    if (index != -1) {
-		className = "org.apache.jsp.tag.meta.";
-		begin = index + META_INF_TAGS.length();
-	    } else {
-		err.jspError("jsp.error.tagfile.illegalPath", path);
-	    }
-	}
+            index = path.indexOf(META_INF_TAGS);
+            if (index != -1) {
+                className = "org.apache.jsp.tag.meta.";
+                begin = index + META_INF_TAGS.length();
+            } else {
+                err.jspError("jsp.error.tagfile.illegalPath", path);
+            }
+        }
 
         className += makeJavaPackage(path.substring(begin));
-  
-       return className;
+
+        return className;
     }
 
     /**
      * Converts the given path to a Java package or fully-qualified class name
      *
      * @param path Path to convert
-     *
      * @return Java package corresponding to the given path
      */
     public static final String makeJavaPackage(String path) {
-        String classNameComponents[] = split(path,"/");
+        String classNameComponents[] = split(path, "/");
         StringBuffer legalClassNames = new StringBuffer();
         for (int i = 0; i < classNameComponents.length; i++) {
             legalClassNames.append(makeJavaIdentifier(classNameComponents[i]));
@@ -910,42 +906,42 @@
 
     /**
      * Splits a string into it's components.
+     *
      * @param path String to split
-     * @param pat Pattern to split at
+     * @param pat  Pattern to split at
      * @return the components of the path
      */
-    private static final String [] split(String path, String pat) {
+    private static final String[] split(String path, String pat) {
         Vector comps = new Vector();
         int pos = path.indexOf(pat);
         int start = 0;
-        while( pos >= 0 ) {
-            if(pos > start ) {
-                String comp = path.substring(start,pos);
+        while (pos >= 0) {
+            if (pos > start) {
+                String comp = path.substring(start, pos);
                 comps.add(comp);
             }
             start = pos + pat.length();
-            pos = path.indexOf(pat,start);
+            pos = path.indexOf(pat, start);
         }
-        if( start < path.length()) {
+        if (start < path.length()) {
             comps.add(path.substring(start));
         }
-        String [] result = new String[comps.size()];
-        for(int i=0; i < comps.size(); i++) {
-            result[i] = (String)comps.elementAt(i);
+        String[] result = new String[comps.size()];
+        for (int i = 0; i < comps.size(); i++) {
+            result[i] = (String) comps.elementAt(i);
         }
         return result;
     }
-            
+
     /**
      * Converts the given identifier to a legal Java identifier
      *
      * @param identifier Identifier to convert
-     *
      * @return Legal Java identifier corresponding to the given identifier
      */
     public static final String makeJavaIdentifier(String identifier) {
-        StringBuffer modifiedIdentifier = 
-            new StringBuffer(identifier.length());
+        StringBuffer modifiedIdentifier =
+                new StringBuffer(identifier.length());
         if (!Character.isJavaIdentifierStart(identifier.charAt(0))) {
             modifiedIdentifier.append('_');
         }
@@ -964,7 +960,7 @@
         }
         return modifiedIdentifier.toString();
     }
-    
+
     /**
      * Mangle the specified character to create a legal Java class name.
      */
@@ -985,13 +981,13 @@
         int i = 0;
         int j = javaKeywords.length;
         while (i < j) {
-            int k = (i+j)/2;
+            int k = (i + j) / 2;
             int result = javaKeywords[k].compareTo(key);
             if (result == 0) {
                 return true;
             }
             if (result < 0) {
-                i = k+1;
+                i = k + 1;
             } else {
                 j = k;
             }
@@ -1007,7 +1003,6 @@
      * so that we don't have to worry about it being a Java key word.
      *
      * @param name Identifier to convert
-     *
      * @return Legal Java identifier corresponding to the given identifier
      */
     public static final String makeXmlJavaIdentifier(String name) {
@@ -1021,21 +1016,21 @@
     }
 
     static InputStreamReader getReader(String fname, String encoding,
-				       JarFile jarFile,
-				       JspCompilationContext ctxt,
-				       ErrorDispatcher err)
-		throws JasperException, IOException {
+                                       JarFile jarFile,
+                                       JspCompilationContext ctxt,
+                                       ErrorDispatcher err)
+            throws JasperException, IOException {
 
         InputStreamReader reader = null;
-	InputStream in = getInputStream(fname, jarFile, ctxt, err);
+        InputStream in = getInputStream(fname, jarFile, ctxt, err);
 
-	try {
+        try {
             reader = new InputStreamReader(in, encoding);
-	} catch (UnsupportedEncodingException ex) {
-	    err.jspError("jsp.error.unsupported.encoding", encoding);
-	}
+        } catch (UnsupportedEncodingException ex) {
+            err.jspError("jsp.error.unsupported.encoding", encoding);
+        }
 
-	return reader;
+        return reader;
     }
 
     /**
@@ -1045,43 +1040,62 @@
      */
     public static String toJavaSourceType(String type) {
 
-	if (type.charAt(0) != '[') {
-	    return type;
- 	}
+        if (type.charAt(0) != '[') {
+            return type;
+        }
 
-	int dims = 1;
-	String t = null;
-	for (int i = 1; i < type.length(); i++) {
-	    if (type.charAt(i) == '[') {
-		dims++;
-	    } else {
-		switch (type.charAt(i)) {
-		case 'Z': t = "boolean"; break;
-		case 'B': t = "byte"; break;
-		case 'C': t = "char"; break;
-		case 'D': t = "double"; break;
-		case 'F': t = "float"; break;
-		case 'I': t = "int"; break;
-		case 'J': t = "long"; break;
-		case 'S': t = "short"; break;
-		case 'L': t = type.substring(i+1, type.indexOf(';')); break;
-		}
-		break;
-	    }
-	}
-	StringBuffer resultType = new StringBuffer(t);
-	for (; dims > 0; dims--) {
-	    resultType.append("[]");
-	}
-	return resultType.toString();
+        int dims = 1;
+        String t = null;
+        for (int i = 1; i < type.length(); i++) {
+            if (type.charAt(i) == '[') {
+                dims++;
+            } else {
+                switch (type.charAt(i)) {
+                    case 'Z':
+                        t = "boolean";
+                        break;
+                    case 'B':
+                        t = "byte";
+                        break;
+                    case 'C':
+                        t = "char";
+                        break;
+                    case 'D':
+                        t = "double";
+                        break;
+                    case 'F':
+                        t = "float";
+                        break;
+                    case 'I':
+                        t = "int";
+                        break;
+                    case 'J':
+                        t = "long";
+                        break;
+                    case 'S':
+                        t = "short";
+                        break;
+                    case 'L':
+                        t = type.substring(i + 1, type.indexOf(';'));
+                        break;
+                }
+                break;
+            }
+        }
+        StringBuffer resultType = new StringBuffer(t);
+        for (; dims > 0; dims--) {
+            resultType.append("[]");
+        }
+        return resultType.toString();
     }
 
     /**
      * Compute the canonical name from a Class instance.  Note that a
      * simple replacment of '$' with '.' of a binary name would not work,
      * as '$' is a legal Java Identifier character.
+     *
      * @param c A instance of java.lang.Class
-     * @return  The canonical name of c.
+     * @return The canonical name of c.
      */
     public static String getCanonicalName(Class c) {
 
@@ -1096,7 +1110,7 @@
         do {
             buf.setCharAt(c.getName().length(), '.');
             c = c.getDeclaringClass();
-        } while ( c != null);
+        } while (c != null);
 
         return buf.toString();
     }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Localizer.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Localizer.java
index ddb4245..fefa11a 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Localizer.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Localizer.java
@@ -30,11 +30,11 @@
 public class Localizer {
 
     private static ResourceBundle bundle = null;
-    
+
     static {
         try {
-        bundle = ResourceBundle.getBundle(
-            "org.apache.struts2.jasper.resources.LocalStrings");
+            bundle = ResourceBundle.getBundle(
+                    "org.apache.struts2.jasper.resources.LocalStrings");
         } catch (Throwable t) {
             t.printStackTrace();
         }
@@ -52,12 +52,12 @@
      * @return Localized error message
      */
     public static String getMessage(String errCode) {
-	String errMsg = errCode;
-	try {
-	    errMsg = bundle.getString(errCode);
-	} catch (MissingResourceException e) {
-	}
-	return errMsg;
+        String errMsg = errCode;
+        try {
+            errMsg = bundle.getString(errCode);
+        } catch (MissingResourceException e) {
+        }
+        return errMsg;
     }
 
     /* 
@@ -73,7 +73,7 @@
      * @return Localized error message
      */
     public static String getMessage(String errCode, String arg) {
-	return getMessage(errCode, new Object[] {arg});
+        return getMessage(errCode, new Object[]{arg});
     }
 
     /* 
@@ -90,26 +90,26 @@
      * @return Localized error message
      */
     public static String getMessage(String errCode, String arg1, String arg2) {
-	return getMessage(errCode, new Object[] {arg1, arg2});
+        return getMessage(errCode, new Object[]{arg1, arg2});
     }
-    
+
     /* 
-     * Returns the localized error message corresponding to the given error
-     * code.
-     *
-     * If the given error code is not defined in the resource bundle for
-     * localized error messages, it is used as the error message.
-     *
-     * @param errCode Error code to localize
-     * @param arg1 First argument for parametric replacement
-     * @param arg2 Second argument for parametric replacement
-     * @param arg3 Third argument for parametric replacement
-     *
-     * @return Localized error message
-     */
+    * Returns the localized error message corresponding to the given error
+    * code.
+    *
+    * If the given error code is not defined in the resource bundle for
+    * localized error messages, it is used as the error message.
+    *
+    * @param errCode Error code to localize
+    * @param arg1 First argument for parametric replacement
+    * @param arg2 Second argument for parametric replacement
+    * @param arg3 Third argument for parametric replacement
+    *
+    * @return Localized error message
+    */
     public static String getMessage(String errCode, String arg1, String arg2,
-				    String arg3) {
-	return getMessage(errCode, new Object[] {arg1, arg2, arg3});
+                                    String arg3) {
+        return getMessage(errCode, new Object[]{arg1, arg2, arg3});
     }
 
     /* 
@@ -128,8 +128,8 @@
      * @return Localized error message
      */
     public static String getMessage(String errCode, String arg1, String arg2,
-				    String arg3, String arg4) {
-	return getMessage(errCode, new Object[] {arg1, arg2, arg3, arg4});
+                                    String arg3, String arg4) {
+        return getMessage(errCode, new Object[]{arg1, arg2, arg3, arg4});
     }
 
     /*
@@ -145,16 +145,16 @@
      * @return Localized error message
      */
     public static String getMessage(String errCode, Object[] args) {
-	String errMsg = errCode;
-	try {
-	    errMsg = bundle.getString(errCode);
-	    if (args != null) {
-		MessageFormat formatter = new MessageFormat(errMsg);
-		errMsg = formatter.format(args);
-	    }
-	} catch (MissingResourceException e) {
-	}
-	
-	return errMsg;
+        String errMsg = errCode;
+        try {
+            errMsg = bundle.getString(errCode);
+            if (args != null) {
+                MessageFormat formatter = new MessageFormat(errMsg);
+                errMsg = formatter.format(args);
+            }
+        } catch (MissingResourceException e) {
+        }
+
+        return errMsg;
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Mark.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Mark.java
index 64ce615..c94adb7 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Mark.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Mark.java
@@ -23,7 +23,7 @@
 import java.util.Stack;
 
 /**
- * Mark represents a point in the JSP input. 
+ * Mark represents a point in the JSP input.
  *
  * @author Anil K. Vijendran
  */
@@ -61,11 +61,11 @@
     /**
      * Constructor
      *
-     * @param reader JspReader this mark belongs to
-     * @param inStream current stream for this mark
-     * @param fileId id of requested jsp file
-     * @param name JSP file name
-     * @param inBaseDir base directory of requested jsp file
+     * @param reader     JspReader this mark belongs to
+     * @param inStream   current stream for this mark
+     * @param fileId     id of requested jsp file
+     * @param name       JSP file name
+     * @param inBaseDir  base directory of requested jsp file
      * @param inEncoding encoding of current file
      */
     Mark(JspReader reader, char[] inStream, int fileId, String name,
@@ -103,15 +103,15 @@
 
         // clone includeStack without cloning contents
         includeStack = new Stack();
-        for ( int i=0; i < other.includeStack.size(); i++ ) {
-            includeStack.addElement( other.includeStack.elementAt(i) );
+        for (int i = 0; i < other.includeStack.size(); i++) {
+            includeStack.addElement(other.includeStack.elementAt(i));
         }
     }
 
 
     /**
      * Constructor
-     */    
+     */
     Mark(JspCompilationContext ctxt, String filename, int line, int col) {
 
         this.reader = null;
@@ -132,18 +132,17 @@
      * Sets this mark's state to a new stream.
      * It will store the current stream in it's includeStack.
      *
-     * @param inStream new stream for mark
-     * @param inFileId id of new file from which stream comes from
-     * @param inBaseDir directory of file
+     * @param inStream   new stream for mark
+     * @param inFileId   id of new file from which stream comes from
+     * @param inBaseDir  directory of file
      * @param inEncoding encoding of new file
      */
     public void pushStream(char[] inStream, int inFileId, String name,
-                           String inBaseDir, String inEncoding) 
-    {
+                           String inBaseDir, String inEncoding) {
         // store current state in stack
         includeStack.push(new IncludeState(cursor, line, col, fileId,
-                                           fileName, baseDir, 
-					   encoding, stream) );
+                fileName, baseDir,
+                encoding, stream));
 
         // set new variables
         cursor = 0;
@@ -159,17 +158,18 @@
 
     /**
      * Restores this mark's state to a previously stored stream.
+     *
      * @return The previous Mark instance when the stream was pushed, or null
-     * if there is no previous stream
+     *         if there is no previous stream
      */
     public Mark popStream() {
         // make sure we have something to pop
-        if ( includeStack.size() <= 0 ) {
+        if (includeStack.size() <= 0) {
             return null;
         }
 
         // get previous state in stack
-        IncludeState state = (IncludeState) includeStack.pop( );
+        IncludeState state = (IncludeState) includeStack.pop();
 
         // set new variables
         cursor = state.cursor;
@@ -202,7 +202,7 @@
     }
 
     public String toString() {
-	return getFile()+"("+line+","+col+")";
+        return getFile() + "(" + line + "," + col + ")";
     }
 
     public String getFile() {
@@ -213,30 +213,29 @@
      * Gets the URL of the resource with which this Mark is associated
      *
      * @return URL of the resource with which this Mark is associated
-     *
-     * @exception MalformedURLException if the resource pathname is incorrect
+     * @throws MalformedURLException if the resource pathname is incorrect
      */
     public URL getURL() throws MalformedURLException {
         return ctxt.getResource(getFile());
     }
 
     public String toShortString() {
-        return "("+line+","+col+")";
+        return "(" + line + "," + col + ")";
     }
 
     public boolean equals(Object other) {
-	if (other instanceof Mark) {
-	    Mark m = (Mark) other;
-	    return this.reader == m.reader && this.fileId == m.fileId 
-		&& this.cursor == m.cursor && this.line == m.line 
-		&& this.col == m.col;
-	} 
-	return false;
+        if (other instanceof Mark) {
+            Mark m = (Mark) other;
+            return this.reader == m.reader && this.fileId == m.fileId
+                    && this.cursor == m.cursor && this.line == m.line
+                    && this.col == m.col;
+        }
+        return false;
     }
 
     /**
      * @return true if this Mark is greather than the <code>other</code>
-     * Mark, false otherwise.
+     *         Mark, false otherwise.
      */
     public boolean isGreater(Mark other) {
 
@@ -265,7 +264,7 @@
         String encoding;
         char[] stream = null;
 
-        IncludeState(int inCursor, int inLine, int inCol, int inFileId, 
+        IncludeState(int inCursor, int inLine, int inCol, int inFileId,
                      String name, String inBaseDir, String inEncoding,
                      char[] inStream) {
             cursor = inCursor;
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Node.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Node.java
index 544120c..61f6654 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Node.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Node.java
@@ -40,8 +40,8 @@
 
 abstract class Node implements TagConstants {
 
-    private static final VariableInfo[] ZERO_VARIABLE_INFO = { };
-    
+    private static final VariableInfo[] ZERO_VARIABLE_INFO = {};
+
     protected Attributes attrs;
 
     // xmlns attributes that represent tag libraries (only in XML syntax)
@@ -82,7 +82,7 @@
     /**
      * Constructor.
      *
-     * @param start The location of the jsp page
+     * @param start  The location of the jsp page
      * @param parent The enclosing node
      */
     public Node(Mark start, Node parent) {
@@ -94,10 +94,10 @@
     /**
      * Constructor.
      *
-     * @param qName The action's qualified name
+     * @param qName     The action's qualified name
      * @param localName The action's local name
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     * @param start     The location of the jsp page
+     * @param parent    The enclosing node
      */
     public Node(String qName, String localName, Mark start, Node parent) {
         this.qName = qName;
@@ -110,11 +110,11 @@
     /**
      * Constructor for Nodes parsed from standard syntax.
      *
-     * @param qName The action's qualified name
+     * @param qName     The action's qualified name
      * @param localName The action's local name
-     * @param attrs The attributes for this node
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     * @param attrs     The attributes for this node
+     * @param start     The location of the jsp page
+     * @param parent    The enclosing node
      */
     public Node(String qName, String localName, Attributes attrs, Mark start,
                 Node parent) {
@@ -129,16 +129,16 @@
     /**
      * Constructor for Nodes parsed from XML syntax.
      *
-     * @param qName The action's qualified name
-     * @param localName The action's local name
-     * @param attrs The action's attributes whose name does not start with
-     * xmlns
+     * @param qName               The action's qualified name
+     * @param localName           The action's local name
+     * @param attrs               The action's attributes whose name does not start with
+     *                            xmlns
      * @param nonTaglibXmlnsAttrs The action's xmlns attributes that do not
-     * represent tag libraries
-     * @param taglibAttrs The action's xmlns attributes that represent tag
-     * libraries
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     *                            represent tag libraries
+     * @param taglibAttrs         The action's xmlns attributes that represent tag
+     *                            libraries
+     * @param start               The location of the jsp page
+     * @param parent              The enclosing node
      */
     public Node(String qName, String localName, Attributes attrs,
                 Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
@@ -219,7 +219,7 @@
 
     /**
      * Get the attribute that is non request time expression, either
-     * from the attribute of the node, or from a jsp:attrbute 
+     * from the attribute of the node, or from a jsp:attrbute
      */
     public String getTextAttribute(String name) {
 
@@ -240,18 +240,18 @@
      * Searches all subnodes of this node for jsp:attribute standard
      * actions with the given name, and returns the NamedAttribute node
      * of the matching named attribute, nor null if no such node is found.
-     * <p>
+     * <p/>
      * This should always be called and only be called for nodes that
      * accept dynamic runtime attribute expressions.
      */
-    public NamedAttribute getNamedAttributeNode( String name ) {
+    public NamedAttribute getNamedAttributeNode(String name) {
         NamedAttribute result = null;
-        
+
         // Look for the attribute in NamedAttribute children
         Nodes nodes = getNamedAttributeNodes();
         int numChildNodes = nodes.size();
-        for( int i = 0; i < numChildNodes; i++ ) {
-            NamedAttribute na = (NamedAttribute)nodes.getNode( i );
+        for (int i = 0; i < numChildNodes; i++) {
+            NamedAttribute na = (NamedAttribute) nodes.getNode(i);
             boolean found = false;
             int index = name.indexOf(':');
             if (index != -1) {
@@ -265,7 +265,7 @@
                 break;
             }
         }
-        
+
         return result;
     }
 
@@ -274,7 +274,7 @@
      * actions, and returns that set of nodes as a Node.Nodes object.
      *
      * @return Possibly empty Node.Nodes object containing any jsp:attribute
-     * subnodes of this Node
+     *         subnodes of this Node
      */
     public Node.Nodes getNamedAttributeNodes() {
 
@@ -283,17 +283,16 @@
         }
 
         Node.Nodes result = new Node.Nodes();
-        
+
         // Look for the attribute in NamedAttribute children
         Nodes nodes = getBody();
-        if( nodes != null ) {
+        if (nodes != null) {
             int numChildNodes = nodes.size();
-            for( int i = 0; i < numChildNodes; i++ ) {
-                Node n = nodes.getNode( i );
-                if( n instanceof NamedAttribute ) {
-                    result.add( n );
-                }
-                else if (! (n instanceof Comment)) {
+            for (int i = 0; i < numChildNodes; i++) {
+                Node n = nodes.getNode(i);
+                if (n instanceof NamedAttribute) {
+                    result.add(n);
+                } else if (!(n instanceof Comment)) {
                     // Nothing can come before jsp:attribute, and only
                     // jsp:body can come after it.
                     break;
@@ -304,7 +303,7 @@
         namedAttributeNodes = result;
         return result;
     }
-    
+
     public Nodes getBody() {
         return body;
     }
@@ -364,6 +363,7 @@
     /**
      * Selects and invokes a method in the visitor class based on the node
      * type.  This is abstract and should be overrode by the extending classes.
+     *
      * @param v The visitor class
      */
     abstract void accept(Visitor v) throws JasperException;
@@ -375,6 +375,7 @@
     /*
      * Adds this Node to the body of the given parent.
      */
+
     private void addToParent(Node parent) {
         if (parent != null) {
             this.parent = parent;
@@ -391,7 +392,7 @@
     /*********************************************************************
      * Child classes
      */
-    
+
     /**
      * Represents the root of a Jsp page or Jsp document
      */
@@ -402,7 +403,7 @@
 
         // Source encoding of the page containing this Root
         private String pageEnc;
-        
+
         // Page encoding specified in JSP config element
         private String jspConfigPageEnc;
 
@@ -481,7 +482,7 @@
         public boolean isDefaultPageEncoding() {
             return isDefaultPageEncoding;
         }
-        
+
         public void setIsEncodingSpecifiedInProlog(boolean isSpecified) {
             isEncodingSpecifiedInProlog = isSpecified;
         }
@@ -492,13 +493,13 @@
 
         /**
          * @return The enclosing root to this Root. Usually represents the
-         * page that includes this one.
+         *         page that includes this one.
          */
         public Root getParentRoot() {
             return parentRoot;
         }
     }
-    
+
     /**
      * Represents the root of a Jsp document (XML syntax)
      */
@@ -508,7 +509,7 @@
                        Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
                        Mark start, Node parent) {
             super(qName, ROOT_ACTION, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -531,7 +532,7 @@
                              Attributes nonTaglibXmlnsAttrs,
                              Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, PAGE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
             imports = new Vector();
         }
 
@@ -543,6 +544,7 @@
          * Parses the comma-separated list of class or package names in the
          * given attribute value and adds each component to this
          * PageDirective's vector of imported classes and packages.
+         *
          * @param value A comma-separated string of imports.
          */
         public void addImport(String value) {
@@ -572,7 +574,7 @@
 
         public IncludeDirective(Attributes attrs, Mark start, Node parent) {
             this(JSP_INCLUDE_DIRECTIVE_ACTION, attrs, null, null, start,
-                 parent);
+                    parent);
         }
 
         public IncludeDirective(String qName, Attributes attrs,
@@ -580,7 +582,7 @@
                                 Attributes taglibAttrs, Mark start,
                                 Node parent) {
             super(qName, INCLUDE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -595,7 +597,7 @@
 
         public TaglibDirective(Attributes attrs, Mark start, Node parent) {
             super(JSP_TAGLIB_DIRECTIVE_ACTION, TAGLIB_DIRECTIVE_ACTION, attrs,
-                  start, parent);
+                    start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -617,18 +619,19 @@
                             Attributes nonTaglibXmlnsAttrs,
                             Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, TAG_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
             imports = new Vector();
         }
 
         public void accept(Visitor v) throws JasperException {
             v.visit(this);
         }
- 
+
         /**
          * Parses the comma-separated list of class or package names in the
          * given attribute value and adds each component to this
          * PageDirective's vector of imported classes and packages.
+         *
          * @param value A comma-separated string of imports.
          */
         public void addImport(String value) {
@@ -645,7 +648,7 @@
                 imports.add(value.substring(start).trim());
             }
         }
- 
+
         public List getImports() {
             return imports;
         }
@@ -658,7 +661,7 @@
 
         public AttributeDirective(Attributes attrs, Mark start, Node parent) {
             this(JSP_ATTRIBUTE_DIRECTIVE_ACTION, attrs, null, null, start,
-                 parent);
+                    parent);
         }
 
         public AttributeDirective(String qName, Attributes attrs,
@@ -666,7 +669,7 @@
                                   Attributes taglibAttrs, Mark start,
                                   Node parent) {
             super(qName, ATTRIBUTE_DIRECTIVE_ACTION, attrs,
-                  nonTaglibXmlnsAttrs, taglibAttrs, start, parent);
+                    nonTaglibXmlnsAttrs, taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -681,7 +684,7 @@
 
         public VariableDirective(Attributes attrs, Mark start, Node parent) {
             this(JSP_VARIABLE_DIRECTIVE_ACTION, attrs, null, null, start,
-                 parent);
+                    parent);
         }
 
         public VariableDirective(String qName, Attributes attrs,
@@ -689,7 +692,7 @@
                                  Attributes taglibAttrs,
                                  Mark start, Node parent) {
             super(qName, VARIABLE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -710,7 +713,7 @@
                             Attributes nonTaglibXmlnsAttrs,
                             Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, INVOKE_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -731,7 +734,7 @@
                             Attributes nonTaglibXmlnsAttrs,
                             Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, DOBODY_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -769,7 +772,7 @@
                                 Attributes taglibAttrs, Mark start,
                                 Node parent) {
             super(qName, localName, null, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
         }
 
         /**
@@ -777,13 +780,14 @@
          * was stored as a String in the "text" field, whereas when this node
          * was created from a JSP document, its text was stored as one or more
          * TemplateText nodes in its body. This method handles either case.
+         *
          * @return The text string
          */
         public String getText() {
             String ret = text;
             if ((ret == null) && (body != null)) {
                 StringBuffer buf = new StringBuffer();
-                for (int i=0; i<body.size(); i++) {
+                for (int i = 0; i < body.size(); i++) {
                     buf.append(body.getNode(i).getText());
                 }
                 ret = buf.toString();
@@ -811,14 +815,14 @@
 
         public Declaration(String text, Mark start, Node parent) {
             super(JSP_DECLARATION_ACTION, DECLARATION_ACTION, text, start,
-                  parent);
+                    parent);
         }
 
         public Declaration(String qName, Attributes nonTaglibXmlnsAttrs,
                            Attributes taglibAttrs, Mark start,
                            Node parent) {
             super(qName, DECLARATION_ACTION, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -834,14 +838,14 @@
 
         public Expression(String text, Mark start, Node parent) {
             super(JSP_EXPRESSION_ACTION, EXPRESSION_ACTION, text, start,
-                  parent);
+                    parent);
         }
 
         public Expression(String qName, Attributes nonTaglibXmlnsAttrs,
                           Attributes taglibAttrs, Mark start,
                           Node parent) {
             super(qName, EXPRESSION_ACTION, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -862,7 +866,7 @@
                          Attributes taglibAttrs, Mark start,
                          Node parent) {
             super(qName, SCRIPTLET_ACTION, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -910,7 +914,7 @@
                            Attributes nonTaglibXmlnsAttrs,
                            Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, PARAM_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -940,7 +944,7 @@
                             Attributes taglibAttrs,
                             Mark start, Node parent) {
             super(qName, PARAMS_ACTION, null, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -962,7 +966,7 @@
                               Attributes taglibAttrs, Mark start,
                               Node parent) {
             super(qName, FALLBACK_ACTION, null, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -985,7 +989,7 @@
                              Attributes nonTaglibXmlnsAttrs,
                              Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, INCLUDE_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1016,7 +1020,7 @@
                              Attributes nonTaglibXmlnsAttrs,
                              Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, FORWARD_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1045,7 +1049,7 @@
                            Attributes nonTaglibXmlnsAttrs,
                            Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, GET_PROPERTY_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start,  parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1068,7 +1072,7 @@
                            Attributes nonTaglibXmlnsAttrs,
                            Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, SET_PROPERTY_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1099,7 +1103,7 @@
                        Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
                        Mark start, Node parent) {
             super(qName, USE_BEAN_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1122,7 +1126,7 @@
 
         private JspAttribute width;
         private JspAttribute height;
-        
+
         public PlugIn(Attributes attrs, Mark start, Node parent) {
             this(JSP_PLUGIN_ACTION, attrs, null, null, start, parent);
         }
@@ -1131,7 +1135,7 @@
                       Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
                       Mark start, Node parent) {
             super(qName, PLUGIN_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1168,7 +1172,7 @@
                                 Attributes taglibAttrs,
                                 Mark start, Node parent) {
             super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1183,7 +1187,7 @@
             return jspAttrs;
         }
     }
-    
+
     /**
      * Represents a <jsp:element>.
      */
@@ -1200,7 +1204,7 @@
                           Attributes nonTaglibXmlnsAttrs,
                           Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, ELEMENT_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1240,7 +1244,7 @@
                          Attributes taglibAttrs,
                          Mark start, Node parent) {
             super(qName, OUTPUT_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1250,12 +1254,12 @@
 
     /**
      * Collected information about child elements.  Used by nodes like
-     * CustomTag, JspBody, and NamedAttribute.  The information is 
+     * CustomTag, JspBody, and NamedAttribute.  The information is
      * set in the Collector.
      */
     public static class ChildInfo {
         private boolean scriptless;        // true if the tag and its body
-                                        // contain no scripting elements.
+        // contain no scripting elements.
         private boolean hasUseBean;
         private boolean hasIncludeAction;
         private boolean hasParamAction;
@@ -1301,7 +1305,7 @@
         public boolean hasSetProperty() {
             return hasSetProperty;
         }
-        
+
         public void setHasScriptingVars(boolean s) {
             hasScriptingVars = s;
         }
@@ -1357,7 +1361,7 @@
                          String uri, Attributes attrs, Mark start, Node parent,
                          TagInfo tagInfo, Class tagHandlerClass) {
             this(qName, prefix, localName, uri, attrs, null, null, start,
-                 parent, tagInfo, tagHandlerClass);
+                    parent, tagInfo, tagHandlerClass);
         }
 
         /*
@@ -1370,7 +1374,7 @@
                          Mark start, Node parent, TagInfo tagInfo,
                          Class tagHandlerClass) {
             super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
 
             this.uri = uri;
             this.prefix = prefix;
@@ -1379,16 +1383,16 @@
             this.customNestingLevel = makeCustomNestingLevel();
             this.childInfo = new ChildInfo();
 
-            this.implementsIterationTag = 
-                IterationTag.class.isAssignableFrom(tagHandlerClass);
+            this.implementsIterationTag =
+                    IterationTag.class.isAssignableFrom(tagHandlerClass);
             this.implementsBodyTag =
-                BodyTag.class.isAssignableFrom(tagHandlerClass);
-            this.implementsTryCatchFinally = 
-                TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
-            this.implementsSimpleTag = 
-                SimpleTag.class.isAssignableFrom(tagHandlerClass);
-            this.implementsDynamicAttributes = 
-                DynamicAttributes.class.isAssignableFrom(tagHandlerClass);
+                    BodyTag.class.isAssignableFrom(tagHandlerClass);
+            this.implementsTryCatchFinally =
+                    TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
+            this.implementsSimpleTag =
+                    SimpleTag.class.isAssignableFrom(tagHandlerClass);
+            this.implementsDynamicAttributes =
+                    DynamicAttributes.class.isAssignableFrom(tagHandlerClass);
         }
 
         /*
@@ -1398,7 +1402,7 @@
                          String uri, Attributes attrs, Mark start, Node parent,
                          TagFileInfo tagFileInfo) {
             this(qName, prefix, localName, uri, attrs, null, null, start,
-                 parent, tagFileInfo);
+                    parent, tagFileInfo);
         }
 
         /*
@@ -1411,7 +1415,7 @@
                          Mark start, Node parent, TagFileInfo tagFileInfo) {
 
             super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
 
             this.uri = uri;
             this.prefix = prefix;
@@ -1452,11 +1456,11 @@
         public JspAttribute[] getJspAttributes() {
             return jspAttrs;
         }
-        
+
         public ChildInfo getChildInfo() {
             return childInfo;
         }
-        
+
         public void setTagData(TagData tagData) {
             this.tagData = tagData;
             this.varInfos = tagInfo.getVariableInfo(tagData);
@@ -1523,8 +1527,8 @@
 
         public TagVariableInfo[] getTagVariableInfos() {
             return tagInfo.getTagVariableInfos();
-         }
- 
+        }
+
         public VariableInfo[] getVariableInfos() {
             return varInfos;
         }
@@ -1547,15 +1551,15 @@
 
         public void setScriptingVars(Vector vec, int scope) {
             switch (scope) {
-            case VariableInfo.AT_BEGIN:
-                this.atBeginScriptingVars = vec;
-                break;
-            case VariableInfo.AT_END:
-                this.atEndScriptingVars = vec;
-                break;
-            case VariableInfo.NESTED:
-                this.nestedScriptingVars = vec;
-                break;
+                case VariableInfo.AT_BEGIN:
+                    this.atBeginScriptingVars = vec;
+                    break;
+                case VariableInfo.AT_END:
+                    this.atEndScriptingVars = vec;
+                    break;
+                case VariableInfo.NESTED:
+                    this.nestedScriptingVars = vec;
+                    break;
             }
         }
 
@@ -1567,15 +1571,15 @@
             Vector vec = null;
 
             switch (scope) {
-            case VariableInfo.AT_BEGIN:
-                vec = this.atBeginScriptingVars;
-                break;
-            case VariableInfo.AT_END:
-                vec = this.atEndScriptingVars;
-                break;
-            case VariableInfo.NESTED:
-                vec = this.nestedScriptingVars;
-                break;
+                case VariableInfo.AT_BEGIN:
+                    vec = this.atBeginScriptingVars;
+                    break;
+                case VariableInfo.AT_END:
+                    vec = this.atEndScriptingVars;
+                    break;
+                case VariableInfo.NESTED:
+                    vec = this.nestedScriptingVars;
+                    break;
             }
 
             return vec;
@@ -1593,18 +1597,18 @@
          * Checks to see if the attribute of the given name is of type
          * JspFragment.
          */
-        public boolean checkIfAttributeIsJspFragment( String name ) {
+        public boolean checkIfAttributeIsJspFragment(String name) {
             boolean result = false;
 
             TagAttributeInfo[] attributes = tagInfo.getAttributes();
             for (int i = 0; i < attributes.length; i++) {
                 if (attributes[i].getName().equals(name) &&
-                            attributes[i].isFragment()) {
+                        attributes[i].isFragment()) {
                     result = true;
                     break;
                 }
             }
-            
+
             return result;
         }
 
@@ -1631,7 +1635,7 @@
         public Nodes getAtSTag() {
             return atSTag;
         }
-        
+
         public void setAtETag(Nodes eTag) {
             atETag = eTag;
         }
@@ -1639,30 +1643,30 @@
         public Nodes getAtETag() {
             return atETag;
         }
-        
+
         /*
-         * Computes this custom tag's custom nesting level, which corresponds
-         * to the number of times this custom tag is nested inside itself.
-         *
-         * Example:
-         * 
-         *  <g:h>
-         *    <a:b> -- nesting level 0
-         *      <c:d>
-         *        <e:f>
-         *          <a:b> -- nesting level 1
-         *            <a:b> -- nesting level 2
-         *            </a:b>
-         *          </a:b>
-         *          <a:b> -- nesting level 1
-         *          </a:b>
-         *        </e:f>
-         *      </c:d>
-         *    </a:b>
-         *  </g:h>
-         * 
-         * @return Custom tag's nesting level
-         */
+        * Computes this custom tag's custom nesting level, which corresponds
+        * to the number of times this custom tag is nested inside itself.
+        *
+        * Example:
+        *
+        *  <g:h>
+        *    <a:b> -- nesting level 0
+        *      <c:d>
+        *        <e:f>
+        *          <a:b> -- nesting level 1
+        *            <a:b> -- nesting level 2
+        *            </a:b>
+        *          </a:b>
+        *          <a:b> -- nesting level 1
+        *          </a:b>
+        *        </e:f>
+        *      </c:d>
+        *    </a:b>
+        *  </g:h>
+        *
+        * @return Custom tag's nesting level
+        */
         private int makeCustomNestingLevel() {
             int n = 0;
             Node p = parent;
@@ -1679,33 +1683,33 @@
         /**
          * Returns true if this custom action has an empty body, and false
          * otherwise.
-         *
-         * A custom action is considered to have an empty body if the 
+         * <p/>
+         * A custom action is considered to have an empty body if the
          * following holds true:
          * - getBody() returns null, or
          * - all immediate children are jsp:attribute actions, or
          * - the action's jsp:body is empty.
          */
-         public boolean hasEmptyBody() {
-             boolean hasEmptyBody = true;
-             Nodes nodes = getBody();
-             if (nodes != null) {
-                 int numChildNodes = nodes.size();
-                 for (int i=0; i<numChildNodes; i++) {
-                     Node n = nodes.getNode(i);
-                     if (!(n instanceof NamedAttribute)) {
-                         if (n instanceof JspBody) {
-                             hasEmptyBody = (n.getBody() == null);
-                         } else {
-                             hasEmptyBody = false;
-                         }
-                         break;
-                     }
-                 }
-             }
+        public boolean hasEmptyBody() {
+            boolean hasEmptyBody = true;
+            Nodes nodes = getBody();
+            if (nodes != null) {
+                int numChildNodes = nodes.size();
+                for (int i = 0; i < numChildNodes; i++) {
+                    Node n = nodes.getNode(i);
+                    if (!(n instanceof NamedAttribute)) {
+                        if (n instanceof JspBody) {
+                            hasEmptyBody = (n.getBody() == null);
+                        } else {
+                            hasEmptyBody = false;
+                        }
+                        break;
+                    }
+                }
+            }
 
-             return hasEmptyBody;
-         }
+            return hasEmptyBody;
+        }
     }
 
     /**
@@ -1743,7 +1747,7 @@
         public JspText(String qName, Attributes nonTaglibXmlnsAttrs,
                        Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, TEXT_ACTION, null, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
         }
 
         public void accept(Visitor v) throws JasperException {
@@ -1761,7 +1765,7 @@
 
         // True if this node is to be trimmed, or false otherwise
         private boolean trim = true;
-        
+
         private ChildInfo childInfo;
         private String name;
         private String localName;
@@ -1777,8 +1781,8 @@
                               Mark start, Node parent) {
 
             super(qName, ATTRIBUTE_ACTION, attrs, nonTaglibXmlnsAttrs,
-                  taglibAttrs, start, parent);
-            if( "false".equals( this.getAttributeValue( "trim" ) ) ) {
+                    taglibAttrs, start, parent);
+            if ("false".equals(this.getAttributeValue("trim"))) {
                 // (if null or true, leave default of true)
                 trim = false;
             }
@@ -1790,7 +1794,7 @@
                 int index = name.indexOf(':');
                 if (index != -1) {
                     prefix = name.substring(0, index);
-                    localName = name.substring(index+1);
+                    localName = name.substring(index + 1);
                 }
             }
         }
@@ -1810,7 +1814,7 @@
         public String getPrefix() {
             return this.prefix;
         }
-        
+
         public ChildInfo getChildInfo() {
             return this.childInfo;
         }
@@ -1821,7 +1825,7 @@
 
         /**
          * @return A unique temporary variable name to store the result in.
-         *      (this probably could go elsewhere, but it's convenient here)
+         *         (this probably could go elsewhere, but it's convenient here)
          */
         public String getTemporaryVariableName() {
             if (temporaryVariableName == null) {
@@ -1839,10 +1843,11 @@
 
             class AttributeVisitor extends Visitor {
                 String attrValue = null;
+
                 public void visit(TemplateText txt) {
                     attrValue = new String(txt.getText());
                 }
-                
+
                 public String getAttrValue() {
                     return attrValue;
                 }
@@ -1860,7 +1865,7 @@
                 }
                 text = attributeVisitor.getAttrValue();
             }
-            
+
             return text;
         }
     }
@@ -1879,7 +1884,7 @@
         public JspBody(String qName, Attributes nonTaglibXmlnsAttrs,
                        Attributes taglibAttrs, Mark start, Node parent) {
             super(qName, BODY_ACTION, null, nonTaglibXmlnsAttrs, taglibAttrs,
-                  start, parent);
+                    start, parent);
             this.childInfo = new ChildInfo();
         }
 
@@ -1927,7 +1932,7 @@
          */
         public void rtrim() {
             int index = text.length();
-            while( (index > 0) && (text.charAt(index-1) <= ' ') ) {
+            while ((index > 0) && (text.charAt(index - 1) <= ' ')) {
                 index--;
             }
             text = text.substring(0, index);
@@ -1938,7 +1943,7 @@
          */
         public boolean isAllSpace() {
             boolean isAllSpace = true;
-            for (int i=0; i<text.length(); i++) {
+            for (int i = 0; i < text.length(); i++) {
                 if (!Character.isWhitespace(text.charAt(i))) {
                     isAllSpace = false;
                     break;
@@ -1949,9 +1954,10 @@
 
         /**
          * Add a source to Java line mapping
+         *
          * @param srcLine The postion of the source line, relative to the line
-         *        at the start of this node.  The corresponding java line is
-         *        assumed to be consecutive, i.e. one more than the last.
+         *                at the start of this node.  The corresponding java line is
+         *                assumed to be consecutive, i.e. one more than the last.
          */
         public void addSmap(int srcLine) {
             if (extraSmap == null) {
@@ -1971,7 +1977,7 @@
 
     /**
      * Represents attributes that can be request time expressions.
-     *
+     * <p/>
      * Can either be a plain attribute, an attribute that represents a
      * request time expression value, or a named attribute (specified using
      * the jsp:attribute standard action).
@@ -1993,7 +1999,7 @@
         private NamedAttribute namedAttributeNode;
 
         JspAttribute(String qName, String uri, String localName, String value,
-                     boolean expr, ELNode.Nodes el, boolean dyn ) {
+                     boolean expr, ELNode.Nodes el, boolean dyn) {
             this.qName = qName;
             this.uri = uri;
             this.localName = localName;
@@ -2022,22 +2028,22 @@
         }
 
         /**
-          * @return The name of the attribute
+         * @return The name of the attribute
          */
         public String getName() {
             return qName;
         }
 
         /**
-          * @return The local name of the attribute
+         * @return The local name of the attribute
          */
         public String getLocalName() {
             return localName;
         }
 
         /**
-          * @return The namespace of the attribute, or null if in the default
-         * namespace
+         * @return The namespace of the attribute, or null if in the default
+         *         namespace
          */
         public String getURI() {
             return uri;
@@ -2048,7 +2054,7 @@
          *
          * @return the value for the attribute, or the expression string
          *         (stripped of "<%=", "%>", "%=", or "%"
-         *          but containing "${" and "}" for EL expressions)
+         *         but containing "${" and "}" for EL expressions)
          */
         public String getValue() {
             return value;
@@ -2078,10 +2084,8 @@
         }
 
         /**
-         * @return true if the value represents an expression that should
-         * be fed to the expression interpreter
          * @return false for string literals or rtexprvalues that should
-         * not be interpreted or reevaluated
+         *         not be interpreted or reevaluated
          */
         public boolean isELInterpreterInput() {
             return el != null;
@@ -2089,7 +2093,7 @@
 
         /**
          * @return true if the value is a string literal known at translation
-         * time.
+         *         time.
          */
         public boolean isLiteral() {
             return !expression && (el != null) && !namedAttribute;
@@ -2129,6 +2133,7 @@
 
         /**
          * Appends a node to the list
+         *
          * @param n The node to add
          */
         public void add(Node n) {
@@ -2138,6 +2143,7 @@
 
         /**
          * Removes the given node from the list.
+         *
          * @param n The node to be removed
          */
         public void remove(Node n) {
@@ -2146,6 +2152,7 @@
 
         /**
          * Visit the nodes in the list with the supplied visitor
+         *
          * @param v The visitor used
          */
         public void visit(Visitor v) throws JasperException {
@@ -2168,7 +2175,7 @@
             }
             return n;
         }
-        
+
         public Node.Root getRoot() {
             return root;
         }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageDataImpl.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageDataImpl.java
index a3bf2f4..7c13bce 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageDataImpl.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageDataImpl.java
@@ -30,16 +30,16 @@
 /**
  * An implementation of <tt>javax.servlet.jsp.tagext.PageData</tt> which
  * builds the XML view of a given page.
- *
+ * <p/>
  * The XML view is built in two passes:
- *
+ * <p/>
  * During the first pass, the FirstPassVisitor collects the attributes of the
  * top-level jsp:root and those of the jsp:root elements of any included
  * pages, and adds them to the jsp:root element of the XML view.
  * In addition, any taglib directives are converted into xmlns: attributes and
  * added to the jsp:root element of the XML view.
  * This pass ignores any nodes other than JspRoot and TaglibDirective.
- *
+ * <p/>
  * During the second pass, the SecondPassVisitor produces the XML view, using
  * the combined jsp:root attributes determined in the first pass and any
  * remaining pages nodes (this pass ignores any JspRoot and TaglibDirective
@@ -62,18 +62,18 @@
      * @param page the page nodes from which to generate the XML view
      */
     public PageDataImpl(Node.Nodes page, Compiler compiler)
-                throws JasperException {
+            throws JasperException {
 
         // First pass
         FirstPassVisitor firstPass = new FirstPassVisitor(page.getRoot(),
-                                                          compiler.getPageInfo());
+                compiler.getPageInfo());
         page.visit(firstPass);
 
         // Second pass
         buf = new StringBuffer();
         SecondPassVisitor secondPass
-            = new SecondPassVisitor(page.getRoot(), buf, compiler,
-                                    firstPass.getJspIdPrefix());
+                = new SecondPassVisitor(page.getRoot(), buf, compiler,
+                firstPass.getJspIdPrefix());
         page.visit(secondPass);
     }
 
@@ -103,7 +103,7 @@
      * attributes and adds them to the jsp:root element of the XML view.
      */
     static class FirstPassVisitor
-                extends Node.Visitor implements TagConstants {
+            extends Node.Visitor implements TagConstants {
 
         private Node.Root root;
         private AttributesImpl rootAttrs;
@@ -120,7 +120,7 @@
             this.pageInfo = pageInfo;
             this.rootAttrs = new AttributesImpl();
             this.rootAttrs.addAttribute("", "", "version", "CDATA",
-                                        JSP_VERSION);
+                    JSP_VERSION);
             this.jspIdPrefix = "jsp";
         }
 
@@ -136,7 +136,7 @@
                  */
                 if (!JSP_URI.equals(rootAttrs.getValue("xmlns:jsp"))) {
                     rootAttrs.addAttribute("", "", "xmlns:jsp", "CDATA",
-                                           JSP_URI);
+                            JSP_URI);
                 }
 
                 if (pageInfo.isJspPrefixHijacked()) {
@@ -153,7 +153,7 @@
                         jspIdPrefix += "jsp";
                     }
                     rootAttrs.addAttribute("", "", "xmlns:" + jspIdPrefix,
-                                           "CDATA", JSP_URI);
+                            "CDATA", JSP_URI);
                 }
 
                 root.setAttributes(rootAttrs);
@@ -189,11 +189,11 @@
                             location = URN_JSPTLD + location;
                         }
                         rootAttrs.addAttribute("", "", qName, "CDATA",
-                                               location);
+                                location);
                     } else {
                         location = attrs.getValue("tagdir");
                         rootAttrs.addAttribute("", "", qName, "CDATA",
-                                               URN_JSPTAGDIR + location);
+                                URN_JSPTAGDIR + location);
                     }
                 }
             }
@@ -207,19 +207,19 @@
             if (attrs != null) {
                 int len = attrs.getLength();
 
-                for (int i=0; i<len; i++) {
+                for (int i = 0; i < len; i++) {
                     String qName = attrs.getQName(i);
                     if ("version".equals(qName)) {
                         continue;
                     }
 
                     // Bugzilla 35252: http://issues.apache.org/bugzilla/show_bug.cgi?id=35252
-                    if(rootAttrs.getIndex(qName) == -1) {
+                    if (rootAttrs.getIndex(qName) == -1) {
                         rootAttrs.addAttribute(attrs.getURI(i),
-                                               attrs.getLocalName(i),
-                                               qName,
-                                               attrs.getType(i),
-                                               attrs.getValue(i));
+                                attrs.getLocalName(i),
+                                qName,
+                                attrs.getType(i),
+                                attrs.getValue(i));
                     }
                 }
             }
@@ -232,7 +232,7 @@
      * each element a unique jsp:id attribute.
      */
     static class SecondPassVisitor extends Node.Visitor
-                implements TagConstants {
+            implements TagConstants {
 
         private Node.Root root;
         private StringBuffer buf;
@@ -331,7 +331,7 @@
         public void visit(Node.IncludeAction n) throws JasperException {
             appendTag(n);
         }
-    
+
         public void visit(Node.ForwardAction n) throws JasperException {
             appendTag(n);
         }
@@ -359,7 +359,7 @@
         public void visit(Node.UseBean n) throws JasperException {
             appendTag(n);
         }
-        
+
         public void visit(Node.PlugIn n) throws JasperException {
             appendTag(n);
         }
@@ -367,7 +367,7 @@
         public void visit(Node.NamedAttribute n) throws JasperException {
             appendTag(n);
         }
-        
+
         public void visit(Node.JspBody n) throws JasperException {
             appendTag(n);
         }
@@ -407,7 +407,7 @@
         public void visit(Node.VariableDirective n) throws JasperException {
             appendTag(n);
         }
-        
+
         public void visit(Node.TemplateText n) throws JasperException {
             /*
              * If the template text came from a JSP page written in JSP syntax,
@@ -441,7 +441,7 @@
             buf.append(jspId++).append("\"\n");
 
             if (ROOT_ACTION.equals(n.getLocalName()) || body != null
-                        || text != null) {
+                    || text != null) {
                 buf.append(">\n");
                 if (ROOT_ACTION.equals(n.getLocalName())) {
                     if (compiler.getCompilationContext().isTagFile()) {
@@ -479,7 +479,7 @@
             boolean append = false;
             Attributes attrs = n.getAttributes();
             int len = (attrs == null) ? 0 : attrs.getLength();
-            for (int i=0; i<len; i++) {
+            for (int i = 0; i < len; i++) {
                 String attrName = attrs.getQName(i);
                 if (!"pageEncoding".equals(attrName)
                         && !"contentType".equals(attrName)) {
@@ -499,7 +499,7 @@
             buf.append(jspId++).append("\"\n");
 
             // append remaining attributes
-            for (int i=0; i<len; i++) {
+            for (int i = 0; i < len; i++) {
                 String attrName = attrs.getQName(i);
                 if ("import".equals(attrName) || "contentType".equals(attrName)
                         || "pageEncoding".equals(attrName)) {
@@ -553,7 +553,7 @@
             buf.append("  ").append("pageEncoding").append("=\"UTF-8\"\n");
             buf.append("  ").append("contentType").append("=\"");
             buf.append(compiler.getPageInfo().getContentType()).append("\"\n");
-            buf.append("/>\n");            
+            buf.append("/>\n");
         }
 
         /*
@@ -570,7 +570,7 @@
             boolean append = false;
             Attributes attrs = n.getAttributes();
             int len = (attrs == null) ? 0 : attrs.getLength();
-            for (int i=0; i<len; i++) {
+            for (int i = 0; i < len; i++) {
                 String attrName = attrs.getQName(i);
                 if (!"pageEncoding".equals(attrName)) {
                     append = true;
@@ -596,7 +596,7 @@
             buf.append("  ").append(jspIdPrefix).append(":id").append("=\"");
             buf.append(jspId++).append("\"\n");
             buf.append("  ").append("pageEncoding").append("=\"UTF-8\"\n");
-            buf.append("/>\n");            
+            buf.append("/>\n");
         }
 
         private void appendText(String text, boolean createJspTextElement) {
@@ -616,11 +616,11 @@
                 appendCDATA(text);
             }
         }
-        
+
         /*
-         * Appends the given text as a CDATA section to the XML view, unless
-         * the text has already been marked as CDATA.
-         */
+        * Appends the given text as a CDATA section to the XML view, unless
+        * the text has already been marked as CDATA.
+        */
         private void appendCDATA(String text) {
             buf.append(CDATA_START_SECTION);
             buf.append(escapeCDATA(text));
@@ -632,14 +632,14 @@
          * within the given text, so it can be included in a CDATA section.
          */
         private String escapeCDATA(String text) {
-            if( text==null ) return "";
+            if (text == null) return "";
             int len = text.length();
             CharArrayWriter result = new CharArrayWriter(len);
-            for (int i=0; i<len; i++) {
-                if (((i+2) < len)
+            for (int i = 0; i < len; i++) {
+                if (((i + 2) < len)
                         && (text.charAt(i) == ']')
-                        && (text.charAt(i+1) == ']')
-                        && (text.charAt(i+2) == '>')) {
+                        && (text.charAt(i + 1) == ']')
+                        && (text.charAt(i + 2) == '>')) {
                     // match found
                     result.write(']');
                     result.write(']');
@@ -665,7 +665,7 @@
              */
             Attributes attrs = n.getTaglibAttributes();
             int len = (attrs == null) ? 0 : attrs.getLength();
-            for (int i=0; i<len; i++) {
+            for (int i = 0; i < len; i++) {
                 String name = attrs.getQName(i);
                 String value = attrs.getValue(i);
                 buf.append("  ").append(name).append("=\"").append(value).append("\"\n");
@@ -677,7 +677,7 @@
             attrs = n.getNonTaglibXmlnsAttributes();
             len = (attrs == null) ? 0 : attrs.getLength();
             boolean defaultNSSeen = false;
-            for (int i=0; i<len; i++) {
+            for (int i = 0; i < len; i++) {
                 String name = attrs.getQName(i);
                 String value = attrs.getValue(i);
                 buf.append("  ").append(name).append("=\"").append(value).append("\"\n");
@@ -693,7 +693,7 @@
              */
             attrs = n.getAttributes();
             len = (attrs == null) ? 0 : attrs.getLength();
-            for (int i=0; i<len; i++) {
+            for (int i = 0; i < len; i++) {
                 String name = attrs.getQName(i);
                 String value = attrs.getValue(i);
                 buf.append("  ").append(name).append("=\"");
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageInfo.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageInfo.java
index 0d20143..6d0f088 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageInfo.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/PageInfo.java
@@ -47,7 +47,7 @@
     private String session;
     private boolean isSession = true;
     private String bufferValue;
-    private int buffer = 8*1024;    // XXX confirm
+    private int buffer = 8 * 1024;    // XXX confirm
     private String autoFlush;
     private boolean isAutoFlush = true;
     private String isThreadSafeValue;
@@ -93,13 +93,14 @@
         this.prefixes = new HashSet();
 
         // Enter standard imports
-        for(int i = 0; i < Constants.STANDARD_IMPORTS.length; i++)
+        for (int i = 0; i < Constants.STANDARD_IMPORTS.length; i++)
             imports.add(Constants.STANDARD_IMPORTS[i]);
     }
 
     /**
      * Check if the plugin ID has been previously declared.  Make a not
      * that this Id is now declared.
+     *
      * @return true if Id has been declared.
      */
     public boolean isPluginDeclared(String id) {
@@ -127,7 +128,7 @@
 
     public void addDependant(String d) {
         if (!dependants.contains(d) && !jspFile.equals(d))
-                dependants.add(d);
+            dependants.add(d);
     }
 
     public List getDependants() {
@@ -348,9 +349,10 @@
     /*
      * language
      */
+
     public void setLanguage(String value, Node n, ErrorDispatcher err,
-                boolean pagedir)
-        throws JasperException {
+                            boolean pagedir)
+            throws JasperException {
 
         if (!"java".equalsIgnoreCase(value)) {
             if (pagedir)
@@ -391,12 +393,11 @@
      * Gets the value of the 'extends' page directive attribute.
      *
      * @param useDefault TRUE if the default
-     * (org.apache.jasper.runtime.HttpJspBase) should be returned if this
-     * attribute has not been set, FALSE otherwise
-     *
+     *                   (org.apache.jasper.runtime.HttpJspBase) should be returned if this
+     *                   attribute has not been set, FALSE otherwise
      * @return The value of the 'extends' page directive attribute, or the
-     * default (org.apache.jasper.runtime.HttpJspBase) if this attribute has
-     * not been set and useDefault is TRUE
+     *         default (org.apache.jasper.runtime.HttpJspBase) if this attribute has
+     *         not been set and useDefault is TRUE
      */
     public String getExtends(boolean useDefault) {
         return (xtends == null && useDefault ? defaultExtends : xtends);
@@ -406,8 +407,8 @@
      * Gets the value of the 'extends' page directive attribute.
      *
      * @return The value of the 'extends' page directive attribute, or the
-     * default (org.apache.jasper.runtime.HttpJspBase) if this attribute has
-     * not been set
+     *         default (org.apache.jasper.runtime.HttpJspBase) if this attribute has
+     *         not been set
      */
     public String getExtends() {
         return getExtends(true);
@@ -430,7 +431,7 @@
      * buffer
      */
     public void setBufferValue(String value, Node n, ErrorDispatcher err)
-        throws JasperException {
+            throws JasperException {
 
         if ("none".equalsIgnoreCase(value))
             buffer = 0;
@@ -438,7 +439,7 @@
             if (value == null || !value.endsWith("kb"))
                 err.jspError(n, "jsp.error.page.invalid.buffer");
             try {
-                Integer k = new Integer(value.substring(0, value.length()-2));
+                Integer k = new Integer(value.substring(0, value.length() - 2));
                 buffer = k.intValue() * 1024;
             } catch (NumberFormatException e) {
                 err.jspError(n, "jsp.error.page.invalid.buffer");
@@ -461,7 +462,7 @@
      * session
      */
     public void setSession(String value, Node n, ErrorDispatcher err)
-        throws JasperException {
+            throws JasperException {
 
         if ("true".equalsIgnoreCase(value))
             isSession = true;
@@ -486,7 +487,7 @@
      * autoFlush
      */
     public void setAutoFlush(String value, Node n, ErrorDispatcher err)
-        throws JasperException {
+            throws JasperException {
 
         if ("true".equalsIgnoreCase(value))
             isAutoFlush = true;
@@ -511,7 +512,7 @@
      * isThreadSafe
      */
     public void setIsThreadSafe(String value, Node n, ErrorDispatcher err)
-        throws JasperException {
+            throws JasperException {
 
         if ("true".equalsIgnoreCase(value))
             isThreadSafe = true;
@@ -560,7 +561,7 @@
      * isErrorPage
      */
     public void setIsErrorPage(String value, Node n, ErrorDispatcher err)
-        throws JasperException {
+            throws JasperException {
 
         if ("true".equalsIgnoreCase(value))
             isErrorPage = true;
@@ -585,8 +586,8 @@
      * isELIgnored
      */
     public void setIsELIgnored(String value, Node n, ErrorDispatcher err,
-                   boolean pagedir)
-        throws JasperException {
+                               boolean pagedir)
+            throws JasperException {
 
         if ("true".equalsIgnoreCase(value))
             isELIgnored = true;
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Parser.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Parser.java
index 5785426..c972d06 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Parser.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Parser.java
@@ -37,7 +37,7 @@
  * JSP page grammar is included here for reference.  The token '#'
  * that appears in the production indicates the current input token
  * location in the production.
- * 
+ *
  * @author Kin-man Chung
  * @author Shawn Bayern
  * @author Mark Roth
@@ -59,12 +59,12 @@
 
     // Virtual body content types, to make parsing a little easier.
     // These are not accessible from outside the parser.
-    private static final String JAVAX_BODY_CONTENT_PARAM = 
-        "JAVAX_BODY_CONTENT_PARAM";
-    private static final String JAVAX_BODY_CONTENT_PLUGIN = 
-        "JAVAX_BODY_CONTENT_PLUGIN";
-    private static final String JAVAX_BODY_CONTENT_TEMPLATE_TEXT = 
-        "JAVAX_BODY_CONTENT_TEMPLATE_TEXT";
+    private static final String JAVAX_BODY_CONTENT_PARAM =
+            "JAVAX_BODY_CONTENT_PARAM";
+    private static final String JAVAX_BODY_CONTENT_PLUGIN =
+            "JAVAX_BODY_CONTENT_PLUGIN";
+    private static final String JAVAX_BODY_CONTENT_TEMPLATE_TEXT =
+            "JAVAX_BODY_CONTENT_TEMPLATE_TEXT";
 
     private static final boolean STRICT_QUOTE_ESCAPING = Boolean.valueOf(
             System.getProperty(
@@ -91,9 +91,9 @@
 
     /**
      * The main entry for Parser
-     * 
-     * @param pc The ParseController, use for getting other objects in compiler
-     *                 and for parsing included pages
+     *
+     * @param pc     The ParseController, use for getting other objects in compiler
+     *               and for parsing included pages
      * @param reader To read the page
      * @param parent The parent node to this page, null for top level page
      * @return list of nodes representing the parsed page
@@ -107,10 +107,10 @@
                                    String pageEnc,
                                    String jspConfigPageEnc,
                                    boolean isDefaultPageEncoding)
-                throws JasperException {
+            throws JasperException {
 
         Parser parser = new Parser(pc, reader, isTagFile, directivesOnly,
-                                   jarFileUrl);
+                jarFileUrl);
 
         Node.Root root = new Node.Root(reader.mark(), parent, false);
         root.setPageEncoding(pageEnc);
@@ -156,23 +156,23 @@
      */
     public static Attributes parseAttributes(ParserController pc,
                                              JspReader reader)
-                throws JasperException {
+            throws JasperException {
         Parser tmpParser = new Parser(pc, reader, false, false, null);
         return tmpParser.parseAttributes();
     }
 
     /**
      * Attribute ::= Name S? Eq S?
-     *               (   '"<%=' RTAttributeValueDouble
-     *                 | '"' AttributeValueDouble
-     *                 | "'<%=" RTAttributeValueSingle
-     *                 | "'" AttributeValueSingle
-     *               }
+     * (   '"<%=' RTAttributeValueDouble
+     * | '"' AttributeValueDouble
+     * | "'<%=" RTAttributeValueSingle
+     * | "'" AttributeValueSingle
+     * }
      * Note: JSP and XML spec does not allow while spaces around Eq.  It is
      * added to be backward compatible with Tomcat, and with other xml parsers.
      */
     private boolean parseAttribute(AttributesImpl attrs)
-                throws JasperException {
+            throws JasperException {
 
         // Get the qualified name
         String qName = parseName();
@@ -188,25 +188,25 @@
             uri = pageInfo.getURI(prefix);
             if (uri == null) {
                 err.jspError(reader.mark(),
-                             "jsp.error.attribute.invalidPrefix", prefix);
+                        "jsp.error.attribute.invalidPrefix", prefix);
             }
-            localName = qName.substring(index+1);
+            localName = qName.substring(index + 1);
         }
 
-         reader.skipSpaces();
+        reader.skipSpaces();
         if (!reader.matches("="))
             err.jspError(reader.mark(), "jsp.error.attribute.noequal");
 
-         reader.skipSpaces();
+        reader.skipSpaces();
         char quote = (char) reader.nextChar();
         if (quote != '\'' && quote != '"')
             err.jspError(reader.mark(), "jsp.error.attribute.noquote");
 
-         String watchString = "";
+        String watchString = "";
         if (reader.matches("<%="))
             watchString = "%>";
         watchString = watchString + quote;
-        
+
         String attrValue = parseAttributeValue(watchString);
         attrs.addAttribute(uri, localName, qName, "CDATA", attrValue);
         return true;
@@ -216,14 +216,14 @@
      * Name ::= (Letter | '_' | ':') (Letter | Digit | '.' | '_' | '-' | ':')*
      */
     private String parseName() throws JasperException {
-        char ch = (char)reader.peekChar();
+        char ch = (char) reader.peekChar();
         if (Character.isLetter(ch) || ch == '_' || ch == ':') {
             StringBuffer buf = new StringBuffer();
             buf.append(ch);
             reader.nextChar();
-            ch = (char)reader.peekChar();
+            ch = (char) reader.peekChar();
             while (Character.isLetter(ch) || Character.isDigit(ch) ||
-                        ch == '.' || ch == '_' || ch == '-' || ch == ':') {
+                    ch == '.' || ch == '_' || ch == '-' || ch == ':') {
                 buf.append(ch);
                 reader.nextChar();
                 ch = (char) reader.peekChar();
@@ -235,9 +235,9 @@
 
     /**
      * AttributeValueDouble ::= (QuotedChar - '"')*
-     *                                ('"' | <TRANSLATION_ERROR>)
+     * ('"' | <TRANSLATION_ERROR>)
      * RTAttributeValueDouble ::= ((QuotedChar - '"')* - ((QuotedChar-'"')'%>"')
-     *                                  ('%>"' | TRANSLATION_ERROR)
+     * ('%>"' | TRANSLATION_ERROR)
      */
     private String parseAttributeValue(String watch) throws JasperException {
         Mark start = reader.mark();
@@ -258,13 +258,13 @@
 
     /**
      * QuotedChar ::=   '&apos;'
-     *                      | '&quot;'
-     *                | '\\'
-     *                | '\"'
-     *                | "\'"
-     *                | '\>'
-     *                | '\$'
-     *                | Char
+     * | '&quot;'
+     * | '\\'
+     * | '\"'
+     * | "\'"
+     * | '\>'
+     * | '\$'
+     * | Char
      */
     private String parseQuoted(Mark start, String tx, char quote)
             throws JasperException {
@@ -274,22 +274,22 @@
         while (i < size) {
             char ch = tx.charAt(i);
             if (ch == '&') {
-                if (i+5 < size && tx.charAt(i+1) == 'a'
-                        && tx.charAt(i+2) == 'p' && tx.charAt(i+3) == 'o'
-                        && tx.charAt(i+4) == 's' && tx.charAt(i+5) == ';') {
+                if (i + 5 < size && tx.charAt(i + 1) == 'a'
+                        && tx.charAt(i + 2) == 'p' && tx.charAt(i + 3) == 'o'
+                        && tx.charAt(i + 4) == 's' && tx.charAt(i + 5) == ';') {
                     buf.append('\'');
                     i += 6;
-                } else if (i+5 < size && tx.charAt(i+1) == 'q'
-                           && tx.charAt(i+2) == 'u' && tx.charAt(i+3) == 'o'
-                           && tx.charAt(i+4) == 't' && tx.charAt(i+5) == ';') {
+                } else if (i + 5 < size && tx.charAt(i + 1) == 'q'
+                        && tx.charAt(i + 2) == 'u' && tx.charAt(i + 3) == 'o'
+                        && tx.charAt(i + 4) == 't' && tx.charAt(i + 5) == ';') {
                     buf.append('"');
                     i += 6;
                 } else {
                     buf.append(ch);
                     ++i;
                 }
-            } else if (ch == '\\' && i+1 < size) {
-                ch = tx.charAt(i+1);
+            } else if (ch == '\\' && i + 1 < size) {
+                ch = tx.charAt(i + 1);
                 if (ch == '\\' || ch == '\"' || ch == '\'' || ch == '>') {
                     buf.append(ch);
                     i += 2;
@@ -319,8 +319,8 @@
         int i = 0;
         while (i < size) {
             char ch = tx.charAt(i);
-            if (i+2 < size && ch == '%' && tx.charAt(i+1) == '\\'
-                    && tx.charAt(i+2) == '>') {
+            if (i + 2 < size && ch == '%' && tx.charAt(i + 1) == '\\'
+                    && tx.charAt(i + 2) == '>') {
                 cw.write('%');
                 cw.write('>');
                 i += 3;
@@ -336,8 +336,8 @@
     /*
      * Invokes parserController to parse the included page
      */
-    private void processIncludeDirective(String file, Node parent) 
-                throws JasperException {
+    private void processIncludeDirective(String file, Node parent)
+            throws JasperException {
         if (file == null) {
             return;
         }
@@ -388,7 +388,7 @@
      * and include-coda of jsp-config element in web.xml
      */
     private void addInclude(Node parent, List files) throws JasperException {
-        if( files != null ) {
+        if (files != null) {
             Iterator iter = files.iterator();
             while (iter.hasNext()) {
                 String file = (String) iter.next();
@@ -396,8 +396,8 @@
                 attrs.addAttribute("", "file", "file", "CDATA", file);
 
                 // Create a dummy Include directive node
-                Node includeNode = new Node.IncludeDirective(attrs, 
-                    reader.mark(), parent);
+                Node includeNode = new Node.IncludeDirective(attrs,
+                        reader.mark(), parent);
                 processIncludeDirective(file, includeNode);
             }
         }
@@ -416,31 +416,31 @@
             Mark prevMark = pageInfo.getNonCustomTagPrefix(prefix);
             if (prevMark != null) {
                 err.jspError(reader.mark(), "jsp.error.prefix.use_before_dcl",
-                    prefix, prevMark.getFile(), "" + prevMark.getLineNumber());
+                        prefix, prevMark.getFile(), "" + prevMark.getLineNumber());
             }
             if (uri != null) {
                 String uriPrev = pageInfo.getURI(prefix);
                 if (uriPrev != null && !uriPrev.equals(uri)) {
                     err.jspError(reader.mark(), "jsp.error.prefix.refined",
-                        prefix, uri, uriPrev);
+                            prefix, uri, uriPrev);
                 }
                 if (pageInfo.getTaglib(uri) == null) {
-            TagLibraryInfoImpl impl = null;
-            if (ctxt.getOptions().isCaching()) {
-                impl = (TagLibraryInfoImpl) ctxt.getOptions().getCache().get(uri);
-            }
-            if (impl == null) {
-                String[] location = ctxt.getTldLocation(uri);
-                impl = new TagLibraryInfoImpl(ctxt,
-                        parserController,
-                        prefix,
-                        uri,
-                        location,
-                        err);
-                if (ctxt.getOptions().isCaching()) {
-                    ctxt.getOptions().getCache().put(uri, impl);
-                }
-            }
+                    TagLibraryInfoImpl impl = null;
+                    if (ctxt.getOptions().isCaching()) {
+                        impl = (TagLibraryInfoImpl) ctxt.getOptions().getCache().get(uri);
+                    }
+                    if (impl == null) {
+                        String[] location = ctxt.getTldLocation(uri);
+                        impl = new TagLibraryInfoImpl(ctxt,
+                                parserController,
+                                prefix,
+                                uri,
+                                location,
+                                err);
+                        if (ctxt.getOptions().isCaching()) {
+                            ctxt.getOptions().getCache().put(uri, impl);
+                        }
+                    }
                     pageInfo.addTaglib(uri, impl);
                 }
                 pageInfo.addPrefixMapping(prefix, uri);
@@ -450,12 +450,12 @@
                     String urnTagdir = URN_JSPTAGDIR + tagdir;
                     if (pageInfo.getTaglib(urnTagdir) == null) {
                         pageInfo.addTaglib(urnTagdir,
-                                           new ImplicitTagLibraryInfo(
-                                                   ctxt,
-                                                   parserController,
-                                                   prefix, 
-                                                   tagdir,
-                                                   err));
+                                new ImplicitTagLibraryInfo(
+                                        ctxt,
+                                        parserController,
+                                        prefix,
+                                        tagdir,
+                                        err));
                     }
                     pageInfo.addPrefixMapping(prefix, urnTagdir);
                 }
@@ -487,7 +487,7 @@
             directive = "&lt;%@ page";
             if (isTagFile) {
                 err.jspError(reader.mark(), "jsp.error.directive.istagfile",
-                                            directive);
+                        directive);
             }
             parsePageDirective(parent);
         } else if (reader.matches("include")) {
@@ -505,21 +505,21 @@
             directive = "&lt;%@ tag";
             if (!isTagFile) {
                 err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
-                                            directive);
+                        directive);
             }
             parseTagDirective(parent);
         } else if (reader.matches("attribute")) {
             directive = "&lt;%@ attribute";
             if (!isTagFile) {
                 err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
-                                            directive);
+                        directive);
             }
             parseAttributeDirective(parent);
         } else if (reader.matches("variable")) {
             directive = "&lt;%@ variable";
             if (!isTagFile) {
                 err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
-                                            directive);
+                        directive);
             }
             parseVariableDirective(parent);
         } else {
@@ -531,75 +531,74 @@
             err.jspError(start, "jsp.error.unterminated", directive);
         }
     }
-        
+
     /*
-     * Parses a directive with the following syntax:
-     *
-     *   XMLJSPDirectiveBody ::= S? (   ( 'page' PageDirectiveAttrList
-     *                                    S? ( '/>' | ( '>' S? ETag ) )
-     *                               | ( 'include' IncludeDirectiveAttrList
-     *                                    S? ( '/>' | ( '>' S? ETag ) )
-     *                           | <TRANSLATION_ERROR>
-     *
-     *   XMLTagDefDirectiveBody ::= (   ( 'tag' TagDirectiveAttrList
-     *                                    S? ( '/>' | ( '>' S? ETag ) )
-     *                                | ( 'include' IncludeDirectiveAttrList
-     *                                    S? ( '/>' | ( '>' S? ETag ) )
-     *                                | ( 'attribute' AttributeDirectiveAttrList
-     *                                    S? ( '/>' | ( '>' S? ETag ) )
-     *                                | ( 'variable' VariableDirectiveAttrList
-     *                                    S? ( '/>' | ( '>' S? ETag ) )
-     *                              )
-     *                            | <TRANSLATION_ERROR>
-     */
+    * Parses a directive with the following syntax:
+    *
+    *   XMLJSPDirectiveBody ::= S? (   ( 'page' PageDirectiveAttrList
+    *                                    S? ( '/>' | ( '>' S? ETag ) )
+    *                               | ( 'include' IncludeDirectiveAttrList
+    *                                    S? ( '/>' | ( '>' S? ETag ) )
+    *                           | <TRANSLATION_ERROR>
+    *
+    *   XMLTagDefDirectiveBody ::= (   ( 'tag' TagDirectiveAttrList
+    *                                    S? ( '/>' | ( '>' S? ETag ) )
+    *                                | ( 'include' IncludeDirectiveAttrList
+    *                                    S? ( '/>' | ( '>' S? ETag ) )
+    *                                | ( 'attribute' AttributeDirectiveAttrList
+    *                                    S? ( '/>' | ( '>' S? ETag ) )
+    *                                | ( 'variable' VariableDirectiveAttrList
+    *                                    S? ( '/>' | ( '>' S? ETag ) )
+    *                              )
+    *                            | <TRANSLATION_ERROR>
+    */
     private void parseXMLDirective(Node parent) throws JasperException {
-       reader.skipSpaces();
+        reader.skipSpaces();
 
         String eTag = null;
-       if (reader.matches("page")) {
+        if (reader.matches("page")) {
             eTag = "jsp:directive.page";
-           if (isTagFile) {
-               err.jspError(reader.mark(), "jsp.error.directive.istagfile",
-                                           "&lt;" + eTag);
-           }
-           parsePageDirective(parent);
-       } else if (reader.matches("include")) {
-            eTag = "jsp:directive.include";
-           parseIncludeDirective(parent);
-       } else if (reader.matches("tag")) {
-            eTag = "jsp:directive.tag";
-           if (!isTagFile) {
-               err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
-                                           "&lt;" + eTag);
-           }
-           parseTagDirective(parent);
-       } else if (reader.matches("attribute")) {
-            eTag = "jsp:directive.attribute";
-           if (!isTagFile) {
-               err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
-                                           "&lt;" + eTag);
-           }
-           parseAttributeDirective(parent);
-       } else if (reader.matches("variable")) {
-            eTag = "jsp:directive.variable";
-           if (!isTagFile) {
-               err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
-                                           "&lt;" + eTag);
-           }
-           parseVariableDirective(parent);
-       } else {
-           err.jspError(reader.mark(), "jsp.error.invalid.directive");
-       }
-
-       reader.skipSpaces();
-        if( reader.matches( ">" ) ) {
-            reader.skipSpaces();
-            if( !reader.matchesETag( eTag ) ) {
-                err.jspError(start, "jsp.error.unterminated", "&lt;" + eTag );
+            if (isTagFile) {
+                err.jspError(reader.mark(), "jsp.error.directive.istagfile",
+                        "&lt;" + eTag);
             }
+            parsePageDirective(parent);
+        } else if (reader.matches("include")) {
+            eTag = "jsp:directive.include";
+            parseIncludeDirective(parent);
+        } else if (reader.matches("tag")) {
+            eTag = "jsp:directive.tag";
+            if (!isTagFile) {
+                err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
+                        "&lt;" + eTag);
+            }
+            parseTagDirective(parent);
+        } else if (reader.matches("attribute")) {
+            eTag = "jsp:directive.attribute";
+            if (!isTagFile) {
+                err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
+                        "&lt;" + eTag);
+            }
+            parseAttributeDirective(parent);
+        } else if (reader.matches("variable")) {
+            eTag = "jsp:directive.variable";
+            if (!isTagFile) {
+                err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
+                        "&lt;" + eTag);
+            }
+            parseVariableDirective(parent);
+        } else {
+            err.jspError(reader.mark(), "jsp.error.invalid.directive");
         }
-        else if( !reader.matches( "/>" ) ) {
-            err.jspError(start, "jsp.error.unterminated", "&lt;" + eTag );
+
+        reader.skipSpaces();
+        if (reader.matches(">")) {
+            reader.skipSpaces();
+            if (!reader.matchesETag(eTag)) {
+                err.jspError(start, "jsp.error.unterminated", "&lt;" + eTag);
+            }
+        } else if (!reader.matches("/>")) {
+            err.jspError(start, "jsp.error.unterminated", "&lt;" + eTag);
         }
     }
 
@@ -646,7 +645,7 @@
     /*
      * JSPCommentBody ::= (Char* - (Char* '--%>')) '--%>'
      */
-    private void parseComment(Node parent) throws JasperException {        
+    private void parseComment(Node parent) throws JasperException {
         start = reader.mark();
         Mark stop = reader.skipUntil("--%>");
         if (stop == null) {
@@ -667,7 +666,7 @@
         }
 
         new Node.Declaration(parseScriptText(reader.getText(start, stop)),
-                             start, parent);
+                start, parent);
     }
 
     /*
@@ -681,8 +680,8 @@
      */
     private void parseXMLDeclaration(Node parent) throws JasperException {
         reader.skipSpaces();
-        if( !reader.matches( "/>" ) ) {
-            if( !reader.matches( ">" ) ) {
+        if (!reader.matches("/>")) {
+            if (!reader.matches(">")) {
                 err.jspError(start, "jsp.error.unterminated",
                         "&lt;jsp:declaration&gt;");
             }
@@ -693,7 +692,7 @@
                 stop = reader.skipUntil("<");
                 if (stop == null) {
                     err.jspError(start, "jsp.error.unterminated",
-                        "&lt;jsp:declaration&gt;");
+                            "&lt;jsp:declaration&gt;");
                 }
                 text = parseScriptText(reader.getText(start, stop));
                 new Node.Declaration(text, start, parent);
@@ -705,13 +704,12 @@
                     }
                     text = parseScriptText(reader.getText(start, stop));
                     new Node.Declaration(text, start, parent);
-                }
-                else {
+                } else {
                     break;
                 }
             }
-                
-            if (!reader.matchesETagWithoutLessThan( "jsp:declaration" ) ) {
+
+            if (!reader.matchesETagWithoutLessThan("jsp:declaration")) {
                 err.jspError(start, "jsp.error.unterminated",
                         "&lt;jsp:declaration&gt;");
             }
@@ -729,7 +727,7 @@
         }
 
         new Node.Expression(parseScriptText(reader.getText(start, stop)),
-                            start, parent);
+                start, parent);
     }
 
     /*
@@ -739,10 +737,10 @@
      */
     private void parseXMLExpression(Node parent) throws JasperException {
         reader.skipSpaces();
-        if( !reader.matches( "/>" ) ) {
-            if( !reader.matches( ">" ) ) {
+        if (!reader.matches("/>")) {
+            if (!reader.matches(">")) {
                 err.jspError(start, "jsp.error.unterminated",
-                    "&lt;jsp:expression&gt;");
+                        "&lt;jsp:expression&gt;");
             }
             Mark stop;
             String text;
@@ -751,7 +749,7 @@
                 stop = reader.skipUntil("<");
                 if (stop == null) {
                     err.jspError(start, "jsp.error.unterminated",
-                        "&lt;jsp:expression&gt;");
+                            "&lt;jsp:expression&gt;");
                 }
                 text = parseScriptText(reader.getText(start, stop));
                 new Node.Expression(text, start, parent);
@@ -763,14 +761,13 @@
                     }
                     text = parseScriptText(reader.getText(start, stop));
                     new Node.Expression(text, start, parent);
-                }
-                else {
+                } else {
                     break;
                 }
             }
-            if (!reader.matchesETagWithoutLessThan( "jsp:expression" )) {
+            if (!reader.matchesETagWithoutLessThan("jsp:expression")) {
                 err.jspError(start, "jsp.error.unterminated",
-                    "&lt;jsp:expression&gt;");
+                        "&lt;jsp:expression&gt;");
             }
         }
     }
@@ -817,7 +814,7 @@
         }
 
         new Node.Scriptlet(parseScriptText(reader.getText(start, stop)),
-                           start, parent);
+                start, parent);
     }
 
     /*
@@ -827,10 +824,10 @@
      */
     private void parseXMLScriptlet(Node parent) throws JasperException {
         reader.skipSpaces();
-        if( !reader.matches( "/>" ) ) {
-            if( !reader.matches( ">" ) ) {
+        if (!reader.matches("/>")) {
+            if (!reader.matches(">")) {
                 err.jspError(start, "jsp.error.unterminated",
-                    "&lt;jsp:scriptlet&gt;");
+                        "&lt;jsp:scriptlet&gt;");
             }
             Mark stop;
             String text;
@@ -839,7 +836,7 @@
                 stop = reader.skipUntil("<");
                 if (stop == null) {
                     err.jspError(start, "jsp.error.unterminated",
-                        "&lt;jsp:scriptlet&gt;");
+                            "&lt;jsp:scriptlet&gt;");
                 }
                 text = parseScriptText(reader.getText(start, stop));
                 new Node.Scriptlet(text, start, parent);
@@ -851,19 +848,18 @@
                     }
                     text = parseScriptText(reader.getText(start, stop));
                     new Node.Scriptlet(text, start, parent);
-                }
-                else {
+                } else {
                     break;
                 }
             }
 
-            if (!reader.matchesETagWithoutLessThan( "jsp:scriptlet" )) {
+            if (!reader.matchesETagWithoutLessThan("jsp:scriptlet")) {
                 err.jspError(start, "jsp.error.unterminated",
-                    "&lt;jsp:scriptlet&gt;");
+                        "&lt;jsp:scriptlet&gt;");
             }
         }
     }
-        
+
     /**
      * Param ::= '<jsp:param' S Attributes S? EmptyBody S?
      */
@@ -873,11 +869,11 @@
         }
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
-        
-        Node paramActionNode = new Node.ParamAction( attrs, start, parent );
-        
-        parseEmptyBody( paramActionNode, "jsp:param" );
-        
+
+        Node paramActionNode = new Node.ParamAction(attrs, start, parent);
+
+        parseEmptyBody(paramActionNode, "jsp:param");
+
         reader.skipSpaces();
     }
 
@@ -903,10 +899,10 @@
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
 
-        Node includeNode = new Node.IncludeAction( attrs, start, parent );
-        
-        parseOptionalBody(includeNode, "jsp:include", 
-                          JAVAX_BODY_CONTENT_PARAM);
+        Node includeNode = new Node.IncludeAction(attrs, start, parent);
+
+        parseOptionalBody(includeNode, "jsp:include",
+                JAVAX_BODY_CONTENT_PARAM);
     }
 
     /*
@@ -917,10 +913,10 @@
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
 
-        Node forwardNode = new Node.ForwardAction( attrs, start, parent );
-        
+        Node forwardNode = new Node.ForwardAction(attrs, start, parent);
+
         parseOptionalBody(forwardNode, "jsp:forward",
-                          JAVAX_BODY_CONTENT_PARAM);
+                JAVAX_BODY_CONTENT_PARAM);
     }
 
     private void parseInvoke(Node parent) throws JasperException {
@@ -928,7 +924,7 @@
         reader.skipSpaces();
 
         Node invokeNode = new Node.InvokeAction(attrs, start, parent);
-        
+
         parseEmptyBody(invokeNode, "jsp:invoke");
     }
 
@@ -937,7 +933,7 @@
         reader.skipSpaces();
 
         Node doBodyNode = new Node.DoBodyAction(attrs, start, parent);
-        
+
         parseEmptyBody(doBodyNode, "jsp:doBody");
     }
 
@@ -946,9 +942,9 @@
         reader.skipSpaces();
 
         Node elementNode = new Node.JspElement(attrs, start, parent);
-        
-        parseOptionalBody( elementNode, "jsp:element", 
-            TagInfo.BODY_CONTENT_JSP );
+
+        parseOptionalBody(elementNode, "jsp:element",
+                TagInfo.BODY_CONTENT_JSP);
     }
 
     /*
@@ -959,10 +955,10 @@
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
 
-        Node getPropertyNode = new Node.GetProperty( attrs, start, parent );
-        
+        Node getPropertyNode = new Node.GetProperty(attrs, start, parent);
+
         parseOptionalBody(getPropertyNode, "jsp:getProperty",
-                          TagInfo.BODY_CONTENT_EMPTY);
+                TagInfo.BODY_CONTENT_EMPTY);
     }
 
     /*
@@ -973,10 +969,10 @@
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
 
-        Node setPropertyNode = new Node.SetProperty( attrs, start, parent );
-        
+        Node setPropertyNode = new Node.SetProperty(attrs, start, parent);
+
         parseOptionalBody(setPropertyNode, "jsp:setProperty",
-                          TagInfo.BODY_CONTENT_EMPTY);
+                TagInfo.BODY_CONTENT_EMPTY);
     }
 
     /*
@@ -984,36 +980,30 @@
      *               | ( '>' ETag )
      *               | ( '>' S? '<jsp:attribute' NamedAttributes ETag )
      */
-    private void parseEmptyBody( Node parent, String tag ) 
-        throws JasperException
-    {
-        if( reader.matches("/>") ) {
+    private void parseEmptyBody(Node parent, String tag)
+            throws JasperException {
+        if (reader.matches("/>")) {
             // Done
-        }
-        else if( reader.matches( ">" ) ) {
-            if( reader.matchesETag( tag ) ) {
+        } else if (reader.matches(">")) {
+            if (reader.matchesETag(tag)) {
                 // Done
-            }
-            else if( reader.matchesOptionalSpacesFollowedBy(
-                "<jsp:attribute" ) )
-            {
+            } else if (reader.matchesOptionalSpacesFollowedBy(
+                    "<jsp:attribute")) {
                 // Parse the one or more named attribute nodes
-                parseNamedAttributes( parent );
-                if( !reader.matchesETag( tag ) ) {
+                parseNamedAttributes(parent);
+                if (!reader.matchesETag(tag)) {
                     // Body not allowed
                     err.jspError(reader.mark(),
-                        "jsp.error.jspbody.emptybody.only",
-                        "&lt;" + tag );
+                            "jsp.error.jspbody.emptybody.only",
+                            "&lt;" + tag);
                 }
-            }
-            else {
+            } else {
                 err.jspError(reader.mark(), "jsp.error.jspbody.emptybody.only",
-                    "&lt;" + tag );
+                        "&lt;" + tag);
             }
-        }
-        else {
+        } else {
             err.jspError(reader.mark(), "jsp.error.unterminated",
-                "&lt;" + tag );
+                    "&lt;" + tag);
         }
     }
 
@@ -1024,11 +1014,11 @@
     private void parseUseBean(Node parent) throws JasperException {
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
-        
-        Node useBeanNode = new Node.UseBean( attrs, start, parent );
-        
-        parseOptionalBody( useBeanNode, "jsp:useBean", 
-            TagInfo.BODY_CONTENT_JSP );
+
+        Node useBeanNode = new Node.UseBean(attrs, start, parent);
+
+        parseOptionalBody(useBeanNode, "jsp:useBean",
+                TagInfo.BODY_CONTENT_JSP);
     }
 
     /*
@@ -1057,9 +1047,8 @@
      *                            | ( '>' TagDependentBody ETag )
      *
      */
-    private void parseOptionalBody( Node parent, String tag, String bodyType ) 
-        throws JasperException 
-    {
+    private void parseOptionalBody(Node parent, String tag, String bodyType)
+            throws JasperException {
         if (reader.matches("/>")) {
             // EmptyBody
             return;
@@ -1067,65 +1056,63 @@
 
         if (!reader.matches(">")) {
             err.jspError(reader.mark(), "jsp.error.unterminated",
-                         "&lt;" + tag );
+                    "&lt;" + tag);
         }
-        
-        if( reader.matchesETag( tag ) ) {
+
+        if (reader.matchesETag(tag)) {
             // EmptyBody
             return;
         }
-        
-        if( !parseJspAttributeAndBody( parent, tag, bodyType ) ) {
+
+        if (!parseJspAttributeAndBody(parent, tag, bodyType)) {
             // Must be ( '>' # Body ETag )
-            parseBody(parent, tag, bodyType );
+            parseBody(parent, tag, bodyType);
         }
     }
-    
+
     /**
      * Attempts to parse 'JspAttributeAndBody' production.  Returns true if
      * it matched, or false if not.  Assumes EmptyBody is okay as well.
-     *
+     * <p/>
      * JspAttributeAndBody ::=
-     *                  ( '>' # S? ( '<jsp:attribute' NamedAttributes )?
-     *                    '<jsp:body'
-     *                    ( JspBodyBody | <TRANSLATION_ERROR> )
-     *                    S? ETag
-     *                  )
+     * ( '>' # S? ( '<jsp:attribute' NamedAttributes )?
+     * '<jsp:body'
+     * ( JspBodyBody | <TRANSLATION_ERROR> )
+     * S? ETag
+     * )
      */
-    private boolean parseJspAttributeAndBody( Node parent, String tag, 
-        String bodyType ) 
-        throws JasperException
-    {
+    private boolean parseJspAttributeAndBody(Node parent, String tag,
+                                             String bodyType)
+            throws JasperException {
         boolean result = false;
-        
-        if( reader.matchesOptionalSpacesFollowedBy( "<jsp:attribute" ) ) {
+
+        if (reader.matchesOptionalSpacesFollowedBy("<jsp:attribute")) {
             // May be an EmptyBody, depending on whether
             // There's a "<jsp:body" before the ETag
-            
+
             // First, parse <jsp:attribute> elements:
-            parseNamedAttributes( parent );
-            
+            parseNamedAttributes(parent);
+
             result = true;
         }
-        
-        if( reader.matchesOptionalSpacesFollowedBy( "<jsp:body" ) ) {
+
+        if (reader.matchesOptionalSpacesFollowedBy("<jsp:body")) {
             // ActionBody
-            parseJspBody( parent, bodyType );
+            parseJspBody(parent, bodyType);
             reader.skipSpaces();
-            if( !reader.matchesETag( tag ) ) {
-                err.jspError(reader.mark(), "jsp.error.unterminated", 
-                    "&lt;" + tag );
+            if (!reader.matchesETag(tag)) {
+                err.jspError(reader.mark(), "jsp.error.unterminated",
+                        "&lt;" + tag);
             }
-            
+
             result = true;
-        }
-        else if( result && !reader.matchesETag( tag ) ) {
+        } else if (result && !reader.matchesETag(tag)) {
             // If we have <jsp:attribute> but something other than
             // <jsp:body> or the end tag, translation error.
-            err.jspError(reader.mark(), "jsp.error.jspbody.required", 
-                "&lt;" + tag );
+            err.jspError(reader.mark(), "jsp.error.jspbody.required",
+                    "&lt;" + tag);
         }
-        
+
         return result;
     }
 
@@ -1143,7 +1130,7 @@
     private void parseJspParams(Node parent) throws JasperException {
         Node jspParamsNode = new Node.ParamsAction(start, parent);
         parseOptionalBody(jspParamsNode, "jsp:params",
-                          JAVAX_BODY_CONTENT_PARAM );
+                JAVAX_BODY_CONTENT_PARAM);
     }
 
     /*
@@ -1164,8 +1151,8 @@
      */
     private void parseFallBack(Node parent) throws JasperException {
         Node fallBackNode = new Node.FallBackAction(start, parent);
-        parseOptionalBody(fallBackNode, "jsp:fallback", 
-                          JAVAX_BODY_CONTENT_TEMPLATE_TEXT);
+        parseOptionalBody(fallBackNode, "jsp:fallback",
+                JAVAX_BODY_CONTENT_TEMPLATE_TEXT);
     }
 
     /*
@@ -1188,42 +1175,42 @@
     private void parsePlugin(Node parent) throws JasperException {
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
-        
+
         Node pluginNode = new Node.PlugIn(attrs, start, parent);
-        
-        parseOptionalBody( pluginNode, "jsp:plugin", 
-            JAVAX_BODY_CONTENT_PLUGIN );
+
+        parseOptionalBody(pluginNode, "jsp:plugin",
+                JAVAX_BODY_CONTENT_PLUGIN);
     }
 
     /*
      * PluginTags ::= ( '<jsp:params' Params S? )?
      *                ( '<jsp:fallback' Fallback? S? )?
      */
-    private void parsePluginTags( Node parent ) throws JasperException {
+    private void parsePluginTags(Node parent) throws JasperException {
         reader.skipSpaces();
-        
-        if( reader.matches( "<jsp:params" ) ) {
-            parseJspParams( parent );
+
+        if (reader.matches("<jsp:params")) {
+            parseJspParams(parent);
             reader.skipSpaces();
         }
-        
-        if( reader.matches( "<jsp:fallback" ) ) {
-            parseFallBack( parent );
+
+        if (reader.matches("<jsp:fallback")) {
+            parseFallBack(parent);
             reader.skipSpaces();
         }
     }
-        
+
     /*
-     * StandardAction ::=   'include'       StdActionContent
-     *                    | 'forward'       StdActionContent
-     *                    | 'invoke'        StdActionContent
-     *                    | 'doBody'        StdActionContent
-     *                    | 'getProperty'   StdActionContent
-     *                    | 'setProperty'   StdActionContent
-     *                    | 'useBean'       StdActionContent
-     *                    | 'plugin'        StdActionContent
-     *                    | 'element'       StdActionContent
-     */
+    * StandardAction ::=   'include'       StdActionContent
+    *                    | 'forward'       StdActionContent
+    *                    | 'invoke'        StdActionContent
+    *                    | 'doBody'        StdActionContent
+    *                    | 'getProperty'   StdActionContent
+    *                    | 'setProperty'   StdActionContent
+    *                    | 'useBean'       StdActionContent
+    *                    | 'plugin'        StdActionContent
+    *                    | 'element'       StdActionContent
+    */
     private void parseStandardAction(Node parent) throws JasperException {
         Mark start = reader.mark();
 
@@ -1234,13 +1221,13 @@
         } else if (reader.matches(INVOKE_ACTION)) {
             if (!isTagFile) {
                 err.jspError(reader.mark(), "jsp.error.action.isnottagfile",
-                             "&lt;jsp:invoke");
+                        "&lt;jsp:invoke");
             }
             parseInvoke(parent);
         } else if (reader.matches(DOBODY_ACTION)) {
             if (!isTagFile) {
                 err.jspError(reader.mark(), "jsp.error.action.isnottagfile",
-                             "&lt;jsp:doBody");
+                        "&lt;jsp:doBody");
             }
             parseDoBody(parent);
         } else if (reader.matches(GET_PROPERTY_ACTION)) {
@@ -1310,7 +1297,7 @@
         }
 
         String prefix = tagName.substring(0, i);
-        String shortTagName = tagName.substring(i+1);
+        String shortTagName = tagName.substring(i + 1);
 
         // Check if this is a user-defined tag.
         String uri = pageInfo.getURI(prefix);
@@ -1334,10 +1321,10 @@
             String handlerClassName = tagInfo.getTagClassName();
             try {
                 tagHandlerClass =
-                    ctxt.getClassLoader().loadClass(handlerClassName);
+                        ctxt.getClassLoader().loadClass(handlerClassName);
             } catch (Exception e) {
                 err.jspError(start, "jsp.error.loadclass.taghandler",
-                             handlerClassName, tagName);
+                        handlerClassName, tagName);
             }
         }
 
@@ -1348,19 +1335,19 @@
         // Parse 'Attributes' production:
         Attributes attrs = parseAttributes();
         reader.skipSpaces();
-        
+
         // Parse 'CustomActionEnd' production:
         if (reader.matches("/>")) {
             if (tagInfo != null) {
                 new Node.CustomTag(tagName, prefix, shortTagName, uri, attrs,
-                                   start, parent, tagInfo, tagHandlerClass);
+                        start, parent, tagInfo, tagHandlerClass);
             } else {
                 new Node.CustomTag(tagName, prefix, shortTagName, uri, attrs,
-                                   start, parent, tagFileInfo);
+                        start, parent, tagFileInfo);
             }
             return true;
         }
-        
+
         // Now we parse one of 'CustomActionTagDependent', 
         // 'CustomActionJSPContent', or 'CustomActionScriptlessContent'.
         // depending on body-content in TLD.
@@ -1378,14 +1365,14 @@
         Node tagNode = null;
         if (tagInfo != null) {
             tagNode = new Node.CustomTag(tagName, prefix, shortTagName, uri,
-                                         attrs, start, parent, tagInfo,
-                                         tagHandlerClass);
+                    attrs, start, parent, tagInfo,
+                    tagHandlerClass);
         } else {
             tagNode = new Node.CustomTag(tagName, prefix, shortTagName, uri,
-                                         attrs, start, parent, tagFileInfo);
+                    attrs, start, parent, tagFileInfo);
         }
 
-        parseOptionalBody( tagNode, tagName, bc );
+        parseOptionalBody(tagNode, tagName, bc);
 
         return true;
     }
@@ -1413,8 +1400,7 @@
             if (ch == '<') {
                 reader.pushChar();
                 break;
-            }
-            else if( ch == '$' ) {
+            } else if (ch == '$') {
                 if (!reader.hasMoreInput()) {
                     ttext.write('$');
                     break;
@@ -1428,8 +1414,7 @@
                 ttext.write('$');
                 reader.pushChar();
                 continue;
-            }
-            else if (ch == '\\') {
+            } else if (ch == '\\') {
                 if (!reader.hasMoreInput()) {
                     ttext.write('\\');
                     break;
@@ -1437,10 +1422,10 @@
                 // Look for \% or \$
                 // Only recognize \$ if isELIgnored is false, but since it can
                 // be set in a page directive, it cannot be determined yet.
-                char next = (char)reader.peekChar();
+                char next = (char) reader.peekChar();
                 if (next == '%') {
                     ch = reader.nextChar();
-                } else if(next == '$') {
+                } else if (next == '$') {
                     // Skip the $ and use a hack to flag this sequence
                     reader.nextChar();
                     ch = Constants.HACK_CHAR;
@@ -1450,28 +1435,28 @@
         }
         new Node.TemplateText(ttext.toString(), start, parent);
     }
-    
+
     /*
-     * XMLTemplateText ::=   ( S? '/>' )
-     *                     | ( S? '>'
-     *                         ( ( Char* - ( Char* ( '<' | '${' ) ) )
-     *                           ( '${' ELExpressionBody )?
-     *                           CDSect?
-     *                         )* ETag
-     *                       )
-     *                     | <TRANSLATION_ERROR>
-     */
+    * XMLTemplateText ::=   ( S? '/>' )
+    *                     | ( S? '>'
+    *                         ( ( Char* - ( Char* ( '<' | '${' ) ) )
+    *                           ( '${' ELExpressionBody )?
+    *                           CDSect?
+    *                         )* ETag
+    *                       )
+    *                     | <TRANSLATION_ERROR>
+    */
     private void parseXMLTemplateText(Node parent) throws JasperException {
         reader.skipSpaces();
-        if( !reader.matches( "/>" ) ) {
-            if( !reader.matches( ">" ) ) {
+        if (!reader.matches("/>")) {
+            if (!reader.matches(">")) {
                 err.jspError(start, "jsp.error.unterminated",
-                    "&lt;jsp:text&gt;" );
+                        "&lt;jsp:text&gt;");
             }
             CharArrayWriter ttext = new CharArrayWriter();
             while (reader.hasMoreInput()) {
                 int ch = reader.nextChar();
-                if( ch == '<' ) {
+                if (ch == '<') {
                     // Check for <![CDATA[
                     if (!reader.matches("![CDATA[")) {
                         break;
@@ -1483,19 +1468,17 @@
                     }
                     String text = reader.getText(start, stop);
                     ttext.write(text, 0, text.length());
-                }
-                else if( ch == '\\') {
+                } else if (ch == '\\') {
                     if (!reader.hasMoreInput()) {
                         ttext.write('\\');
                         break;
                     }
                     ch = reader.nextChar();
-                    if (ch != '$' ) {
+                    if (ch != '$') {
                         ttext.write('\\');
                     }
                     ttext.write(ch);
-                }
-                else if( ch == '$' ) {
+                } else if (ch == '$') {
                     if (!reader.hasMoreInput()) {
                         ttext.write('$');
                         break;
@@ -1507,7 +1490,7 @@
                         continue;
                     }
                     // Create a template text node
-                    new Node.TemplateText( ttext.toString(), start, parent);
+                    new Node.TemplateText(ttext.toString(), start, parent);
 
                     // Mark and parse the EL expression and create its node:
                     start = reader.mark();
@@ -1515,19 +1498,18 @@
 
                     start = reader.mark();
                     ttext = new CharArrayWriter();
-                }
-                else {
-                    ttext.write( ch );
+                } else {
+                    ttext.write(ch);
                 }
             }
 
-            new Node.TemplateText( ttext.toString(), start, parent );
+            new Node.TemplateText(ttext.toString(), start, parent);
 
-            if (! reader.hasMoreInput()) {
-                err.jspError( start, "jsp.error.unterminated",
-                    "&lt;jsp:text&gt;" );
-            } else if( !reader.matchesETagWithoutLessThan( "jsp:text" ) ) {
-                err.jspError( start, "jsp.error.jsptext.badcontent");
+            if (!reader.hasMoreInput()) {
+                err.jspError(start, "jsp.error.unterminated",
+                        "&lt;jsp:text&gt;");
+            } else if (!reader.matchesETagWithoutLessThan("jsp:text")) {
+                err.jspError(start, "jsp.error.jsptext.badcontent");
             }
         }
     }
@@ -1549,17 +1531,16 @@
      *                                         CustomActionBody   )
      *                       | TemplateText
      */
-    private void parseElements(Node parent) 
-        throws JasperException 
-    {
-        if( scriptlessCount > 0 ) {
+    private void parseElements(Node parent)
+            throws JasperException {
+        if (scriptlessCount > 0) {
             // vc: ScriptlessBody
             // We must follow the ScriptlessBody production if one of
             // our parents is ScriptlessBody.
-            parseElementsScriptless( parent );
+            parseElementsScriptless(parent);
             return;
         }
-        
+
         start = reader.mark();
         if (reader.matches("<%--")) {
             parseComment(parent);
@@ -1608,13 +1589,12 @@
      *                                           CustomActionBody    )
      *                   | TemplateText
      */
-    private void parseElementsScriptless(Node parent) 
-        throws JasperException 
-    {
+    private void parseElementsScriptless(Node parent)
+            throws JasperException {
         // Keep track of how many scriptless nodes we've encountered
         // so we know whether our child nodes are forced scriptless
         scriptlessCount++;
-        
+
         start = reader.mark();
         if (reader.matches("<%--")) {
             parseComment(parent);
@@ -1623,17 +1603,17 @@
         } else if (reader.matches("<jsp:directive.")) {
             parseXMLDirective(parent);
         } else if (reader.matches("<%!")) {
-            err.jspError( reader.mark(), "jsp.error.no.scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.no.scriptlets");
         } else if (reader.matches("<jsp:declaration")) {
-            err.jspError( reader.mark(), "jsp.error.no.scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.no.scriptlets");
         } else if (reader.matches("<%=")) {
-            err.jspError( reader.mark(), "jsp.error.no.scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.no.scriptlets");
         } else if (reader.matches("<jsp:expression")) {
-            err.jspError( reader.mark(), "jsp.error.no.scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.no.scriptlets");
         } else if (reader.matches("<%")) {
-            err.jspError( reader.mark(), "jsp.error.no.scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.no.scriptlets");
         } else if (reader.matches("<jsp:scriptlet")) {
-            err.jspError( reader.mark(), "jsp.error.no.scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.no.scriptlets");
         } else if (reader.matches("<jsp:text")) {
             parseXMLTemplateText(parent);
         } else if (reader.matches("${")) {
@@ -1644,28 +1624,27 @@
             checkUnbalancedEndTag();
             parseTemplateText(parent);
         }
-        
+
         scriptlessCount--;
     }
-    
+
     /*
-     * TemplateTextBody ::=   ( '<%--'              JSPCommentBody      )
-     *                      | ( '<%@'               DirectiveBody       )
-     *                      | ( '<jsp:directive.'   XMLDirectiveBody    )
-     *                      | ( '<%!'               <TRANSLATION_ERROR> )
-     *                      | ( '<jsp:declaration'  <TRANSLATION_ERROR> )
-     *                      | ( '<%='               <TRANSLATION_ERROR> )
-     *                      | ( '<jsp:expression'   <TRANSLATION_ERROR> )
-     *                      | ( '<%'                <TRANSLATION_ERROR> )
-     *                      | ( '<jsp:scriptlet'    <TRANSLATION_ERROR> )
-     *                      | ( '<jsp:text'         <TRANSLATION_ERROR> )
-     *                      | ( '${'                <TRANSLATION_ERROR> )
-     *                      | ( '<jsp:'             <TRANSLATION_ERROR> )
-     *                      | TemplateText
-     */
+    * TemplateTextBody ::=   ( '<%--'              JSPCommentBody      )
+    *                      | ( '<%@'               DirectiveBody       )
+    *                      | ( '<jsp:directive.'   XMLDirectiveBody    )
+    *                      | ( '<%!'               <TRANSLATION_ERROR> )
+    *                      | ( '<jsp:declaration'  <TRANSLATION_ERROR> )
+    *                      | ( '<%='               <TRANSLATION_ERROR> )
+    *                      | ( '<jsp:expression'   <TRANSLATION_ERROR> )
+    *                      | ( '<%'                <TRANSLATION_ERROR> )
+    *                      | ( '<jsp:scriptlet'    <TRANSLATION_ERROR> )
+    *                      | ( '<jsp:text'         <TRANSLATION_ERROR> )
+    *                      | ( '${'                <TRANSLATION_ERROR> )
+    *                      | ( '<jsp:'             <TRANSLATION_ERROR> )
+    *                      | TemplateText
+    */
     private void parseElementsTemplateText(Node parent)
-        throws JasperException
-    {
+            throws JasperException {
         start = reader.mark();
         if (reader.matches("<%--")) {
             parseComment(parent);
@@ -1674,35 +1653,35 @@
         } else if (reader.matches("<jsp:directive.")) {
             parseXMLDirective(parent);
         } else if (reader.matches("<%!")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Declarations" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Declarations");
         } else if (reader.matches("<jsp:declaration")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Declarations" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Declarations");
         } else if (reader.matches("<%=")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Expressions" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Expressions");
         } else if (reader.matches("<jsp:expression")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Expressions" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Expressions");
         } else if (reader.matches("<%")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Scriptlets");
         } else if (reader.matches("<jsp:scriptlet")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Scriptlets" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Scriptlets");
         } else if (reader.matches("<jsp:text")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "&lt;jsp:text" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "&lt;jsp:text");
         } else if (reader.matches("${")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Expression language" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Expression language");
         } else if (reader.matches("<jsp:")) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Standard actions" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Standard actions");
         } else if (parseCustomTag(parent)) {
-            err.jspError( reader.mark(), "jsp.error.not.in.template",
-                "Custom actions" );
+            err.jspError(reader.mark(), "jsp.error.not.in.template",
+                    "Custom actions");
         } else {
             checkUnbalancedEndTag();
             parseTemplateText(parent);
@@ -1735,25 +1714,24 @@
     }
 
     /**
-     * TagDependentBody := 
+     * TagDependentBody :=
      */
     private void parseTagDependentBody(Node parent, String tag)
-                throws JasperException{
+            throws JasperException {
         Mark bodyStart = reader.mark();
         Mark bodyEnd = reader.skipUntilETag(tag);
         if (bodyEnd == null) {
-            err.jspError(start, "jsp.error.unterminated", "&lt;"+tag );
+            err.jspError(start, "jsp.error.unterminated", "&lt;" + tag);
         }
         new Node.TemplateText(reader.getText(bodyStart, bodyEnd), bodyStart,
-                              parent);
+                parent);
     }
 
     /*
      * Parses jsp:body action.
      */
-    private void parseJspBody(Node parent, String bodyType) 
-        throws JasperException 
-    {
+    private void parseJspBody(Node parent, String bodyType)
+            throws JasperException {
         Mark start = reader.mark();
         Node bodyNode = new Node.JspBody(start, parent);
 
@@ -1761,9 +1739,9 @@
         if (!reader.matches("/>")) {
             if (!reader.matches(">")) {
                 err.jspError(start, "jsp.error.unterminated",
-                             "&lt;jsp:body");
+                        "&lt;jsp:body");
             }
-            parseBody( bodyNode, "jsp:body", bodyType );
+            parseBody(bodyNode, "jsp:body", bodyType);
         }
     }
 
@@ -1772,68 +1750,57 @@
      * @param tag The name of the tag whose end tag would terminate the body
      * @param bodyType One of the TagInfo body types
      */
-    private void parseBody(Node parent, String tag, String bodyType) 
-        throws JasperException 
-    {
-        if( bodyType.equalsIgnoreCase( TagInfo.BODY_CONTENT_TAG_DEPENDENT ) ) {
-            parseTagDependentBody( parent, tag );
-        }
-        else if( bodyType.equalsIgnoreCase( TagInfo.BODY_CONTENT_EMPTY ) ) {
-            if( !reader.matchesETag( tag ) ) {
+    private void parseBody(Node parent, String tag, String bodyType)
+            throws JasperException {
+        if (bodyType.equalsIgnoreCase(TagInfo.BODY_CONTENT_TAG_DEPENDENT)) {
+            parseTagDependentBody(parent, tag);
+        } else if (bodyType.equalsIgnoreCase(TagInfo.BODY_CONTENT_EMPTY)) {
+            if (!reader.matchesETag(tag)) {
                 err.jspError(start, "jasper.error.emptybodycontent.nonempty",
-                             tag);
+                        tag);
             }
-        }
-        else if( bodyType == JAVAX_BODY_CONTENT_PLUGIN ) {
+        } else if (bodyType == JAVAX_BODY_CONTENT_PLUGIN) {
             // (note the == since we won't recognize JAVAX_* 
             // from outside this module).
             parsePluginTags(parent);
-            if( !reader.matchesETag( tag ) ) {
-                err.jspError( reader.mark(), "jsp.error.unterminated",
-                    "&lt;" + tag  );
+            if (!reader.matchesETag(tag)) {
+                err.jspError(reader.mark(), "jsp.error.unterminated",
+                        "&lt;" + tag);
             }
-        }
-        else if( bodyType.equalsIgnoreCase( TagInfo.BODY_CONTENT_JSP ) ||
-            bodyType.equalsIgnoreCase( TagInfo.BODY_CONTENT_SCRIPTLESS ) ||
-            (bodyType == JAVAX_BODY_CONTENT_PARAM) ||
-            (bodyType == JAVAX_BODY_CONTENT_TEMPLATE_TEXT) )
-        {
+        } else if (bodyType.equalsIgnoreCase(TagInfo.BODY_CONTENT_JSP) ||
+                bodyType.equalsIgnoreCase(TagInfo.BODY_CONTENT_SCRIPTLESS) ||
+                (bodyType == JAVAX_BODY_CONTENT_PARAM) ||
+                (bodyType == JAVAX_BODY_CONTENT_TEMPLATE_TEXT)) {
             while (reader.hasMoreInput()) {
                 if (reader.matchesETag(tag)) {
                     return;
                 }
-                
+
                 // Check for nested jsp:body or jsp:attribute
                 if (tag.equals("jsp:body") || tag.equals("jsp:attribute")) {
                     if (reader.matches("<jsp:attribute")) {
                         err.jspError(reader.mark(), "jsp.error.nested.jspattribute");
-                    }
-                    else if (reader.matches("<jsp:body")) {
+                    } else if (reader.matches("<jsp:body")) {
                         err.jspError(reader.mark(), "jsp.error.nested.jspbody");
                     }
                 }
 
-                if( bodyType.equalsIgnoreCase( TagInfo.BODY_CONTENT_JSP ) ) {
-                    parseElements( parent );
-                }
-                else if( bodyType.equalsIgnoreCase( 
-                    TagInfo.BODY_CONTENT_SCRIPTLESS ) ) 
-                {
-                    parseElementsScriptless( parent );
-                }
-                else if( bodyType == JAVAX_BODY_CONTENT_PARAM ) {
+                if (bodyType.equalsIgnoreCase(TagInfo.BODY_CONTENT_JSP)) {
+                    parseElements(parent);
+                } else if (bodyType.equalsIgnoreCase(
+                        TagInfo.BODY_CONTENT_SCRIPTLESS)) {
+                    parseElementsScriptless(parent);
+                } else if (bodyType == JAVAX_BODY_CONTENT_PARAM) {
                     // (note the == since we won't recognize JAVAX_* 
                     // from outside this module).
                     reader.skipSpaces();
-                    parseParam( parent );
-                }
-                else if (bodyType == JAVAX_BODY_CONTENT_TEMPLATE_TEXT) {
+                    parseParam(parent);
+                } else if (bodyType == JAVAX_BODY_CONTENT_TEMPLATE_TEXT) {
                     parseElementsTemplateText(parent);
                 }
             }
-            err.jspError(start, "jsp.error.unterminated", "&lt;"+tag );
-        }
-        else {
+            err.jspError(start, "jsp.error.unterminated", "&lt;" + tag);
+        } else {
             err.jspError(start, "jasper.error.bad.bodycontent.type");
         }
     }
@@ -1846,32 +1813,32 @@
             Mark start = reader.mark();
             Attributes attrs = parseAttributes();
             Node.NamedAttribute namedAttributeNode =
-                new Node.NamedAttribute( attrs, start, parent );
+                    new Node.NamedAttribute(attrs, start, parent);
 
             reader.skipSpaces();
             if (!reader.matches("/>")) {
                 if (!reader.matches(">")) {
                     err.jspError(start, "jsp.error.unterminated",
-                                 "&lt;jsp:attribute");
+                            "&lt;jsp:attribute");
                 }
                 if (namedAttributeNode.isTrim()) {
                     reader.skipSpaces();
                 }
-                parseBody(namedAttributeNode, "jsp:attribute", 
-                          getAttributeBodyType(parent,
-                                               attrs.getValue("name")));
+                parseBody(namedAttributeNode, "jsp:attribute",
+                        getAttributeBodyType(parent,
+                                attrs.getValue("name")));
                 if (namedAttributeNode.isTrim()) {
                     Node.Nodes subElems = namedAttributeNode.getBody();
                     if (subElems != null) {
                         Node lastNode = subElems.getNode(subElems.size() - 1);
                         if (lastNode instanceof Node.TemplateText) {
-                            ((Node.TemplateText)lastNode).rtrim();
+                            ((Node.TemplateText) lastNode).rtrim();
                         }
                     }
                 }
             }
             reader.skipSpaces();
-        } while( reader.matches( "<jsp:attribute" ) );
+        } while (reader.matches("<jsp:attribute"));
     }
 
     /**
@@ -1880,9 +1847,9 @@
     private String getAttributeBodyType(Node n, String name) {
 
         if (n instanceof Node.CustomTag) {
-            TagInfo tagInfo = ((Node.CustomTag)n).getTagInfo();
+            TagInfo tagInfo = ((Node.CustomTag) n).getTagInfo();
             TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
-            for (int i=0; i<tldAttrs.length; i++) {
+            for (int i = 0; i < tldAttrs.length; i++) {
                 if (name.equals(tldAttrs[i].getName())) {
                     if (tldAttrs[i].isFragment()) {
                         return TagInfo.BODY_CONTENT_SCRIPTLESS;
@@ -1927,8 +1894,7 @@
     }
 
     private void parseTagFileDirectives(Node parent)
-        throws JasperException
-    {
+            throws JasperException {
         reader.setSingleFile(true);
         reader.skipUntil("<");
         while (reader.hasMoreInput()) {
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ParserController.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ParserController.java
index ec7de07..231b110 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ParserController.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ParserController.java
@@ -32,7 +32,7 @@
 
 /**
  * Controller for the parsing of a JSP page.
- * <p>
+ * <p/>
  * The same ParserController instance is used for a JSP page and any JSP
  * segments included by it (via an include directive), where each segment may
  * be provided in standard or XML syntax. This class selects and invokes the
@@ -59,7 +59,7 @@
      * for include directives that refer to relative paths.
      */
     private Stack baseDirStack = new Stack();
-    
+
     private boolean isEncodingSpecifiedInProlog;
 
     private String sourceEnc;
@@ -72,17 +72,17 @@
      * Constructor
      */
     public ParserController(JspCompilationContext ctxt, Compiler compiler) {
-        this.ctxt = ctxt; 
-	this.compiler = compiler;
-	this.err = compiler.getErrorDispatcher();
+        this.ctxt = ctxt;
+        this.compiler = compiler;
+        this.err = compiler.getErrorDispatcher();
     }
 
-    public JspCompilationContext getJspCompilationContext () {
-	return ctxt;
+    public JspCompilationContext getJspCompilationContext() {
+        return ctxt;
     }
 
-    public Compiler getCompiler () {
-	return compiler;
+    public Compiler getCompiler() {
+        return compiler;
     }
 
     /**
@@ -91,11 +91,11 @@
      * @param inFileName The path to the JSP page or tag file to be parsed.
      */
     public Node.Nodes parse(String inFileName)
-	        throws FileNotFoundException, JasperException, IOException {
-	// If we're parsing a packaged tag file or a resource included by it
-	// (using an include directive), ctxt.getTagFileJar() returns the 
-	// JAR file from which to read the tag file or included resource,
-	// respectively.
+            throws FileNotFoundException, JasperException, IOException {
+        // If we're parsing a packaged tag file or a resource included by it
+        // (using an include directive), ctxt.getTagFileJar() returns the
+        // JAR file from which to read the tag file or included resource,
+        // respectively.
         isTagFile = ctxt.isTagFile();
         directiveOnly = false;
         return doParse(inFileName, null, ctxt.getTagFileJarUrl());
@@ -105,13 +105,13 @@
      * Processes an include directive with the given path.
      *
      * @param inFileName The path to the resource to be included.
-     * @param parent The parent node of the include directive.
-     * @param jarFile The JAR file from which to read the included resource,
-     * or null of the included resource is to be read from the filesystem
+     * @param parent     The parent node of the include directive.
+     * @param jarFile    The JAR file from which to read the included resource,
+     *                   or null of the included resource is to be read from the filesystem
      */
     public Node.Nodes parse(String inFileName, Node parent,
-			    URL jarFileUrl)
-	        throws FileNotFoundException, JasperException, IOException {
+                            URL jarFileUrl)
+            throws FileNotFoundException, JasperException, IOException {
         // For files that are statically included, isTagfile and directiveOnly
         // remain unchanged.
         return doParse(inFileName, parent, jarFileUrl);
@@ -120,19 +120,19 @@
     /**
      * Extracts tag file directive information from the tag file with the
      * given name.
-     *
-     * This is invoked by the compiler 
+     * <p/>
+     * This is invoked by the compiler
      *
      * @param inFileName The name of the tag file to be parsed.
      */
     public Node.Nodes parseTagFileDirectives(String inFileName)
-	        throws FileNotFoundException, JasperException, IOException {
+            throws FileNotFoundException, JasperException, IOException {
         boolean isTagFileSave = isTagFile;
         boolean directiveOnlySave = directiveOnly;
         isTagFile = true;
         directiveOnly = true;
         Node.Nodes page = doParse(inFileName, null,
-                             (URL) ctxt.getTagFileJarUrls().get(inFileName));
+                (URL) ctxt.getTagFileJarUrls().get(inFileName));
         directiveOnly = directiveOnlySave;
         isTagFile = isTagFileSave;
         return page;
@@ -141,97 +141,98 @@
     /**
      * Parses the JSP page or tag file with the given path name.
      *
-     * @param inFileName The name of the JSP page or tag file to be parsed.
-     * @param parent The parent node (non-null when processing an include
-     * directive)
-     * @param isTagFile true if file to be parsed is tag file, and false if it
-     * is a regular JSP page
+     * @param inFileName     The name of the JSP page or tag file to be parsed.
+     * @param parent         The parent node (non-null when processing an include
+     *                       directive)
+     * @param isTagFile      true if file to be parsed is tag file, and false if it
+     *                       is a regular JSP page
      * @param directivesOnly true if the file to be parsed is a tag file and
-     * we are only interested in the directives needed for constructing a
-     * TagFileInfo.
-     * @param jarFile The JAR file from which to read the JSP page or tag file,
-     * or null if the JSP page or tag file is to be read from the filesystem
+     *                       we are only interested in the directives needed for constructing a
+     *                       TagFileInfo.
+     * @param jarFile        The JAR file from which to read the JSP page or tag file,
+     *                       or null if the JSP page or tag file is to be read from the filesystem
      */
     private Node.Nodes doParse(String inFileName,
                                Node parent,
                                URL jarFileUrl)
-	        throws FileNotFoundException, JasperException, IOException {
+            throws FileNotFoundException, JasperException, IOException {
 
-	Node.Nodes parsedPage = null;
-	isEncodingSpecifiedInProlog = false;
-	isDefaultPageEncoding = false;
+        Node.Nodes parsedPage = null;
+        isEncodingSpecifiedInProlog = false;
+        isDefaultPageEncoding = false;
 
-	JarFile jarFile = getJarFile(jarFileUrl);
-	String absFileName = resolveFileName(inFileName);
-	String jspConfigPageEnc = getJspConfigPageEncoding(absFileName);
+        JarFile jarFile = getJarFile(jarFileUrl);
+        String absFileName = resolveFileName(inFileName);
+        String jspConfigPageEnc = getJspConfigPageEncoding(absFileName);
 
-	// Figure out what type of JSP document and encoding type we are
-	// dealing with
-	determineSyntaxAndEncoding(absFileName, jarFile, jspConfigPageEnc);
+        // Figure out what type of JSP document and encoding type we are
+        // dealing with
+        determineSyntaxAndEncoding(absFileName, jarFile, jspConfigPageEnc);
 
-	if (parent != null) {
-	    // Included resource, add to dependent list
-	    compiler.getPageInfo().addDependant(absFileName);
-	}
+        if (parent != null) {
+            // Included resource, add to dependent list
+            compiler.getPageInfo().addDependant(absFileName);
+        }
 
-	if (isXml && isEncodingSpecifiedInProlog) {
-	    /*
-	     * Make sure the encoding explicitly specified in the XML
-	     * prolog (if any) matches that in the JSP config element
-	     * (if any), treating "UTF-16", "UTF-16BE", and "UTF-16LE" as
-	     * identical.
-	     */
-	    if (jspConfigPageEnc != null && !jspConfigPageEnc.equals(sourceEnc)
-		        && (!jspConfigPageEnc.startsWith("UTF-16")
-			    || !sourceEnc.startsWith("UTF-16"))) {
-		err.jspError("jsp.error.prolog_config_encoding_mismatch",
-			     sourceEnc, jspConfigPageEnc);
-	    }
-	}
+        if (isXml && isEncodingSpecifiedInProlog) {
+            /*
+            * Make sure the encoding explicitly specified in the XML
+            * prolog (if any) matches that in the JSP config element
+            * (if any), treating "UTF-16", "UTF-16BE", and "UTF-16LE" as
+            * identical.
+            */
+            if (jspConfigPageEnc != null && !jspConfigPageEnc.equals(sourceEnc)
+                    && (!jspConfigPageEnc.startsWith("UTF-16")
+                    || !sourceEnc.startsWith("UTF-16"))) {
+                err.jspError("jsp.error.prolog_config_encoding_mismatch",
+                        sourceEnc, jspConfigPageEnc);
+            }
+        }
 
-	// Dispatch to the appropriate parser
-	if (isXml) {
-	    // JSP document (XML syntax)
+        // Dispatch to the appropriate parser
+        if (isXml) {
+            // JSP document (XML syntax)
             // InputStream for jspx page is created and properly closed in
             // JspDocumentParser.
             parsedPage = JspDocumentParser.parse(this, absFileName,
-                                                 jarFile, parent,
-                                                 isTagFile, directiveOnly,
-                                                 sourceEnc,
-                                                 jspConfigPageEnc,
-                                                 isEncodingSpecifiedInProlog);
-	} else {
-	    // Standard syntax
-	    InputStreamReader inStreamReader = null;
-	    try {
-		inStreamReader = JspUtil.getReader(absFileName, sourceEnc,
-						   jarFile, ctxt, err);
-		JspReader jspReader = new JspReader(ctxt, absFileName,
-						    sourceEnc, inStreamReader,
-						    err);
+                    jarFile, parent,
+                    isTagFile, directiveOnly,
+                    sourceEnc,
+                    jspConfigPageEnc,
+                    isEncodingSpecifiedInProlog);
+        } else {
+            // Standard syntax
+            InputStreamReader inStreamReader = null;
+            try {
+                inStreamReader = JspUtil.getReader(absFileName, sourceEnc,
+                        jarFile, ctxt, err);
+                JspReader jspReader = new JspReader(ctxt, absFileName,
+                        sourceEnc, inStreamReader,
+                        err);
                 parsedPage = Parser.parse(this, jspReader, parent, isTagFile,
-					  directiveOnly, jarFileUrl,
-					  sourceEnc, jspConfigPageEnc,
-					  isDefaultPageEncoding);
+                        directiveOnly, jarFileUrl,
+                        sourceEnc, jspConfigPageEnc,
+                        isDefaultPageEncoding);
             } finally {
-		if (inStreamReader != null) {
-		    try {
-			inStreamReader.close();
-		    } catch (Exception any) {
-		    }
-		}
-	    }
-	}
+                if (inStreamReader != null) {
+                    try {
+                        inStreamReader.close();
+                    } catch (Exception any) {
+                    }
+                }
+            }
+        }
 
-	if (jarFile != null) {
-	    try {
-		jarFile.close();
-	    } catch (Throwable t) {}
-	}
+        if (jarFile != null) {
+            try {
+                jarFile.close();
+            } catch (Throwable t) {
+            }
+        }
 
-	baseDirStack.pop();
+        baseDirStack.pop();
 
-	return parsedPage;
+        return parsedPage;
     }
 
     /*
@@ -247,10 +248,10 @@
     private String getJspConfigPageEncoding(String absFileName)
             throws JasperException {
 
-	JspConfig jspConfig = ctxt.getOptions().getJspConfig();
-	JspConfig.JspProperty jspProperty
-	    = jspConfig.findJspProperty(absFileName);
-	return jspProperty.getPageEncoding();
+        JspConfig jspConfig = ctxt.getOptions().getJspConfig();
+        JspConfig.JspProperty jspProperty
+                = jspConfig.findJspProperty(absFileName);
+        return jspProperty.getPageEncoding();
     }
 
     /**
@@ -259,152 +260,152 @@
      * instance variables, respectively.
      */
     private void determineSyntaxAndEncoding(String absFileName,
-					    JarFile jarFile,
-					    String jspConfigPageEnc)
-	        throws JasperException, IOException {
+                                            JarFile jarFile,
+                                            String jspConfigPageEnc)
+            throws JasperException, IOException {
 
-	isXml = false;
+        isXml = false;
 
-	/*
-	 * 'true' if the syntax (XML or standard) of the file is given
-	 * from external information: either via a JSP configuration element,
-	 * the ".jspx" suffix, or the enclosing file (for included resources)
-	 */
-	boolean isExternal = false;
+        /*
+       * 'true' if the syntax (XML or standard) of the file is given
+       * from external information: either via a JSP configuration element,
+       * the ".jspx" suffix, or the enclosing file (for included resources)
+       */
+        boolean isExternal = false;
 
-	/*
-	 * Indicates whether we need to revert from temporary usage of
-	 * "ISO-8859-1" back to "UTF-8"
-	 */
-	boolean revert = false;
+        /*
+       * Indicates whether we need to revert from temporary usage of
+       * "ISO-8859-1" back to "UTF-8"
+       */
+        boolean revert = false;
 
         JspConfig jspConfig = ctxt.getOptions().getJspConfig();
         JspConfig.JspProperty jspProperty = jspConfig.findJspProperty(
-                                                                absFileName);
+                absFileName);
         if (jspProperty.isXml() != null) {
             // If <is-xml> is specified in a <jsp-property-group>, it is used.
             isXml = JspUtil.booleanValue(jspProperty.isXml());
-	    isExternal = true;
-	} else if (absFileName.endsWith(".jspx")
-		   || absFileName.endsWith(".tagx")) {
-	    isXml = true;
-	    isExternal = true;
-	}
-	
-	if (isExternal && !isXml) {
-	    // JSP (standard) syntax. Use encoding specified in jsp-config
-	    // if provided.
-	    sourceEnc = jspConfigPageEnc;
-	    if (sourceEnc != null) {
-		return;
-	    }
-	    // We don't know the encoding
-	    sourceEnc = "ISO-8859-1";
-	} else {
-	    // XML syntax or unknown, (auto)detect encoding ...
-	    Object[] ret = XMLEncodingDetector.getEncoding(absFileName,
-							   jarFile, ctxt, err);
-	    sourceEnc = (String) ret[0];
-	    if (((Boolean) ret[1]).booleanValue()) {
-		isEncodingSpecifiedInProlog = true;
-	    }
+            isExternal = true;
+        } else if (absFileName.endsWith(".jspx")
+                || absFileName.endsWith(".tagx")) {
+            isXml = true;
+            isExternal = true;
+        }
 
-	    if (!isXml && sourceEnc.equals("UTF-8")) {
-		/*
-		 * We don't know if we're dealing with XML or standard syntax.
-		 * Therefore, we need to check to see if the page contains
-		 * a <jsp:root> element.
-		 *
-		 * We need to be careful, because the page may be encoded in
-		 * ISO-8859-1 (or something entirely different), and may
-		 * contain byte sequences that will cause a UTF-8 converter to
-		 * throw exceptions. 
-		 *
-		 * It is safe to use a source encoding of ISO-8859-1 in this
-		 * case, as there are no invalid byte sequences in ISO-8859-1,
-		 * and the byte/character sequences we're looking for (i.e.,
-		 * <jsp:root>) are identical in either encoding (both UTF-8
-		 * and ISO-8859-1 are extensions of ASCII).
-		 */
-		sourceEnc = "ISO-8859-1";
-		revert = true;
-	    }
-	}
+        if (isExternal && !isXml) {
+            // JSP (standard) syntax. Use encoding specified in jsp-config
+            // if provided.
+            sourceEnc = jspConfigPageEnc;
+            if (sourceEnc != null) {
+                return;
+            }
+            // We don't know the encoding
+            sourceEnc = "ISO-8859-1";
+        } else {
+            // XML syntax or unknown, (auto)detect encoding ...
+            Object[] ret = XMLEncodingDetector.getEncoding(absFileName,
+                    jarFile, ctxt, err);
+            sourceEnc = (String) ret[0];
+            if (((Boolean) ret[1]).booleanValue()) {
+                isEncodingSpecifiedInProlog = true;
+            }
 
-	if (isXml) {
-	    // (This implies 'isExternal' is TRUE.)
-	    // We know we're dealing with a JSP document (via JSP config or
-	    // ".jspx" suffix), so we're done.
-	    return;
-	}
+            if (!isXml && sourceEnc.equals("UTF-8")) {
+                /*
+             * We don't know if we're dealing with XML or standard syntax.
+             * Therefore, we need to check to see if the page contains
+             * a <jsp:root> element.
+             *
+             * We need to be careful, because the page may be encoded in
+             * ISO-8859-1 (or something entirely different), and may
+             * contain byte sequences that will cause a UTF-8 converter to
+             * throw exceptions.
+             *
+             * It is safe to use a source encoding of ISO-8859-1 in this
+             * case, as there are no invalid byte sequences in ISO-8859-1,
+             * and the byte/character sequences we're looking for (i.e.,
+             * <jsp:root>) are identical in either encoding (both UTF-8
+             * and ISO-8859-1 are extensions of ASCII).
+             */
+                sourceEnc = "ISO-8859-1";
+                revert = true;
+            }
+        }
 
-	/*
-	 * At this point, 'isExternal' or 'isXml' is FALSE.
-	 * Search for jsp:root action, in order to determine if we're dealing 
-	 * with XML or standard syntax (unless we already know what we're 
-	 * dealing with, i.e., when 'isExternal' is TRUE and 'isXml' is FALSE).
-	 * No check for XML prolog, since nothing prevents a page from
-	 * outputting XML and still using JSP syntax (in this case, the 
-	 * XML prolog is treated as template text).
-	 */
-	JspReader jspReader = null;
-	try {
-	    jspReader = new JspReader(ctxt, absFileName, sourceEnc, jarFile,
-				      err);
-	} catch (FileNotFoundException ex) {
-	    throw new JasperException(ex);
-	}
+        if (isXml) {
+            // (This implies 'isExternal' is TRUE.)
+            // We know we're dealing with a JSP document (via JSP config or
+            // ".jspx" suffix), so we're done.
+            return;
+        }
+
+        /*
+       * At this point, 'isExternal' or 'isXml' is FALSE.
+       * Search for jsp:root action, in order to determine if we're dealing
+       * with XML or standard syntax (unless we already know what we're
+       * dealing with, i.e., when 'isExternal' is TRUE and 'isXml' is FALSE).
+       * No check for XML prolog, since nothing prevents a page from
+       * outputting XML and still using JSP syntax (in this case, the
+       * XML prolog is treated as template text).
+       */
+        JspReader jspReader = null;
+        try {
+            jspReader = new JspReader(ctxt, absFileName, sourceEnc, jarFile,
+                    err);
+        } catch (FileNotFoundException ex) {
+            throw new JasperException(ex);
+        }
         jspReader.setSingleFile(true);
         Mark startMark = jspReader.mark();
-	if (!isExternal) {
-	    jspReader.reset(startMark);
-	    if (hasJspRoot(jspReader)) {
-	        isXml = true;
-		if (revert) sourceEnc = "UTF-8";
-		return;
-	    } else {
-	        isXml = false;
-	    }
-	}
+        if (!isExternal) {
+            jspReader.reset(startMark);
+            if (hasJspRoot(jspReader)) {
+                isXml = true;
+                if (revert) sourceEnc = "UTF-8";
+                return;
+            } else {
+                isXml = false;
+            }
+        }
 
-	/*
-	 * At this point, we know we're dealing with JSP syntax.
-	 * If an XML prolog is provided, it's treated as template text.
-	 * Determine the page encoding from the page directive, unless it's
-	 * specified via JSP config.
-	 */
-	sourceEnc = jspConfigPageEnc;
-	if (sourceEnc == null) {
-	    sourceEnc = getPageEncodingForJspSyntax(jspReader, startMark);
-	    if (sourceEnc == null) {
-		// Default to "ISO-8859-1" per JSP spec
-		sourceEnc = "ISO-8859-1";
-		isDefaultPageEncoding = true;
-	    }
-	}
+        /*
+       * At this point, we know we're dealing with JSP syntax.
+       * If an XML prolog is provided, it's treated as template text.
+       * Determine the page encoding from the page directive, unless it's
+       * specified via JSP config.
+       */
+        sourceEnc = jspConfigPageEnc;
+        if (sourceEnc == null) {
+            sourceEnc = getPageEncodingForJspSyntax(jspReader, startMark);
+            if (sourceEnc == null) {
+                // Default to "ISO-8859-1" per JSP spec
+                sourceEnc = "ISO-8859-1";
+                isDefaultPageEncoding = true;
+            }
+        }
     }
-    
-    /*
-     * Determines page source encoding for page or tag file in JSP syntax,
-     * by reading (in this order) the value of the 'pageEncoding' page
-     * directive attribute, or the charset value of the 'contentType' page
-     * directive attribute.
-     *
-     * @return The page encoding, or null if not found
-     */
-    private String getPageEncodingForJspSyntax(JspReader jspReader,
-					       Mark startMark)
-	        throws JasperException {
 
-	String encoding = null;
+    /*
+    * Determines page source encoding for page or tag file in JSP syntax,
+    * by reading (in this order) the value of the 'pageEncoding' page
+    * directive attribute, or the charset value of the 'contentType' page
+    * directive attribute.
+    *
+    * @return The page encoding, or null if not found
+    */
+    private String getPageEncodingForJspSyntax(JspReader jspReader,
+                                               Mark startMark)
+            throws JasperException {
+
+        String encoding = null;
         String saveEncoding = null;
 
         jspReader.reset(startMark);
 
-	/*
-	 * Determine page encoding from directive of the form <%@ page %>,
-	 * <%@ tag %>, <jsp:directive.page > or <jsp:directive.tag >.
-	 */
+        /*
+       * Determine page encoding from directive of the form <%@ page %>,
+       * <%@ tag %>, <jsp:directive.page > or <jsp:directive.tag >.
+       */
         while (true) {
             if (jspReader.skipUntil("<") == null) {
                 break;
@@ -419,36 +420,35 @@
             }
             boolean isDirective = jspReader.matches("%@");
             if (isDirective) {
-	        jspReader.skipSpaces();
-            }
-            else {
+                jspReader.skipSpaces();
+            } else {
                 isDirective = jspReader.matches("jsp:directive.");
             }
             if (!isDirective) {
                 continue;
             }
 
-	    // compare for "tag ", so we don't match "taglib"
-	    if (jspReader.matches("tag ") || jspReader.matches("page")) {
+            // compare for "tag ", so we don't match "taglib"
+            if (jspReader.matches("tag ") || jspReader.matches("page")) {
 
-		jspReader.skipSpaces();
+                jspReader.skipSpaces();
                 Attributes attrs = Parser.parseAttributes(this, jspReader);
-		encoding = getPageEncodingFromDirective(attrs, "pageEncoding");
+                encoding = getPageEncodingFromDirective(attrs, "pageEncoding");
                 if (encoding != null) {
                     break;
                 }
-		encoding = getPageEncodingFromDirective(attrs, "contentType");
+                encoding = getPageEncodingFromDirective(attrs, "contentType");
                 if (encoding != null) {
                     saveEncoding = encoding;
                 }
-	    }
-	}
+            }
+        }
 
         if (encoding == null) {
             encoding = saveEncoding;
         }
 
-	return encoding;
+        return encoding;
     }
 
     /*
@@ -467,7 +467,7 @@
      */
     private String getPageEncodingFromDirective(Attributes attrs,
                                                 String attrName) {
-	String value = attrs.getValue(attrName);
+        String value = attrs.getValue(attrName);
         if (attrName.equals("pageEncoding")) {
             return value;
         }
@@ -476,13 +476,13 @@
         String contentType = value;
         String encoding = null;
         if (contentType != null) {
-	    int loc = contentType.indexOf(CHARSET);
-	    if (loc != -1) {
-		encoding = contentType.substring(loc + CHARSET.length());
-	    }
-	}
+            int loc = contentType.indexOf(CHARSET);
+            if (loc != -1) {
+                encoding = contentType.substring(loc + CHARSET.length());
+            }
+        }
 
-	return encoding;
+        return encoding;
     }
 
     /*
@@ -493,10 +493,10 @@
      */
     private String resolveFileName(String inFileName) {
         String fileName = inFileName.replace('\\', '/');
-	String baseDir = 
-	    fileName.substring(0, fileName.lastIndexOf("/") + 1);
-	baseDirStack.push(baseDir);
-	return fileName;
+        String baseDir =
+                fileName.substring(0, fileName.lastIndexOf("/") + 1);
+        baseDirStack.push(baseDir);
+        return fileName;
     }
 
     /*
@@ -514,67 +514,67 @@
      */
     private boolean hasJspRoot(JspReader reader) throws JasperException {
 
-	// <prefix>:root must be the first element
-	Mark start = null;
-	while ((start = reader.skipUntil("<")) != null) {
-	    int c = reader.nextChar();
-	    if (c != '!' && c != '?') break;
-	}
-	if (start == null) {
-	    return false;
-	}
-	Mark stop = reader.skipUntil(":root");
-	if (stop == null) {
-	    return false;
-	}
-	// call substring to get rid of leading '<'
-	String prefix = reader.getText(start, stop).substring(1);
+        // <prefix>:root must be the first element
+        Mark start = null;
+        while ((start = reader.skipUntil("<")) != null) {
+            int c = reader.nextChar();
+            if (c != '!' && c != '?') break;
+        }
+        if (start == null) {
+            return false;
+        }
+        Mark stop = reader.skipUntil(":root");
+        if (stop == null) {
+            return false;
+        }
+        // call substring to get rid of leading '<'
+        String prefix = reader.getText(start, stop).substring(1);
 
-	start = stop;
-	stop = reader.skipUntil(">");
-	if (stop == null) {
-	    return false;
-	}
+        start = stop;
+        stop = reader.skipUntil(">");
+        if (stop == null) {
+            return false;
+        }
 
-	// Determine namespace associated with <root> element's prefix
-	String root = reader.getText(start, stop);
-	String xmlnsDecl = "xmlns:" + prefix;
-	int index = root.indexOf(xmlnsDecl);
-	if (index == -1) {
-	    return false;
-	}
-	index += xmlnsDecl.length();
-	while (index < root.length()
-	           && Character.isWhitespace(root.charAt(index))) {
-	    index++;
-	}
-	if (index < root.length() && root.charAt(index) == '=') {
-	    index++;
-	    while (index < root.length()
-		       && Character.isWhitespace(root.charAt(index))) {
-		index++;
-	    }
-	    if (index < root.length() && root.charAt(index++) == '"'
-		    && root.regionMatches(index, JSP_URI, 0,
-					  JSP_URI.length())) {
-		return true;
-	    }
-	}
+        // Determine namespace associated with <root> element's prefix
+        String root = reader.getText(start, stop);
+        String xmlnsDecl = "xmlns:" + prefix;
+        int index = root.indexOf(xmlnsDecl);
+        if (index == -1) {
+            return false;
+        }
+        index += xmlnsDecl.length();
+        while (index < root.length()
+                && Character.isWhitespace(root.charAt(index))) {
+            index++;
+        }
+        if (index < root.length() && root.charAt(index) == '=') {
+            index++;
+            while (index < root.length()
+                    && Character.isWhitespace(root.charAt(index))) {
+                index++;
+            }
+            if (index < root.length() && root.charAt(index++) == '"'
+                    && root.regionMatches(index, JSP_URI, 0,
+                    JSP_URI.length())) {
+                return true;
+            }
+        }
 
-	return false;
+        return false;
     }
 
     private JarFile getJarFile(URL jarFileUrl) throws IOException {
-	JarFile jarFile = null;
+        JarFile jarFile = null;
 
-	if (jarFileUrl != null) {
-	    JarURLConnection conn = (JarURLConnection) jarFileUrl.openConnection();
-	    conn.setUseCaches(false);
-	    conn.connect();
-	    jarFile = conn.getJarFile();
-	}
+        if (jarFileUrl != null) {
+            JarURLConnection conn = (JarURLConnection) jarFileUrl.openConnection();
+            conn.setUseCaches(false);
+            conn.connect();
+            jarFile = conn.getJarFile();
+        }
 
-	return jarFile;
+        return jarFile;
     }
 
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ScriptingVariabler.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ScriptingVariabler.java
index 77ce15d..17ec3ef 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ScriptingVariabler.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ScriptingVariabler.java
@@ -41,17 +41,17 @@
      */
     static class CustomTagCounter extends Node.Visitor {
 
-	private int count;
-	private Node.CustomTag parent;
+        private int count;
+        private Node.CustomTag parent;
 
-	public void visit(Node.CustomTag n) throws JasperException {
-	    n.setCustomTagParent(parent);
-	    Node.CustomTag tmpParent = parent;
-	    parent = n;
-	    visitBody(n);
-	    parent = tmpParent;
-	    n.setNumCount(new Integer(count++));
-	}
+        public void visit(Node.CustomTag n) throws JasperException {
+            n.setCustomTagParent(parent);
+            Node.CustomTag tmpParent = parent;
+            parent = n;
+            visitBody(n);
+            parent = tmpParent;
+            n.setNumCount(new Integer(count++));
+        }
     }
 
     /*
@@ -60,92 +60,92 @@
      */
     static class ScriptingVariableVisitor extends Node.Visitor {
 
-	private ErrorDispatcher err;
-	private Hashtable scriptVars;
-	
-	public ScriptingVariableVisitor(ErrorDispatcher err) {
-	    this.err = err;
-	    scriptVars = new Hashtable();
-	}
+        private ErrorDispatcher err;
+        private Hashtable scriptVars;
 
-	public void visit(Node.CustomTag n) throws JasperException {
-	    setScriptingVars(n, VariableInfo.AT_BEGIN);
-	    setScriptingVars(n, VariableInfo.NESTED);
-	    visitBody(n);
-	    setScriptingVars(n, VariableInfo.AT_END);
-	}
+        public ScriptingVariableVisitor(ErrorDispatcher err) {
+            this.err = err;
+            scriptVars = new Hashtable();
+        }
 
-	private void setScriptingVars(Node.CustomTag n, int scope)
-	        throws JasperException {
+        public void visit(Node.CustomTag n) throws JasperException {
+            setScriptingVars(n, VariableInfo.AT_BEGIN);
+            setScriptingVars(n, VariableInfo.NESTED);
+            visitBody(n);
+            setScriptingVars(n, VariableInfo.AT_END);
+        }
 
-	    TagVariableInfo[] tagVarInfos = n.getTagVariableInfos();
-	    VariableInfo[] varInfos = n.getVariableInfos();
-	    if (tagVarInfos.length == 0 && varInfos.length == 0) {
-		return;
-	    }
+        private void setScriptingVars(Node.CustomTag n, int scope)
+                throws JasperException {
 
-	    Vector vec = new Vector();
+            TagVariableInfo[] tagVarInfos = n.getTagVariableInfos();
+            VariableInfo[] varInfos = n.getVariableInfos();
+            if (tagVarInfos.length == 0 && varInfos.length == 0) {
+                return;
+            }
 
-	    Integer ownRange = null;
-	    if (scope == VariableInfo.AT_BEGIN
-		    || scope == VariableInfo.AT_END) {
-		Node.CustomTag parent = n.getCustomTagParent();
-		if (parent == null)
-		    ownRange = MAX_SCOPE;
-		else
-		    ownRange = parent.getNumCount();
-	    } else {
-		// NESTED
-		ownRange = n.getNumCount();
-	    }
+            Vector vec = new Vector();
 
-	    if (varInfos.length > 0) {
-		for (int i=0; i<varInfos.length; i++) {
-		    if (varInfos[i].getScope() != scope
-			    || !varInfos[i].getDeclare()) {
-			continue;
-		    }
-		    String varName = varInfos[i].getVarName();
-		    
-		    Integer currentRange = (Integer) scriptVars.get(varName);
-		    if (currentRange == null
-			    || ownRange.compareTo(currentRange) > 0) {
-			scriptVars.put(varName, ownRange);
-			vec.add(varInfos[i]);
-		    }
-		}
-	    } else {
-		for (int i=0; i<tagVarInfos.length; i++) {
-		    if (tagVarInfos[i].getScope() != scope
-			    || !tagVarInfos[i].getDeclare()) {
-			continue;
-		    }
-		    String varName = tagVarInfos[i].getNameGiven();
-		    if (varName == null) {
-			varName = n.getTagData().getAttributeString(
-		                        tagVarInfos[i].getNameFromAttribute());
-			if (varName == null) {
-			    err.jspError(n, "jsp.error.scripting.variable.missing_name",
-					 tagVarInfos[i].getNameFromAttribute());
-			}
-		    }
+            Integer ownRange = null;
+            if (scope == VariableInfo.AT_BEGIN
+                    || scope == VariableInfo.AT_END) {
+                Node.CustomTag parent = n.getCustomTagParent();
+                if (parent == null)
+                    ownRange = MAX_SCOPE;
+                else
+                    ownRange = parent.getNumCount();
+            } else {
+                // NESTED
+                ownRange = n.getNumCount();
+            }
 
-		    Integer currentRange = (Integer) scriptVars.get(varName);
-		    if (currentRange == null
-			    || ownRange.compareTo(currentRange) > 0) {
-			scriptVars.put(varName, ownRange);
-			vec.add(tagVarInfos[i]);
-		    }
-		}
-	    }
+            if (varInfos.length > 0) {
+                for (int i = 0; i < varInfos.length; i++) {
+                    if (varInfos[i].getScope() != scope
+                            || !varInfos[i].getDeclare()) {
+                        continue;
+                    }
+                    String varName = varInfos[i].getVarName();
 
-	    n.setScriptingVars(vec, scope);
-	}
+                    Integer currentRange = (Integer) scriptVars.get(varName);
+                    if (currentRange == null
+                            || ownRange.compareTo(currentRange) > 0) {
+                        scriptVars.put(varName, ownRange);
+                        vec.add(varInfos[i]);
+                    }
+                }
+            } else {
+                for (int i = 0; i < tagVarInfos.length; i++) {
+                    if (tagVarInfos[i].getScope() != scope
+                            || !tagVarInfos[i].getDeclare()) {
+                        continue;
+                    }
+                    String varName = tagVarInfos[i].getNameGiven();
+                    if (varName == null) {
+                        varName = n.getTagData().getAttributeString(
+                                tagVarInfos[i].getNameFromAttribute());
+                        if (varName == null) {
+                            err.jspError(n, "jsp.error.scripting.variable.missing_name",
+                                    tagVarInfos[i].getNameFromAttribute());
+                        }
+                    }
+
+                    Integer currentRange = (Integer) scriptVars.get(varName);
+                    if (currentRange == null
+                            || ownRange.compareTo(currentRange) > 0) {
+                        scriptVars.put(varName, ownRange);
+                        vec.add(tagVarInfos[i]);
+                    }
+                }
+            }
+
+            n.setScriptingVars(vec, scope);
+        }
     }
 
     public static void set(Node.Nodes page, ErrorDispatcher err)
-	    throws JasperException {
-	page.visit(new CustomTagCounter());
-	page.visit(new ScriptingVariableVisitor(err));
+            throws JasperException {
+        page.visit(new CustomTagCounter());
+        page.visit(new ScriptingVariableVisitor(err));
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ServletWriter.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ServletWriter.java
index 4aef0aa..420f6a4 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ServletWriter.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/ServletWriter.java
@@ -20,7 +20,7 @@
 import java.io.PrintWriter;
 
 /**
- * This is what is used to generate servlets. 
+ * This is what is used to generate servlets.
  *
  * @author Anil K. Vijendran
  * @author Kin-man Chung
@@ -35,20 +35,20 @@
 
     // The sink writer:
     PrintWriter writer;
-    
+
     // servlet line numbers start from 1
     private int javaLine = 1;
 
 
     public ServletWriter(PrintWriter writer) {
-	this.writer = writer;
+        this.writer = writer;
     }
 
     public void close() throws IOException {
-	writer.close();
+        writer.close();
     }
 
-    
+
     // -------------------- Access informations --------------------
 
     public int getJavaLine() {
@@ -59,30 +59,31 @@
     // -------------------- Formatting --------------------
 
     public void pushIndent() {
-	virtual_indent += TAB_WIDTH;
-	if (virtual_indent >= 0 && virtual_indent <= SPACES.length())
-	    indent = virtual_indent;
+        virtual_indent += TAB_WIDTH;
+        if (virtual_indent >= 0 && virtual_indent <= SPACES.length())
+            indent = virtual_indent;
     }
 
     public void popIndent() {
-	virtual_indent -= TAB_WIDTH;
-	if (virtual_indent >= 0 && virtual_indent <= SPACES.length())
-	    indent = virtual_indent;
+        virtual_indent -= TAB_WIDTH;
+        if (virtual_indent >= 0 && virtual_indent <= SPACES.length())
+            indent = virtual_indent;
     }
 
     /**
      * Print a standard comment for echo outputed chunk.
-     * @param start The starting position of the JSP chunk being processed. 
-     * @param stop  The ending position of the JSP chunk being processed. 
+     *
+     * @param start The starting position of the JSP chunk being processed.
+     * @param stop  The ending position of the JSP chunk being processed.
      */
     public void printComment(Mark start, Mark stop, char[] chars) {
         if (start != null && stop != null) {
-            println("// from="+start);
-            println("//   to="+stop);
+            println("// from=" + start);
+            println("//   to=" + stop);
         }
-        
+
         if (chars != null)
-            for(int i = 0; i < chars.length;) {
+            for (int i = 0; i < chars.length;) {
                 printin();
                 print("// ");
                 while (chars[i] != '\n' && i < chars.length)
@@ -95,7 +96,7 @@
      */
     public void println(String s) {
         javaLine++;
-	writer.println(s);
+        writer.println(s);
     }
 
     /**
@@ -103,22 +104,22 @@
      */
     public void println() {
         javaLine++;
-	writer.println("");
+        writer.println("");
     }
 
     /**
      * Prints the current indention
      */
     public void printin() {
-	writer.print(SPACES.substring(0, indent));
+        writer.print(SPACES.substring(0, indent));
     }
 
     /**
      * Prints the current indention, followed by the given string
      */
     public void printin(String s) {
-	writer.print(SPACES.substring(0, indent));
-	writer.print(s);
+        writer.print(SPACES.substring(0, indent));
+        writer.print(s);
     }
 
     /**
@@ -126,39 +127,39 @@
      */
     public void printil(String s) {
         javaLine++;
-	writer.print(SPACES.substring(0, indent));
-	writer.println(s);
+        writer.print(SPACES.substring(0, indent));
+        writer.println(s);
     }
 
     /**
      * Prints the given char.
-     *
+     * <p/>
      * Use println() to print a '\n'.
      */
     public void print(char c) {
-	writer.print(c);
+        writer.print(c);
     }
 
     /**
      * Prints the given int.
      */
     public void print(int i) {
-	writer.print(i);
+        writer.print(i);
     }
 
     /**
      * Prints the given string.
-     *
+     * <p/>
      * The string must not contain any '\n', otherwise the line count will be
      * off.
      */
     public void print(String s) {
-	writer.print(s);
+        writer.print(s);
     }
 
     /**
      * Prints the given string.
-     *
+     * <p/>
      * If the string spans multiple lines, the line count will be adjusted
      * accordingly.
      */
@@ -166,11 +167,11 @@
         int index = 0;
 
         // look for hidden newlines inside strings
-        while ((index=s.indexOf('\n',index)) > -1 ) {
+        while ((index = s.indexOf('\n', index)) > -1) {
             javaLine++;
             index++;
         }
 
-	writer.print(s);
+        writer.print(s);
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapGenerator.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapGenerator.java
index 0bae58e..53e76f4 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapGenerator.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapGenerator.java
@@ -24,7 +24,7 @@
  * Represents a source map (SMAP), which serves to associate lines
  * of the input JSP file(s) to lines in the generated servlet in the
  * final .class file, according to the JSR-045 spec.
- * 
+ *
  * @author Shawn Bayern
  */
 public class SmapGenerator {
@@ -59,7 +59,7 @@
      * source file.  E.g., "foo$jsp.java".
      */
     public synchronized void setOutputFileName(String x) {
-	outputFileName = x;
+        outputFileName = x;
     }
 
     /**
@@ -69,29 +69,29 @@
      * stratum is made the default stratum, overriding any previously
      * set default.
      *
-     * @param stratum the SmapStratum object to add
+     * @param stratum        the SmapStratum object to add
      * @param defaultStratum if <tt>true</tt>, this SmapStratum is considered
-     *                to represent the default SMAP stratum unless
-     *                overwritten
+     *                       to represent the default SMAP stratum unless
+     *                       overwritten
      */
     public synchronized void addStratum(SmapStratum stratum,
-					boolean defaultStratum) {
-	strata.add(stratum);
-	if (defaultStratum)
-	    this.defaultStratum = stratum.getStratumName();
+                                        boolean defaultStratum) {
+        strata.add(stratum);
+        if (defaultStratum)
+            this.defaultStratum = stratum.getStratumName();
     }
 
     /**
      * Adds the given string as an embedded SMAP with the given stratum name.
      *
-     * @param smap the SMAP to embed
+     * @param smap        the SMAP to embed
      * @param stratumName the name of the stratum output by the compilation
      *                    that produced the <tt>smap</tt> to be embedded
      */
     public synchronized void addSmap(String smap, String stratumName) {
-	embedded.add("*O " + stratumName + "\n"
-		   + smap
-		   + "*C " + stratumName + "\n");
+        embedded.add("*O " + stratumName + "\n"
+                + smap
+                + "*C " + stratumName + "\n");
     }
 
     /**
@@ -101,71 +101,73 @@
      * @param status If <tt>false</tt>, ignore any embedded SMAPs.
      */
     public void setDoEmbedded(boolean status) {
-	doEmbedded = status;
+        doEmbedded = status;
     }
 
     //*********************************************************************
     // Methods for serializing the logical SMAP
 
     public synchronized String getString() {
-	// check state and initialize buffer
-	if (outputFileName == null)
-	    throw new IllegalStateException();
+        // check state and initialize buffer
+        if (outputFileName == null)
+            throw new IllegalStateException();
         StringBuffer out = new StringBuffer();
 
-	// start the SMAP
-	out.append("SMAP\n");
-	out.append(outputFileName + '\n');
-	out.append(defaultStratum + '\n');
+        // start the SMAP
+        out.append("SMAP\n");
+        out.append(outputFileName + '\n');
+        out.append(defaultStratum + '\n');
 
-	// include embedded SMAPs
-	if (doEmbedded) {
-	    int nEmbedded = embedded.size();
-	    for (int i = 0; i < nEmbedded; i++) {
-	        out.append(embedded.get(i));
-	    }
-	}
+        // include embedded SMAPs
+        if (doEmbedded) {
+            int nEmbedded = embedded.size();
+            for (int i = 0; i < nEmbedded; i++) {
+                out.append(embedded.get(i));
+            }
+        }
 
-	// print our StratumSections, FileSections, and LineSections
-	int nStrata = strata.size();
-	for (int i = 0; i < nStrata; i++) {
-	    SmapStratum s = (SmapStratum) strata.get(i);
-	    out.append(s.getString());
-	}
+        // print our StratumSections, FileSections, and LineSections
+        int nStrata = strata.size();
+        for (int i = 0; i < nStrata; i++) {
+            SmapStratum s = (SmapStratum) strata.get(i);
+            out.append(s.getString());
+        }
 
-	// end the SMAP
-	out.append("*E\n");
+        // end the SMAP
+        out.append("*E\n");
 
-	return out.toString();
+        return out.toString();
     }
 
-    public String toString() { return getString(); }
+    public String toString() {
+        return getString();
+    }
 
     //*********************************************************************
     // For testing (and as an example of use)...
 
     public static void main(String args[]) {
-	SmapGenerator g = new SmapGenerator();
-	g.setOutputFileName("foo.java");
-	SmapStratum s = new SmapStratum("JSP");
-	s.addFile("foo.jsp");
-	s.addFile("bar.jsp", "/foo/foo/bar.jsp");
-	s.addLineData(1, "foo.jsp", 1, 1, 1);
-	s.addLineData(2, "foo.jsp", 1, 6, 1);
-	s.addLineData(3, "foo.jsp", 2, 10, 5);
-	s.addLineData(20, "bar.jsp", 1, 30, 1);
-	g.addStratum(s, true);
-	System.out.print(g);
+        SmapGenerator g = new SmapGenerator();
+        g.setOutputFileName("foo.java");
+        SmapStratum s = new SmapStratum("JSP");
+        s.addFile("foo.jsp");
+        s.addFile("bar.jsp", "/foo/foo/bar.jsp");
+        s.addLineData(1, "foo.jsp", 1, 1, 1);
+        s.addLineData(2, "foo.jsp", 1, 6, 1);
+        s.addLineData(3, "foo.jsp", 2, 10, 5);
+        s.addLineData(20, "bar.jsp", 1, 30, 1);
+        g.addStratum(s, true);
+        System.out.print(g);
 
-	System.out.println("---");
+        System.out.println("---");
 
-	SmapGenerator embedded = new SmapGenerator();
-	embedded.setOutputFileName("blargh.tier2");
-	s = new SmapStratum("Tier2");
-	s.addFile("1.tier2");
-	s.addLineData(1, "1.tier2", 1, 1, 1);
-	embedded.addStratum(s, true);
-	g.addSmap(embedded.toString(), "JSP");
-	System.out.println(g);
+        SmapGenerator embedded = new SmapGenerator();
+        embedded.setOutputFileName("blargh.tier2");
+        s = new SmapStratum("Tier2");
+        s.addFile("1.tier2");
+        s.addLineData(1, "1.tier2", 1, 1, 1);
+        embedded.addStratum(s, true);
+        g.addSmap(embedded.toString(), "JSP");
+        System.out.println(g);
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapStratum.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapStratum.java
index e5973ec..7cb1ad0 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapStratum.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapStratum.java
@@ -44,14 +44,18 @@
         private int outputLineIncrement = 1;
         private boolean lineFileIDSet = false;
 
-        /** Sets InputStartLine. */
+        /**
+         * Sets InputStartLine.
+         */
         public void setInputStartLine(int inputStartLine) {
             if (inputStartLine < 0)
                 throw new IllegalArgumentException("" + inputStartLine);
             this.inputStartLine = inputStartLine;
         }
 
-        /** Sets OutputStartLine. */
+        /**
+         * Sets OutputStartLine.
+         */
         public void setOutputStartLine(int outputStartLine) {
             if (outputStartLine < 0)
                 throw new IllegalArgumentException("" + outputStartLine);
@@ -59,11 +63,11 @@
         }
 
         /**
-             * Sets lineFileID.  Should be called only when different from
-             * that of prior LineInfo object (in any given context) or 0
-             * if the current LineInfo has no (logical) predecessor.
-             * <tt>LineInfo</tt> will print this file number no matter what.
-             */
+         * Sets lineFileID.  Should be called only when different from
+         * that of prior LineInfo object (in any given context) or 0
+         * if the current LineInfo has no (logical) predecessor.
+         * <tt>LineInfo</tt> will print this file number no matter what.
+         */
         public void setLineFileID(int lineFileID) {
             if (lineFileID < 0)
                 throw new IllegalArgumentException("" + lineFileID);
@@ -71,14 +75,18 @@
             this.lineFileIDSet = true;
         }
 
-        /** Sets InputLineCount. */
+        /**
+         * Sets InputLineCount.
+         */
         public void setInputLineCount(int inputLineCount) {
             if (inputLineCount < 0)
                 throw new IllegalArgumentException("" + inputLineCount);
             this.inputLineCount = inputLineCount;
         }
 
-        /** Sets OutputLineIncrement. */
+        /**
+         * Sets OutputLineIncrement.
+         */
         public void setOutputLineIncrement(int outputLineIncrement) {
             if (outputLineIncrement < 0)
                 throw new IllegalArgumentException("" + outputLineIncrement);
@@ -180,19 +188,19 @@
         //outputLineIncrement, if possible
         int i = 0;
         while (i < lineData.size() - 1) {
-            LineInfo li = (LineInfo)lineData.get(i);
-            LineInfo liNext = (LineInfo)lineData.get(i + 1);
+            LineInfo li = (LineInfo) lineData.get(i);
+            LineInfo liNext = (LineInfo) lineData.get(i + 1);
             if (!liNext.lineFileIDSet
-                && liNext.inputStartLine == li.inputStartLine
-                && liNext.inputLineCount == 1
-                && li.inputLineCount == 1
-                && liNext.outputStartLine
+                    && liNext.inputStartLine == li.inputStartLine
+                    && liNext.inputLineCount == 1
+                    && li.inputLineCount == 1
+                    && liNext.outputStartLine
                     == li.outputStartLine
-                        + li.inputLineCount * li.outputLineIncrement) {
+                    + li.inputLineCount * li.outputLineIncrement) {
                 li.setOutputLineIncrement(
-                    liNext.outputStartLine
-                        - li.outputStartLine
-                        + liNext.outputLineIncrement);
+                        liNext.outputStartLine
+                                - li.outputStartLine
+                                + liNext.outputLineIncrement);
                 lineData.remove(i + 1);
             } else {
                 i++;
@@ -203,14 +211,14 @@
         //inputLineCount, if possible
         i = 0;
         while (i < lineData.size() - 1) {
-            LineInfo li = (LineInfo)lineData.get(i);
-            LineInfo liNext = (LineInfo)lineData.get(i + 1);
+            LineInfo li = (LineInfo) lineData.get(i);
+            LineInfo liNext = (LineInfo) lineData.get(i + 1);
             if (!liNext.lineFileIDSet
-                && liNext.inputStartLine == li.inputStartLine + li.inputLineCount
-                && liNext.outputLineIncrement == li.outputLineIncrement
-                && liNext.outputStartLine
+                    && liNext.inputStartLine == li.inputStartLine + li.inputLineCount
+                    && liNext.outputLineIncrement == li.outputLineIncrement
+                    && liNext.outputStartLine
                     == li.outputStartLine
-                        + li.inputLineCount * li.outputLineIncrement) {
+                    + li.inputLineCount * li.outputLineIncrement) {
                 li.setInputLineCount(li.inputLineCount + liNext.inputLineCount);
                 lineData.remove(i + 1);
             } else {
@@ -227,32 +235,32 @@
      * not for programmer convenience.  Could always add utility methods
      * later.)
      *
-     * @param inputStartLine starting line in the source file
-     *        (SMAP <tt>InputStartLine</tt>)
-     * @param inputFileName the filepath (or name) from which the input comes
-     *        (yields SMAP <tt>LineFileID</tt>)  Use unqualified names
-     *        carefully, and only when they uniquely identify a file.
-     * @param inputLineCount the number of lines in the input to map
-     *        (SMAP <tt>LineFileCount</tt>)
-     * @param outputStartLine starting line in the output file 
-     *        (SMAP <tt>OutputStartLine</tt>)
+     * @param inputStartLine      starting line in the source file
+     *                            (SMAP <tt>InputStartLine</tt>)
+     * @param inputFileName       the filepath (or name) from which the input comes
+     *                            (yields SMAP <tt>LineFileID</tt>)  Use unqualified names
+     *                            carefully, and only when they uniquely identify a file.
+     * @param inputLineCount      the number of lines in the input to map
+     *                            (SMAP <tt>LineFileCount</tt>)
+     * @param outputStartLine     starting line in the output file
+     *                            (SMAP <tt>OutputStartLine</tt>)
      * @param outputLineIncrement number of output lines to map to each
-     *        input line (SMAP <tt>OutputLineIncrement</tt>).  <i>Given the
-     *        fact that the name starts with "output", I continuously have
-     *        the subconscious urge to call this field
-     *        <tt>OutputLineExcrement</tt>.</i>
+     *                            input line (SMAP <tt>OutputLineIncrement</tt>).  <i>Given the
+     *                            fact that the name starts with "output", I continuously have
+     *                            the subconscious urge to call this field
+     *                            <tt>OutputLineExcrement</tt>.</i>
      */
     public void addLineData(
-        int inputStartLine,
-        String inputFileName,
-        int inputLineCount,
-        int outputStartLine,
-        int outputLineIncrement) {
+            int inputStartLine,
+            String inputFileName,
+            int inputLineCount,
+            int outputStartLine,
+            int outputLineIncrement) {
         // check the input - what are you doing here??
         int fileIndex = filePathList.indexOf(inputFileName);
         if (fileIndex == -1) // still
             throw new IllegalArgumentException(
-                "inputFileName: " + inputFileName);
+                    "inputFileName: " + inputFileName);
 
         //Jasper incorrectly SMAPs certain Nodes, giving them an 
         //outputStartLine of 0.  This can cause a fatal error in
@@ -308,7 +316,7 @@
                 out.append("+ " + i + " " + fileNameList.get(i) + "\n");
                 // Source paths must be relative, not absolute, so we
                 // remove the leading "/", if one exists.
-                String filePath = (String)filePathList.get(i);
+                String filePath = (String) filePathList.get(i);
                 if (filePath.startsWith("/")) {
                     filePath = filePath.substring(1);
                 }
@@ -322,7 +330,7 @@
         out.append("*L\n");
         bound = lineData.size();
         for (int i = 0; i < bound; i++) {
-            LineInfo li = (LineInfo)lineData.get(i);
+            LineInfo li = (LineInfo) lineData.get(i);
             out.append(li.getString());
         }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapUtil.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapUtil.java
index 84dbe60..17d0600 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapUtil.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/SmapUtil.java
@@ -17,6 +17,8 @@
 
 package org.apache.struts2.jasper.compiler;
 
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.JasperException;
 import org.apache.struts2.jasper.JspCompilationContext;
 
@@ -28,7 +30,7 @@
 /**
  * Contains static utilities for generating SMAP data based on the
  * current version of Jasper.
- * 
+ *
  * @author Jayson Falkner
  * @author Shawn Bayern
  * @author Robert Field (inner SDEInstaller class)
@@ -37,8 +39,7 @@
  */
 public class SmapUtil {
 
-    private org.apache.commons.logging.Log log=
-        org.apache.commons.logging.LogFactory.getLog( SmapUtil.class );
+    private Logger log = LoggerFactory.getLogger(SmapUtil.class);
 
     //*********************************************************************
     // Constants
@@ -52,14 +53,14 @@
      * Generates an appropriate SMAP representing the current compilation
      * context.  (JSR-045.)
      *
-     * @param ctxt Current compilation context
+     * @param ctxt      Current compilation context
      * @param pageNodes The current JSP page
      * @return a SMAP for the page
      */
     public static String[] generateSmap(
-        JspCompilationContext ctxt,
-        Node.Nodes pageNodes)
-        throws IOException {
+            JspCompilationContext ctxt,
+            Node.Nodes pageNodes)
+            throws IOException {
 
         // Scan the nodes for presence of Jasper generated inner classes
         PreScanVisitor psVisitor = new PreScanVisitor();
@@ -71,22 +72,22 @@
 
         // set up our SMAP generator
         SmapGenerator g = new SmapGenerator();
-        
+
         /** Disable reading of input SMAP because:
-            1. There is a bug here: getRealPath() is null if .jsp is in a jar
-        	Bugzilla 14660.
-            2. Mappings from other sources into .jsp files are not supported.
-            TODO: fix 1. if 2. is not true.
-        // determine if we have an input SMAP
-        String smapPath = inputSmapPath(ctxt.getRealPath(ctxt.getJspFile()));
-            File inputSmap = new File(smapPath);
-            if (inputSmap.exists()) {
-                byte[] embeddedSmap = null;
-            byte[] subSmap = SDEInstaller.readWhole(inputSmap);
-            String subSmapString = new String(subSmap, SMAP_ENCODING);
-            g.addSmap(subSmapString, "JSP");
-        }
-        **/
+         1. There is a bug here: getRealPath() is null if .jsp is in a jar
+         Bugzilla 14660.
+         2. Mappings from other sources into .jsp files are not supported.
+         TODO: fix 1. if 2. is not true.
+         // determine if we have an input SMAP
+         String smapPath = inputSmapPath(ctxt.getRealPath(ctxt.getJspFile()));
+         File inputSmap = new File(smapPath);
+         if (inputSmap.exists()) {
+         byte[] embeddedSmap = null;
+         byte[] subSmap = SDEInstaller.readWhole(inputSmap);
+         String subSmapString = new String(subSmap, SMAP_ENCODING);
+         g.addSmap(subSmapString, "JSP");
+         }
+         **/
 
         // now, assemble info about our own stratum (JSP) using JspLineMap
         SmapStratum s = new SmapStratum("JSP");
@@ -101,17 +102,17 @@
         if (ctxt.getOptions().isSmapDumped()) {
             File outSmap = new File(ctxt.getClassFileName() + ".smap");
             PrintWriter so =
-                new PrintWriter(
-                    new OutputStreamWriter(
-                        new FileOutputStream(outSmap),
-                        SMAP_ENCODING));
+                    new PrintWriter(
+                            new OutputStreamWriter(
+                                    new FileOutputStream(outSmap),
+                                    SMAP_ENCODING));
             so.print(g.getString());
             so.close();
         }
 
         String classFileName = ctxt.getClassFileName();
         int innerClassCount = map.size();
-        String [] smapInfo = new String[2 + innerClassCount*2];
+        String[] smapInfo = new String[2 + innerClassCount * 2];
         smapInfo[0] = classFileName;
         smapInfo[1] = g.getString();
 
@@ -127,20 +128,20 @@
             g.addStratum(s, true);
 
             String innerClassFileName =
-                classFileName.substring(0, classFileName.indexOf(".class")) +
-                '$' + innerClass + ".class";
+                    classFileName.substring(0, classFileName.indexOf(".class")) +
+                            '$' + innerClass + ".class";
             if (ctxt.getOptions().isSmapDumped()) {
                 File outSmap = new File(innerClassFileName + ".smap");
                 PrintWriter so =
-                    new PrintWriter(
-                        new OutputStreamWriter(
-                            new FileOutputStream(outSmap),
-                            SMAP_ENCODING));
+                        new PrintWriter(
+                                new OutputStreamWriter(
+                                        new FileOutputStream(outSmap),
+                                        SMAP_ENCODING));
                 so.print(g.getString());
                 so.close();
             }
             smapInfo[count] = innerClassFileName;
-            smapInfo[count+1] = g.getString();
+            smapInfo[count + 1] = g.getString();
             count += 2;
         }
 
@@ -148,14 +149,14 @@
     }
 
     public static void installSmap(String[] smap)
-        throws IOException {
+            throws IOException {
         if (smap == null) {
             return;
         }
 
         for (int i = 0; i < smap.length; i += 2) {
             File outServlet = new File(smap[i]);
-            SDEInstaller.install(outServlet, smap[i+1].getBytes());
+            SDEInstaller.install(outServlet, smap[i + 1].getBytes());
         }
     }
 
@@ -182,8 +183,7 @@
     // Installation logic (from Robert Field, JSR-045 spec lead)
     private static class SDEInstaller {
 
-        private org.apache.commons.logging.Log log=
-            org.apache.commons.logging.LogFactory.getLog( SDEInstaller.class );
+        private Logger log = LoggerFactory.getLogger(SDEInstaller.class);
 
         static final String nameSDE = "SourceDebugExtension";
 
@@ -201,24 +201,24 @@
                 install(new File(args[0]), new File(args[1]));
             } else if (args.length == 3) {
                 install(
-                    new File(args[0]),
-                    new File(args[1]),
-                    new File(args[2]));
+                        new File(args[0]),
+                        new File(args[1]),
+                        new File(args[2]));
             } else {
                 System.err.println(
-                    "Usage: <command> <input class file> "
-                        + "<attribute file> <output class file name>\n"
-                        + "<command> <input/output class file> <attribute file>");
+                        "Usage: <command> <input class file> "
+                                + "<attribute file> <output class file name>\n"
+                                + "<command> <input/output class file> <attribute file>");
             }
         }
 
         static void install(File inClassFile, File attrFile, File outClassFile)
-            throws IOException {
+                throws IOException {
             new SDEInstaller(inClassFile, attrFile, outClassFile);
         }
 
         static void install(File inOutClassFile, File attrFile)
-            throws IOException {
+                throws IOException {
             File tmpFile = new File(inOutClassFile.getPath() + "tmp");
             new SDEInstaller(inOutClassFile, attrFile, tmpFile);
             if (!inOutClassFile.delete()) {
@@ -241,7 +241,7 @@
         }
 
         SDEInstaller(File inClassFile, byte[] sdeAttr, File outClassFile)
-            throws IOException {
+                throws IOException {
             if (!inClassFile.exists()) {
                 throw new FileNotFoundException("no such file: " + inClassFile);
             }
@@ -261,13 +261,13 @@
         }
 
         SDEInstaller(File inClassFile, File attrFile, File outClassFile)
-            throws IOException {
+                throws IOException {
             this(inClassFile, readWhole(attrFile), outClassFile);
         }
 
         static byte[] readWhole(File input) throws IOException {
             FileInputStream inStream = new FileInputStream(input);
-            int len = (int)input.length();
+            int len = (int) input.length();
             byte[] bytes = new byte[len];
             if (inStream.read(bytes, 0, len) != len) {
                 throw new IOException("expected size: " + len);
@@ -378,7 +378,7 @@
         }
 
         int readU1() {
-            return ((int)orig[origPos++]) & 0xFF;
+            return ((int) orig[origPos++]) & 0xFF;
         }
 
         int readU2() {
@@ -392,7 +392,7 @@
         }
 
         void writeU1(int val) {
-            gen[genPos++] = (byte)val;
+            gen[genPos++] = (byte) val;
         }
 
         void writeU2(int val) {
@@ -426,37 +426,37 @@
         }
 
         int copyConstantPool(int constantPoolCount)
-            throws UnsupportedEncodingException, IOException {
+                throws UnsupportedEncodingException, IOException {
             int sdeIndex = -1;
             // copy const pool index zero not in class file
             for (int i = 1; i < constantPoolCount; ++i) {
                 int tag = readU1();
                 writeU1(tag);
                 switch (tag) {
-                    case 7 : // Class
-                    case 8 : // String
+                    case 7: // Class
+                    case 8: // String
                         if (log.isDebugEnabled())
                             log.debug(i + " copying 2 bytes");
                         copy(2);
                         break;
-                    case 9 : // Field
-                    case 10 : // Method
-                    case 11 : // InterfaceMethod
-                    case 3 : // Integer
-                    case 4 : // Float
-                    case 12 : // NameAndType
+                    case 9: // Field
+                    case 10: // Method
+                    case 11: // InterfaceMethod
+                    case 3: // Integer
+                    case 4: // Float
+                    case 12: // NameAndType
                         if (log.isDebugEnabled())
                             log.debug(i + " copying 4 bytes");
                         copy(4);
                         break;
-                    case 5 : // Long
-                    case 6 : // Double
+                    case 5: // Long
+                    case 6: // Double
                         if (log.isDebugEnabled())
                             log.debug(i + " copying 8 bytes");
                         copy(8);
                         i++;
                         break;
-                    case 1 : // Utf8
+                    case 1: // Utf8
                         int len = readU2();
                         writeU2(len);
                         byte[] utf8 = readBytes(len);
@@ -468,7 +468,7 @@
                         }
                         writeBytes(utf8);
                         break;
-                    default :
+                    default:
                         throw new IOException("unexpected tag: " + tag);
                 }
             }
@@ -486,10 +486,10 @@
     }
 
     public static void evaluateNodes(
-        Node.Nodes nodes,
-        SmapStratum s,
-        HashMap innerClassMap,
-        boolean breakAtLF) {
+            Node.Nodes nodes,
+            SmapStratum s,
+            HashMap innerClassMap,
+            boolean breakAtLF) {
         try {
             nodes.visit(new SmapGenVisitor(s, breakAtLF, innerClassMap));
         } catch (JasperException ex) {
@@ -616,9 +616,9 @@
             //Add a LineInfo that corresponds to the beginning of this node
             int iInputStartLine = mark.getLineNumber();
             int iOutputStartLine = n.getBeginJavaLine();
-            int iOutputLineIncrement = breakAtLF? 1: 0;
-            smap.addLineData(iInputStartLine, fileName, 1, iOutputStartLine, 
-                             iOutputLineIncrement);
+            int iOutputLineIncrement = breakAtLF ? 1 : 0;
+            smap.addLineData(iInputStartLine, fileName, 1, iOutputStartLine,
+                    iOutputLineIncrement);
 
             // Output additional mappings in the text
             java.util.ArrayList extraSmap = n.getExtraSmap();
@@ -627,20 +627,20 @@
                 for (int i = 0; i < extraSmap.size(); i++) {
                     iOutputStartLine += iOutputLineIncrement;
                     smap.addLineData(
-                        iInputStartLine+((Integer)extraSmap.get(i)).intValue(),
-                        fileName,
-                        1,
-                        iOutputStartLine,
-                        iOutputLineIncrement);
+                            iInputStartLine + ((Integer) extraSmap.get(i)).intValue(),
+                            fileName,
+                            1,
+                            iOutputStartLine,
+                            iOutputLineIncrement);
                 }
             }
         }
 
         private void doSmap(
-            Node n,
-            int inLineCount,
-            int outIncrement,
-            int skippedLines) {
+                Node n,
+                int inLineCount,
+                int outIncrement,
+                int skippedLines) {
             Mark mark = n.getStart();
             if (mark == null) {
                 return;
@@ -649,11 +649,11 @@
             String unqualifiedName = unqualify(mark.getFile());
             smap.addFile(unqualifiedName, mark.getFile());
             smap.addLineData(
-                mark.getLineNumber() + skippedLines,
-                mark.getFile(),
-                inLineCount - skippedLines,
-                n.getBeginJavaLine() + skippedLines,
-                outIncrement);
+                    mark.getLineNumber() + skippedLines,
+                    mark.getFile(),
+                    inLineCount - skippedLines,
+                    n.getBeginJavaLine() + skippedLines,
+                    outIncrement);
         }
 
         private void doSmap(Node n) {
@@ -718,5 +718,5 @@
             return map;
         }
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java
index 8063958..25830cd 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java
@@ -49,35 +49,35 @@
     private static class TagFileDirectiveVisitor extends Node.Visitor {
 
         private static final JspUtil.ValidAttribute[] tagDirectiveAttrs = {
-            new JspUtil.ValidAttribute("display-name"),
-            new JspUtil.ValidAttribute("body-content"),
-            new JspUtil.ValidAttribute("dynamic-attributes"),
-            new JspUtil.ValidAttribute("small-icon"),
-            new JspUtil.ValidAttribute("large-icon"),
-            new JspUtil.ValidAttribute("description"),
-            new JspUtil.ValidAttribute("example"),
-            new JspUtil.ValidAttribute("pageEncoding"),
-            new JspUtil.ValidAttribute("language"),
-            new JspUtil.ValidAttribute("import"),
-            new JspUtil.ValidAttribute("isELIgnored") };
+                new JspUtil.ValidAttribute("display-name"),
+                new JspUtil.ValidAttribute("body-content"),
+                new JspUtil.ValidAttribute("dynamic-attributes"),
+                new JspUtil.ValidAttribute("small-icon"),
+                new JspUtil.ValidAttribute("large-icon"),
+                new JspUtil.ValidAttribute("description"),
+                new JspUtil.ValidAttribute("example"),
+                new JspUtil.ValidAttribute("pageEncoding"),
+                new JspUtil.ValidAttribute("language"),
+                new JspUtil.ValidAttribute("import"),
+                new JspUtil.ValidAttribute("isELIgnored")};
 
         private static final JspUtil.ValidAttribute[] attributeDirectiveAttrs = {
-            new JspUtil.ValidAttribute("name", true),
-            new JspUtil.ValidAttribute("required"),
-            new JspUtil.ValidAttribute("fragment"),
-            new JspUtil.ValidAttribute("rtexprvalue"),
-            new JspUtil.ValidAttribute("type"),
-            new JspUtil.ValidAttribute("description")
+                new JspUtil.ValidAttribute("name", true),
+                new JspUtil.ValidAttribute("required"),
+                new JspUtil.ValidAttribute("fragment"),
+                new JspUtil.ValidAttribute("rtexprvalue"),
+                new JspUtil.ValidAttribute("type"),
+                new JspUtil.ValidAttribute("description")
         };
 
         private static final JspUtil.ValidAttribute[] variableDirectiveAttrs = {
-            new JspUtil.ValidAttribute("name-given"),
-            new JspUtil.ValidAttribute("name-from-attribute"),
-            new JspUtil.ValidAttribute("alias"),
-            new JspUtil.ValidAttribute("variable-class"),
-            new JspUtil.ValidAttribute("scope"),
-            new JspUtil.ValidAttribute("declare"),
-            new JspUtil.ValidAttribute("description")
+                new JspUtil.ValidAttribute("name-given"),
+                new JspUtil.ValidAttribute("name-from-attribute"),
+                new JspUtil.ValidAttribute("alias"),
+                new JspUtil.ValidAttribute("variable-class"),
+                new JspUtil.ValidAttribute("scope"),
+                new JspUtil.ValidAttribute("declare"),
+                new JspUtil.ValidAttribute("description")
         };
 
         private ErrorDispatcher err;
@@ -93,20 +93,20 @@
         private String largeIcon = null;
         private String dynamicAttrsMapName;
         private String example = null;
-        
+
         private Vector attributeVector;
         private Vector variableVector;
 
         private static final String ATTR_NAME =
-            "the name attribute of the attribute directive";
+                "the name attribute of the attribute directive";
         private static final String VAR_NAME_GIVEN =
-            "the name-given attribute of the variable directive";
+                "the name-given attribute of the variable directive";
         private static final String VAR_NAME_FROM =
-            "the name-from-attribute attribute of the variable directive";
+                "the name-from-attribute attribute of the variable directive";
         private static final String VAR_ALIAS =
-            "the alias attribute of the variable directive";
+                "the alias attribute of the variable directive";
         private static final String TAG_DYNAMIC =
-            "the dynamic-attributes attribute of the tag directive";
+                "the dynamic-attributes attribute of the tag directive";
         private HashMap nameTable = new HashMap();
         private HashMap nameFromTable = new HashMap();
 
@@ -125,7 +125,7 @@
         public void visit(Node.TagDirective n) throws JasperException {
 
             JspUtil.checkAttributes("Tag directive", n, tagDirectiveAttrs,
-                                    err);
+                    err);
 
             bodycontent = checkConflict(n, bodycontent, "body-content");
             if (bodycontent != null &&
@@ -133,10 +133,10 @@
                     !bodycontent.equalsIgnoreCase(TagInfo.BODY_CONTENT_TAG_DEPENDENT) &&
                     !bodycontent.equalsIgnoreCase(TagInfo.BODY_CONTENT_SCRIPTLESS)) {
                 err.jspError(n, "jsp.error.tagdirective.badbodycontent",
-                             bodycontent);
+                        bodycontent);
             }
             dynamicAttrsMapName = checkConflict(n, dynamicAttrsMapName,
-                                                "dynamic-attributes");
+                    "dynamic-attributes");
             if (dynamicAttrsMapName != null) {
                 checkUniqueName(dynamicAttrsMapName, TAG_DYNAMIC, n);
             }
@@ -155,29 +155,29 @@
             if (attrValue != null) {
                 if (oldAttrValue != null && !oldAttrValue.equals(attrValue)) {
                     err.jspError(n, "jsp.error.tag.conflict.attr", attr,
-                                 oldAttrValue, attrValue);
+                            oldAttrValue, attrValue);
                 }
                 result = attrValue;
             }
             return result;
         }
-            
+
 
         public void visit(Node.AttributeDirective n) throws JasperException {
 
             JspUtil.checkAttributes("Attribute directive", n,
-                                    attributeDirectiveAttrs, err);
+                    attributeDirectiveAttrs, err);
 
             String attrName = n.getAttributeValue("name");
             boolean required = JspUtil.booleanValue(
-                                        n.getAttributeValue("required"));
+                    n.getAttributeValue("required"));
             boolean rtexprvalue = true;
             String rtexprvalueString = n.getAttributeValue("rtexprvalue");
             if (rtexprvalueString != null) {
-                rtexprvalue = JspUtil.booleanValue( rtexprvalueString );
+                rtexprvalue = JspUtil.booleanValue(rtexprvalueString);
             }
             boolean fragment = JspUtil.booleanValue(
-                                        n.getAttributeValue("fragment"));
+                    n.getAttributeValue("fragment"));
             String type = n.getAttributeValue("type");
             if (fragment) {
                 // type is fixed to "JspFragment" and a translation error
@@ -188,8 +188,8 @@
                 // rtexprvalue is fixed to "true" and a translation error
                 // must occur if specified.
                 rtexprvalue = true;
-                if( rtexprvalueString != null ) {
-                    err.jspError(n, "jsp.error.frgmentwithrtexprvalue" );
+                if (rtexprvalueString != null) {
+                    err.jspError(n, "jsp.error.frgmentwithrtexprvalue");
                 }
             } else {
                 if (type == null)
@@ -198,7 +198,7 @@
 
             TagAttributeInfo tagAttributeInfo =
                     new TagAttributeInfo(attrName, required, type, rtexprvalue,
-                                         fragment);
+                            fragment);
             attributeVector.addElement(tagAttributeInfo);
             checkUniqueName(attrName, ATTR_NAME, n, tagAttributeInfo);
         }
@@ -206,7 +206,7 @@
         public void visit(Node.VariableDirective n) throws JasperException {
 
             JspUtil.checkAttributes("Variable directive", n,
-                                    variableDirectiveAttrs, err);
+                    variableDirectiveAttrs, err);
 
             String nameGiven = n.getAttributeValue("name-given");
             String nameFromAttribute = n.getAttributeValue("name-from-attribute");
@@ -220,7 +220,7 @@
 
             String alias = n.getAttributeValue("alias");
             if (nameFromAttribute != null && alias == null ||
-                nameFromAttribute == null && alias != null) {
+                    nameFromAttribute == null && alias != null) {
                 err.jspError("jsp.error.variable.alias");
             }
 
@@ -255,18 +255,17 @@
                 nameGiven = alias;
                 checkUniqueName(nameFromAttribute, VAR_NAME_FROM, n);
                 checkUniqueName(alias, VAR_ALIAS, n);
-            }
-            else {
+            } else {
                 // name-given specified
                 checkUniqueName(nameGiven, VAR_NAME_GIVEN, n);
             }
-                
+
             variableVector.addElement(new TagVariableInfo(
-                                                nameGiven,
-                                                nameFromAttribute,
-                                                className,
-                                                declare,
-                                                scope));
+                    nameGiven,
+                    nameFromAttribute,
+                    className,
+                    declare,
+                    scope));
         }
 
         /*
@@ -280,18 +279,18 @@
         /*
          * Returns the vector of variables corresponding to variable
          * directives.
-         */        
+         */
         public Vector getVariablesVector() {
             return variableVector;
         }
 
-	/*
-	 * Returns the value of the dynamic-attributes tag directive
-	 * attribute.
-	 */
-	public String getDynamicAttributesMapName() {
-	    return dynamicAttrsMapName;
-	}
+        /*
+       * Returns the value of the dynamic-attributes tag directive
+       * attribute.
+       */
+        public String getDynamicAttributesMapName() {
+            return dynamicAttrsMapName;
+        }
 
         public TagInfo getTagInfo() throws JasperException {
 
@@ -306,25 +305,25 @@
             String tagClassName = JspUtil.getTagHandlerClassName(path, err);
 
             TagVariableInfo[] tagVariableInfos
-                = new TagVariableInfo[variableVector.size()];
+                    = new TagVariableInfo[variableVector.size()];
             variableVector.copyInto(tagVariableInfos);
 
             TagAttributeInfo[] tagAttributeInfo
-                = new TagAttributeInfo[attributeVector.size()];
+                    = new TagAttributeInfo[attributeVector.size()];
             attributeVector.copyInto(tagAttributeInfo);
 
             return new JasperTagInfo(name,
-			       tagClassName,
-			       bodycontent,
-			       description,
-			       tagLibInfo,
-			       tei,
-			       tagAttributeInfo,
-			       displayName,
-			       smallIcon,
-			       largeIcon,
-			       tagVariableInfos,
-			       dynamicAttrsMapName);
+                    tagClassName,
+                    bodycontent,
+                    description,
+                    tagLibInfo,
+                    tei,
+                    tagAttributeInfo,
+                    displayName,
+                    smallIcon,
+                    largeIcon,
+                    tagVariableInfos,
+                    dynamicAttrsMapName);
         }
 
         static class NameEntry {
@@ -338,23 +337,31 @@
                 this.attr = attr;
             }
 
-            String getType() { return type;}
-            Node getNode() { return node; }
-            TagAttributeInfo getTagAttributeInfo() { return attr; }
+            String getType() {
+                return type;
+            }
+
+            Node getNode() {
+                return node;
+            }
+
+            TagAttributeInfo getTagAttributeInfo() {
+                return attr;
+            }
         }
 
         /**
          * Reports a translation error if names specified in attributes of
          * directives are not unique in this translation unit.
-         *
+         * <p/>
          * The value of the following attributes must be unique.
-         *   1. 'name' attribute of an attribute directive
-         *   2. 'name-given' attribute of a variable directive
-         *   3. 'alias' attribute of variable directive
-         *   4. 'dynamic-attributes' of a tag directive
+         * 1. 'name' attribute of an attribute directive
+         * 2. 'name-given' attribute of a variable directive
+         * 3. 'alias' attribute of variable directive
+         * 4. 'dynamic-attributes' of a tag directive
          * except that 'dynamic-attributes' can (and must) have the same
          * value when it appears in multiple tag directives.
-         *
+         * <p/>
          * Also, 'name-from' attribute of a variable directive cannot have
          * the same value as that from another variable directive.
          */
@@ -367,13 +374,13 @@
                                      TagAttributeInfo attr)
                 throws JasperException {
 
-            HashMap table = (type == VAR_NAME_FROM)? nameFromTable: nameTable;
+            HashMap table = (type == VAR_NAME_FROM) ? nameFromTable : nameTable;
             NameEntry nameEntry = (NameEntry) table.get(name);
             if (nameEntry != null) {
                 if (type != TAG_DYNAMIC || nameEntry.getType() != TAG_DYNAMIC) {
                     int line = nameEntry.getNode().getStart().getLineNumber();
                     err.jspError(n, "jsp.error.tagfile.nameNotUnique",
-                         type, nameEntry.getType(), Integer.toString(line));
+                            type, nameEntry.getType(), Integer.toString(line));
                 }
             } else {
                 table.put(name, new NameEntry(type, n, attr));
@@ -385,28 +392,28 @@
          */
         void postCheck() throws JasperException {
             // Check that var.name-from-attributes has valid values.
-	    Iterator iter = nameFromTable.keySet().iterator();
+            Iterator iter = nameFromTable.keySet().iterator();
             while (iter.hasNext()) {
                 String nameFrom = (String) iter.next();
                 NameEntry nameEntry = (NameEntry) nameTable.get(nameFrom);
                 NameEntry nameFromEntry =
-                    (NameEntry) nameFromTable.get(nameFrom);
+                        (NameEntry) nameFromTable.get(nameFrom);
                 Node nameFromNode = nameFromEntry.getNode();
                 if (nameEntry == null) {
                     err.jspError(nameFromNode,
-                                 "jsp.error.tagfile.nameFrom.noAttribute",
-                                 nameFrom);
+                            "jsp.error.tagfile.nameFrom.noAttribute",
+                            nameFrom);
                 } else {
                     Node node = nameEntry.getNode();
                     TagAttributeInfo tagAttr = nameEntry.getTagAttributeInfo();
-                    if (! "java.lang.String".equals(tagAttr.getTypeName())
-                            || ! tagAttr.isRequired()
-                            || tagAttr.canBeRequestTime()){
+                    if (!"java.lang.String".equals(tagAttr.getTypeName())
+                            || !tagAttr.isRequired()
+                            || tagAttr.canBeRequestTime()) {
                         err.jspError(nameFromNode,
-                            "jsp.error.tagfile.nameFrom.badAttribute",
-                            nameFrom,
-                            Integer.toString(node.getStart().getLineNumber()));
-                     }
+                                "jsp.error.tagfile.nameFrom.badAttribute",
+                                nameFrom,
+                                Integer.toString(node.getStart().getLineNumber()));
+                    }
                 }
             }
         }
@@ -414,21 +421,21 @@
 
     /**
      * Parses the tag file, and collects information on the directives included
-     * in it.  The method is used to obtain the info on the tag file, when the 
+     * in it.  The method is used to obtain the info on the tag file, when the
      * handler that it represents is referenced.  The tag file is not compiled
      * here.
      *
-     * @param pc the current ParserController used in this compilation
-     * @param name the tag name as specified in the TLD
-     * @param tagfile the path for the tagfile
+     * @param pc         the current ParserController used in this compilation
+     * @param name       the tag name as specified in the TLD
+     * @param tagfile    the path for the tagfile
      * @param tagLibInfo the TagLibraryInfo object associated with this TagInfo
      * @return a TagInfo object assembled from the directives in the tag file.
      */
     public static TagInfo parseTagFileDirectives(ParserController pc,
-						 String name,
-						 String path,
-						 TagLibraryInfo tagLibInfo)
-                        throws JasperException {
+                                                 String name,
+                                                 String path,
+                                                 TagLibraryInfo tagLibInfo)
+            throws JasperException {
 
         ErrorDispatcher err = pc.getCompiler().getErrorDispatcher();
 
@@ -442,8 +449,8 @@
         }
 
         TagFileDirectiveVisitor tagFileVisitor
-            = new TagFileDirectiveVisitor(pc.getCompiler(), tagLibInfo, name,
-                                          path);
+                = new TagFileDirectiveVisitor(pc.getCompiler(), tagLibInfo, name,
+                path);
         page.visit(tagFileVisitor);
         tagFileVisitor.postCheck();
 
@@ -456,29 +463,28 @@
     private Class loadTagFile(Compiler compiler,
                               String tagFilePath, TagInfo tagInfo,
                               PageInfo parentPageInfo)
-        throws JasperException {
+            throws JasperException {
 
         JspCompilationContext ctxt = compiler.getCompilationContext();
         JspRuntimeContext rctxt = ctxt.getRuntimeContext();
         JspServletWrapper wrapper =
                 (JspServletWrapper) rctxt.getWrapper(tagFilePath);
 
-        synchronized(rctxt) {
+        synchronized (rctxt) {
             if (wrapper == null) {
                 wrapper = new JspServletWrapper(ctxt.getServletContext(),
-                                                ctxt.getOptions(),
-                                                tagFilePath,
-                                                tagInfo,
-                                                ctxt.getRuntimeContext(),
-                                                (URL) ctxt.getTagFileJarUrls().get(tagFilePath));
-                    rctxt.addWrapper(tagFilePath,wrapper);
+                        ctxt.getOptions(),
+                        tagFilePath,
+                        tagInfo,
+                        ctxt.getRuntimeContext(),
+                        (URL) ctxt.getTagFileJarUrls().get(tagFilePath));
+                rctxt.addWrapper(tagFilePath, wrapper);
 
-		// Use same classloader and classpath for compiling tag files
-		wrapper.getJspEngineContext().setClassLoader(
-				(URLClassLoader) ctxt.getClassLoader());
-		wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
-            }
-            else {
+                // Use same classloader and classpath for compiling tag files
+                wrapper.getJspEngineContext().setClassLoader(
+                        (URLClassLoader) ctxt.getClassLoader());
+                wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
+            } else {
                 // Make sure that JspCompilationContext gets the latest TagInfo
                 // for the tag file.  TagInfo instance was created the last
                 // time the tag file was scanned for directives, and the tag
@@ -496,38 +502,38 @@
                     // recursion.
 
                     JspServletWrapper tempWrapper
-                        = new JspServletWrapper(ctxt.getServletContext(),
-                                                ctxt.getOptions(),
-                                                tagFilePath,
-                                                tagInfo,
-                                                ctxt.getRuntimeContext(),
-                                                (URL) ctxt.getTagFileJarUrls().get(tagFilePath));
+                            = new JspServletWrapper(ctxt.getServletContext(),
+                            ctxt.getOptions(),
+                            tagFilePath,
+                            tagInfo,
+                            ctxt.getRuntimeContext(),
+                            (URL) ctxt.getTagFileJarUrls().get(tagFilePath));
                     tagClazz = tempWrapper.loadTagFilePrototype();
                     tempVector.add(
-                               tempWrapper.getJspEngineContext().getCompiler());
+                            tempWrapper.getJspEngineContext().getCompiler());
                 } else {
                     tagClazz = wrapper.loadTagFile();
                 }
             } finally {
                 wrapper.decTripCount();
             }
-        
+
             // Add the dependants for this tag file to its parent's
             // dependant list.  The only reliable dependency information
             // can only be obtained from the tag instance.
             try {
                 Object tagIns = tagClazz.newInstance();
                 if (tagIns instanceof JspSourceDependent) {
-                    Iterator iter = 
-                        ((List) ((JspSourceDependent) tagIns).getDependants()).iterator();
+                    Iterator iter =
+                            ((List) ((JspSourceDependent) tagIns).getDependants()).iterator();
                     while (iter.hasNext()) {
-                        parentPageInfo.addDependant((String)iter.next());
+                        parentPageInfo.addDependant((String) iter.next());
                     }
                 }
             } catch (Exception e) {
                 // ignore errors
             }
-        
+
             return tagClazz;
         }
     }
@@ -536,14 +542,14 @@
     /*
      * Visitor which scans the page and looks for tag handlers that are tag
      * files, compiling (if necessary) and loading them.
-     */ 
+     */
     private class TagFileLoaderVisitor extends Node.Visitor {
 
         private Compiler compiler;
         private PageInfo pageInfo;
 
         TagFileLoaderVisitor(Compiler compiler) {
-            
+
             this.compiler = compiler;
             this.pageInfo = compiler.getPageInfo();
         }
@@ -552,13 +558,13 @@
             TagFileInfo tagFileInfo = n.getTagFileInfo();
             if (tagFileInfo != null) {
                 String tagFilePath = tagFileInfo.getPath();
-		JspCompilationContext ctxt = compiler.getCompilationContext();
-		if (ctxt.getTagFileJarUrls().get(tagFilePath) == null) {
-		    // Omit tag file dependency info on jar files for now.
+                JspCompilationContext ctxt = compiler.getCompilationContext();
+                if (ctxt.getTagFileJarUrls().get(tagFilePath) == null) {
+                    // Omit tag file dependency info on jar files for now.
                     pageInfo.addDependant(tagFilePath);
-		}
+                }
                 Class c = loadTagFile(compiler, tagFilePath, n.getTagInfo(),
-                                      pageInfo);
+                        pageInfo);
                 n.setTagHandlerClass(c);
             }
             visitBody(n);
@@ -572,17 +578,18 @@
      * in the CustomTag nodes.
      */
     public void loadTagFiles(Compiler compiler, Node.Nodes page)
-                throws JasperException {
+            throws JasperException {
 
         tempVector = new Vector();
         page.visit(new TagFileLoaderVisitor(compiler));
     }
 
     /**
-     * Removed the java and class files for the tag prototype 
+     * Removed the java and class files for the tag prototype
      * generated from the current compilation.
+     *
      * @param classFileName If non-null, remove only the class file with
-     *        with this name.
+     *                      with this name.
      */
     public void removeProtoTypeFiles(String classFileName) {
         Iterator iter = tempVector.iterator();
@@ -591,7 +598,7 @@
             if (classFileName == null) {
                 c.removeGeneratedClassFiles();
             } else if (classFileName.equals(
-                        c.getCompilationContext().getClassFileName())) {
+                    c.getCompilationContext().getClassFileName())) {
                 c.removeGeneratedClassFiles();
                 tempVector.remove(c);
                 return;
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagLibraryInfoImpl.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagLibraryInfoImpl.java
index e29975e..a159530 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagLibraryInfoImpl.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagLibraryInfoImpl.java
@@ -17,8 +17,8 @@
 
 package org.apache.struts2.jasper.compiler;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.JasperException;
 import org.apache.struts2.jasper.JspCompilationContext;
 import org.apache.struts2.jasper.xmlparser.ParserUtils;
@@ -33,7 +33,7 @@
 import java.util.zip.ZipEntry;
 
 /**
- * Implementation of the TagLibraryInfo class from the JSP spec. 
+ * Implementation of the TagLibraryInfo class from the JSP spec.
  *
  * @author Anil K. Vijendran
  * @author Mandar Raje
@@ -44,7 +44,7 @@
 class TagLibraryInfoImpl extends TagLibraryInfo implements TagConstants {
 
     // Logger
-    private Log log = LogFactory.getLog(TagLibraryInfoImpl.class);
+    private Logger log = LoggerFactory.getLogger(TagLibraryInfoImpl.class);
 
     private Hashtable jarEntries;
     private JspCompilationContext ctxt;
@@ -53,7 +53,7 @@
 
     private final void print(String name, String value, PrintWriter w) {
         if (value != null) {
-            w.print(name+" = {\n\t");
+            w.print(name + " = {\n\t");
             w.print(value);
             w.print("\n}\n");
         }
@@ -70,25 +70,24 @@
         print("uri", uri, out);
         print("tagLibraryValidator", "" + tagLibraryValidator, out);
 
-        for(int i = 0; i < tags.length; i++)
+        for (int i = 0; i < tags.length; i++)
             out.println(tags[i].toString());
-        
-        for(int i = 0; i < tagFiles.length; i++)
+
+        for (int i = 0; i < tagFiles.length; i++)
             out.println(tagFiles[i].toString());
-        
-        for(int i = 0; i < functions.length; i++)
+
+        for (int i = 0; i < functions.length; i++)
             out.println(functions[i].toString());
-        
+
         return sw.toString();
     }
-    
+
     // XXX FIXME
     // resolveRelativeUri and/or getResourceAsStream don't seem to properly
     // handle relative paths when dealing when home and getDocBase are set
     // the following is a workaround until these problems are resolved.
-    private InputStream getResourceAsStream(String uri) 
-        throws FileNotFoundException 
-    {
+    private InputStream getResourceAsStream(String uri)
+            throws FileNotFoundException {
         try {
             // see if file exists on the filesystem first
             String real = ctxt.getRealPath(uri);
@@ -103,7 +102,7 @@
             // the context
             return ctxt.getResourceAsStream(uri);
         }
-       
+
     }
 
     /**
@@ -111,7 +110,7 @@
      */
     public TagLibraryInfoImpl(JspCompilationContext ctxt,
                               ParserController pc,
-                              String prefix, 
+                              String prefix,
                               String uriIn,
                               String[] location,
                               ErrorDispatcher err) throws JasperException {
@@ -152,7 +151,7 @@
                 try {
                     URL jarFileUrl = new URL("jar:" + location[0] + "!/");
                     JarURLConnection conn =
-                        (JarURLConnection) jarFileUrl.openConnection();
+                            (JarURLConnection) jarFileUrl.openConnection();
                     conn.setUseCaches(false);
                     conn.connect();
                     jarFile = conn.getJarFile();
@@ -161,35 +160,36 @@
                     parseTLD(ctxt, location[0], in, jarFileUrl);
                 } catch (Exception ex) {
                     err.jspError("jsp.error.tld.unable_to_read", location[0],
-                                 location[1], ex.toString());
+                            location[1], ex.toString());
                 }
             }
         } finally {
             if (in != null) {
                 try {
                     in.close();
-                } catch (Throwable t) {}
+                } catch (Throwable t) {
+                }
             }
             if (jarFile != null) {
                 try {
                     jarFile.close();
-                } catch (Throwable t) {}
+                } catch (Throwable t) {
+                }
             }
         }
 
     }
-    
+
     /*
-     * @param ctxt The JSP compilation context
-     * @param uri The TLD's uri
-     * @param in The TLD's input stream
-     * @param jarFileUrl The JAR file containing the TLD, or null if the tag
-     * library is not packaged in a JAR
-     */
+    * @param ctxt The JSP compilation context
+    * @param uri The TLD's uri
+    * @param in The TLD's input stream
+    * @param jarFileUrl The JAR file containing the TLD, or null if the tag
+    * library is not packaged in a JAR
+    */
     private void parseTLD(JspCompilationContext ctxt,
-                          String uri, InputStream in, URL jarFileUrl) 
-        throws JasperException
-    {
+                          String uri, InputStream in, URL jarFileUrl)
+            throws JasperException {
         Vector tagVector = new Vector();
         Vector tagFileVector = new Vector();
         Hashtable functionTable = new Hashtable();
@@ -211,18 +211,18 @@
             String tname = element.getName();
 
             if ("tlibversion".equals(tname)                    // JSP 1.1
-                        || "tlib-version".equals(tname)) {     // JSP 1.2
+                    || "tlib-version".equals(tname)) {     // JSP 1.2
                 this.tlibversion = element.getBody();
             } else if ("jspversion".equals(tname)
-                        || "jsp-version".equals(tname)) {
+                    || "jsp-version".equals(tname)) {
                 this.jspversion = element.getBody();
             } else if ("shortname".equals(tname) ||
-                     "short-name".equals(tname))
+                    "short-name".equals(tname))
                 this.shortname = element.getBody();
             else if ("uri".equals(tname))
                 this.urn = element.getBody();
             else if ("info".equals(tname) ||
-                     "description".equals(tname))
+                    "description".equals(tname))
                 this.info = element.getBody();
             else if ("validator".equals(tname))
                 this.tagLibraryValidator = createValidator(element);
@@ -230,21 +230,21 @@
                 tagVector.addElement(createTagInfo(element, jspversion));
             else if ("tag-file".equals(tname)) {
                 TagFileInfo tagFileInfo = createTagFileInfo(element, uri,
-                                                            jarFileUrl);
+                        jarFileUrl);
                 tagFileVector.addElement(tagFileInfo);
             } else if ("function".equals(tname)) {         // JSP2.0
                 FunctionInfo funcInfo = createFunctionInfo(element);
                 String funcName = funcInfo.getName();
                 if (functionTable.containsKey(funcName)) {
                     err.jspError("jsp.error.tld.fn.duplicate.name",
-                                 funcName, uri);
+                            funcName, uri);
 
                 }
                 functionTable.put(funcName, funcInfo);
             } else if ("display-name".equals(tname) ||    // Ignored elements
-                     "small-icon".equals(tname) ||
-                     "large-icon".equals(tname) ||
-                     "listener".equals(tname)) {
+                    "small-icon".equals(tname) ||
+                    "large-icon".equals(tname) ||
+                    "listener".equals(tname)) {
                 ;
             } else if ("taglib-extension".equals(tname)) {
                 // Recognized but ignored
@@ -258,45 +258,45 @@
         }
 
         if (tlibversion == null) {
-            err.jspError("jsp.error.tld.mandatory.element.missing", 
-                         "tlib-version");
+            err.jspError("jsp.error.tld.mandatory.element.missing",
+                    "tlib-version");
         }
         if (jspversion == null) {
             err.jspError("jsp.error.tld.mandatory.element.missing",
-                         "jsp-version");
+                    "jsp-version");
         }
 
         this.tags = new TagInfo[tagVector.size()];
-        tagVector.copyInto (this.tags);
+        tagVector.copyInto(this.tags);
 
         this.tagFiles = new TagFileInfo[tagFileVector.size()];
-        tagFileVector.copyInto (this.tagFiles);
+        tagFileVector.copyInto(this.tagFiles);
 
         this.functions = new FunctionInfo[functionTable.size()];
-        int i=0;
+        int i = 0;
         Enumeration enumeration = functionTable.elements();
         while (enumeration.hasMoreElements()) {
             this.functions[i++] = (FunctionInfo) enumeration.nextElement();
         }
     }
-    
+
     /*
-     * @param uri The uri of the TLD
-     * @param ctxt The compilation context
-     *
-     * @return String array whose first element denotes the path to the TLD.
-     * If the path to the TLD points to a jar file, then the second element
-     * denotes the name of the TLD entry in the jar file, which is hardcoded
-     * to META-INF/taglib.tld.
-     */
+    * @param uri The uri of the TLD
+    * @param ctxt The compilation context
+    *
+    * @return String array whose first element denotes the path to the TLD.
+    * If the path to the TLD points to a jar file, then the second element
+    * denotes the name of the TLD entry in the jar file, which is hardcoded
+    * to META-INF/taglib.tld.
+    */
     private String[] generateTLDLocation(String uri,
                                          JspCompilationContext ctxt)
-                throws JasperException {
+            throws JasperException {
 
         int uriType = TldLocationsCache.uriType(uri);
         if (uriType == TldLocationsCache.ABS_URI) {
             err.jspError("jsp.error.taglibDirective.absUriCannotBeResolved",
-                         uri);
+                    uri);
         } else if (uriType == TldLocationsCache.NOROOT_REL_URI) {
             //TODO: implement for tld
             //uri = ctxt.resolveRelativeUri(uri);
@@ -310,7 +310,7 @@
                 url = ctxt.getResource(location[0]);
             } catch (Exception ex) {
                 err.jspError("jsp.error.tld.unable_to_get_jar", location[0],
-                             ex.toString());
+                        ex.toString());
             }
             if (url == null) {
                 err.jspError("jsp.error.tld.missing_jar", location[0]);
@@ -341,7 +341,7 @@
         String smallIcon = null;
         String largeIcon = null;
         boolean dynamicAttributes = false;
-        
+
         Vector attributeVector = new Vector();
         Vector variableVector = new Vector();
         Iterator list = elem.findChildren();
@@ -352,13 +352,13 @@
             if ("name".equals(tname)) {
                 tagName = element.getBody();
             } else if ("tagclass".equals(tname) ||
-                     "tag-class".equals(tname)) {
+                    "tag-class".equals(tname)) {
                 tagClassName = element.getBody();
             } else if ("teiclass".equals(tname) ||
-                     "tei-class".equals(tname)) {
+                    "tei-class".equals(tname)) {
                 teiClassName = element.getBody();
             } else if ("bodycontent".equals(tname) ||
-                     "body-content".equals(tname)) {
+                    "body-content".equals(tname)) {
                 bodycontent = element.getBody();
             } else if ("display-name".equals(tname)) {
                 displayName = element.getBody();
@@ -376,7 +376,7 @@
                     largeIcon = icon.getBody();
                 }
             } else if ("info".equals(tname) ||
-                     "description".equals(tname)) {
+                    "description".equals(tname)) {
                 info = element.getBody();
             } else if ("variable".equals(tname)) {
                 variableVector.addElement(createVariable(element));
@@ -403,30 +403,30 @@
                 tei = (TagExtraInfo) teiClass.newInstance();
             } catch (Exception e) {
                 err.jspError("jsp.error.teiclass.instantiation", teiClassName,
-                             e);
+                        e);
             }
         }
 
         TagAttributeInfo[] tagAttributeInfo
-            = new TagAttributeInfo[attributeVector.size()];
+                = new TagAttributeInfo[attributeVector.size()];
         attributeVector.copyInto(tagAttributeInfo);
 
         TagVariableInfo[] tagVariableInfos
-            = new TagVariableInfo[variableVector.size()];
+                = new TagVariableInfo[variableVector.size()];
         variableVector.copyInto(tagVariableInfos);
 
         TagInfo taginfo = new TagInfo(tagName,
-                                      tagClassName,
-                                      bodycontent,
-                                      info,
-                                      this, 
-                                      tei,
-                                      tagAttributeInfo,
-                                      displayName,
-                                      smallIcon,
-                                      largeIcon,
-                                      tagVariableInfos,
-                                      dynamicAttributes);
+                tagClassName,
+                bodycontent,
+                info,
+                this,
+                tei,
+                tagAttributeInfo,
+                displayName,
+                smallIcon,
+                largeIcon,
+                tagVariableInfos,
+                dynamicAttributes);
         return taginfo;
     }
 
@@ -443,7 +443,7 @@
      */
     private TagFileInfo createTagFileInfo(TreeNode elem, String uri,
                                           URL jarFileUrl)
-                throws JasperException {
+            throws JasperException {
 
         String name = null;
         String path = null;
@@ -461,8 +461,8 @@
             } else if ("tag-extension".equals(tname)) {
                 // Ignore <tag-extension> element: Bugzilla 33538
             } else if ("icon".equals(tname) ||
-                        "display-name".equals(tname) ||
-                       "description".equals(tname)) {
+                    "display-name".equals(tname) ||
+                    "description".equals(tname)) {
                 // Ignore these elements: Bugzilla 38015
             } else {
                 if (log.isWarnEnabled()) {
@@ -484,8 +484,8 @@
         }
 
         TagInfo tagInfo
-            = TagFileProcessor.parseTagFileDirectives(parserController, name,
-                                                      path, this);
+                = TagFileProcessor.parseTagFileDirectives(parserController, name,
+                path, this);
         return new TagFileInfo(name, path, tagInfo);
     }
 
@@ -493,8 +493,8 @@
         String name = null;
         String type = null;
         boolean required = false, rtexprvalue = false, reqTime = false,
-            isFragment = false;
-        
+                isFragment = false;
+
         Iterator list = elem.findChildren();
         while (list.hasNext()) {
             TreeNode element = (TreeNode) list.next();
@@ -514,15 +514,15 @@
                 type = element.getBody();
                 if ("1.2".equals(jspVersion)
                         && (type.equals("Boolean")
-                            || type.equals("Byte")
-                            || type.equals("Character")
-                            || type.equals("Double")
-                            || type.equals("Float")
-                            || type.equals("Integer")
-                            || type.equals("Long")
-                            || type.equals("Object")
-                            || type.equals("Short")
-                            || type.equals("String"))) {
+                        || type.equals("Byte")
+                        || type.equals("Character")
+                        || type.equals("Double")
+                        || type.equals("Float")
+                        || type.equals("Integer")
+                        || type.equals("Long")
+                        || type.equals("Object")
+                        || type.equals("Short")
+                        || type.equals("String"))) {
                     type = "java.lang." + type;
                 }
             } else if ("fragment".equals(tname)) {
@@ -531,7 +531,7 @@
                     isFragment = JspUtil.booleanValue(s);
                 }
             } else if ("description".equals(tname) ||    // Ignored elements
-                       false) {
+                    false) {
                 ;
             } else {
                 if (log.isWarnEnabled()) {
@@ -551,9 +551,9 @@
              * fixed at true. See also JSP.8.5.2.
              */
             type = "javax.servlet.jsp.tagext.JspFragment";
-            rtexprvalue = true;            
+            rtexprvalue = true;
         }
-        
+
         if (!rtexprvalue) {
             // According to JSP spec, for static values (those determined at
             // translation time) the type is fixed at java.lang.String.
@@ -561,7 +561,7 @@
         }
 
         return new TagAttributeInfo(name, required, type, rtexprvalue,
-                                    isFragment);
+                isFragment);
     }
 
     TagVariableInfo createVariable(TreeNode elem) {
@@ -597,7 +597,7 @@
                     }
                 }
             } else if ("description".equals(tname) ||    // Ignored elements
-                     false ) {
+                    false) {
             } else {
                 if (log.isWarnEnabled()) {
                     log.warn(Localizer.getMessage(
@@ -606,7 +606,7 @@
             }
         }
         return new TagVariableInfo(nameGiven, nameFromAttribute,
-                                   className, declare, scope);
+                className, declare, scope);
     }
 
     private TagLibraryValidator createValidator(TreeNode elem)
@@ -625,7 +625,7 @@
                 String[] initParam = createInitParam(element);
                 initParams.put(initParam[0], initParam[1]);
             } else if ("description".equals(tname) ||    // Ignored elements
-                     false ) {
+                    false) {
             } else {
                 if (log.isWarnEnabled()) {
                     log.warn(Localizer.getMessage(
@@ -637,12 +637,12 @@
         TagLibraryValidator tlv = null;
         if (validatorClass != null && !validatorClass.equals("")) {
             try {
-                Class tlvClass = 
-                    ctxt.getClassLoader().loadClass(validatorClass);
-                tlv = (TagLibraryValidator)tlvClass.newInstance();
+                Class tlvClass =
+                        ctxt.getClassLoader().loadClass(validatorClass);
+                tlv = (TagLibraryValidator) tlvClass.newInstance();
             } catch (Exception e) {
                 err.jspError("jsp.error.tlvclass.instantiation",
-                             validatorClass, e);
+                        validatorClass, e);
             }
         }
         if (tlv != null) {
@@ -653,7 +653,7 @@
 
     String[] createInitParam(TreeNode elem) {
         String[] initParam = new String[2];
-        
+
         Iterator list = elem.findChildren();
         while (list.hasNext()) {
             TreeNode element = (TreeNode) list.next();
@@ -692,14 +692,14 @@
             } else if ("function-signature".equals(tname)) {
                 signature = element.getBody();
             } else if ("display-name".equals(tname) ||    // Ignored elements
-                     "small-icon".equals(tname) ||
-                     "large-icon".equals(tname) ||
-                     "description".equals(tname) || 
-                     "example".equals(tname)) {
+                    "small-icon".equals(tname) ||
+                    "large-icon".equals(tname) ||
+                    "description".equals(tname) ||
+                    "example".equals(tname)) {
             } else {
                 if (log.isWarnEnabled()) {
                     log.warn(Localizer.getMessage(
-                        "jsp.warning.unknown.element.in.function", tname));
+                            "jsp.warning.unknown.element.in.function", tname));
                 }
             }
         }
@@ -713,7 +713,7 @@
 
     /**
      * The instance (if any) for the TagLibraryValidator class.
-     * 
+     *
      * @return The TagLibraryValidator instance, if any.
      */
     public TagLibraryValidator getTagLibraryValidator() {
@@ -723,7 +723,7 @@
     /**
      * Translation-time validation of the XML document
      * associated with the JSP page.
-     * This is a convenience method on the associated 
+     * This is a convenience method on the associated
      * TagLibraryValidator class.
      *
      * @param thePage The JSP page object
@@ -741,5 +741,5 @@
         return tlv.validate(getPrefixString(), uri, thePage);
     }
 
-    protected TagLibraryValidator tagLibraryValidator; 
+    protected TagLibraryValidator tagLibraryValidator;
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagPluginManager.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagPluginManager.java
index 74c713c..e98059f 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagPluginManager.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TagPluginManager.java
@@ -30,6 +30,7 @@
 
 /**
  * Manages tag plugin optimizations.
+ *
  * @author Kin-man Chung
  */
 
@@ -44,18 +45,18 @@
     private PageInfo pageInfo;
 
     public TagPluginManager(ServletContext ctxt) {
-	this.ctxt = ctxt;
+        this.ctxt = ctxt;
     }
 
     public void apply(Node.Nodes page, ErrorDispatcher err, PageInfo pageInfo)
-	    throws JasperException {
+            throws JasperException {
 
-	init(err);
-	if (tagPlugins == null || tagPlugins.size() == 0) {
-	    return;
-	}
+        init(err);
+        if (tagPlugins == null || tagPlugins.size() == 0) {
+            return;
+        }
 
-	this.pageInfo = pageInfo;
+        this.pageInfo = pageInfo;
 
         page.visit(new Node.Visitor() {
             public void visit(Node.CustomTag n)
@@ -66,176 +67,176 @@
         });
 
     }
- 
+
     private void init(ErrorDispatcher err) throws JasperException {
-	if (initialized)
-	    return;
+        if (initialized)
+            return;
 
-	InputStream is = ctxt.getResourceAsStream(TAG_PLUGINS_XML);
-	if (is == null)
-	    return;
+        InputStream is = ctxt.getResourceAsStream(TAG_PLUGINS_XML);
+        if (is == null)
+            return;
 
-	TreeNode root = (new ParserUtils()).parseXMLDocument(TAG_PLUGINS_XML,
-							     is);
-	if (root == null) {
-	    return;
-	}
+        TreeNode root = (new ParserUtils()).parseXMLDocument(TAG_PLUGINS_XML,
+                is);
+        if (root == null) {
+            return;
+        }
 
-	if (!TAG_PLUGINS_ROOT_ELEM.equals(root.getName())) {
-	    err.jspError("jsp.error.plugin.wrongRootElement", TAG_PLUGINS_XML,
-			 TAG_PLUGINS_ROOT_ELEM);
-	}
+        if (!TAG_PLUGINS_ROOT_ELEM.equals(root.getName())) {
+            err.jspError("jsp.error.plugin.wrongRootElement", TAG_PLUGINS_XML,
+                    TAG_PLUGINS_ROOT_ELEM);
+        }
 
-	tagPlugins = new HashMap();
-	Iterator pluginList = root.findChildren("tag-plugin");
-	while (pluginList.hasNext()) {
-	    TreeNode pluginNode = (TreeNode) pluginList.next();
+        tagPlugins = new HashMap();
+        Iterator pluginList = root.findChildren("tag-plugin");
+        while (pluginList.hasNext()) {
+            TreeNode pluginNode = (TreeNode) pluginList.next();
             TreeNode tagClassNode = pluginNode.findChild("tag-class");
-	    if (tagClassNode == null) {
-		// Error
-		return;
-	    }
-	    String tagClass = tagClassNode.getBody().trim();
-	    TreeNode pluginClassNode = pluginNode.findChild("plugin-class");
-	    if (pluginClassNode == null) {
-		// Error
-		return;
-	    }
+            if (tagClassNode == null) {
+                // Error
+                return;
+            }
+            String tagClass = tagClassNode.getBody().trim();
+            TreeNode pluginClassNode = pluginNode.findChild("plugin-class");
+            if (pluginClassNode == null) {
+                // Error
+                return;
+            }
 
-	    String pluginClassStr = pluginClassNode.getBody();
-	    TagPlugin tagPlugin = null;
-	    try {
-		Class pluginClass = Class.forName(pluginClassStr);
-		tagPlugin = (TagPlugin) pluginClass.newInstance();
-	    } catch (Exception e) {
-		throw new JasperException(e);
-	    }
-	    if (tagPlugin == null) {
-		return;
-	    }
-	    tagPlugins.put(tagClass, tagPlugin);
-	}
-	initialized = true;
+            String pluginClassStr = pluginClassNode.getBody();
+            TagPlugin tagPlugin = null;
+            try {
+                Class pluginClass = Class.forName(pluginClassStr);
+                tagPlugin = (TagPlugin) pluginClass.newInstance();
+            } catch (Exception e) {
+                throw new JasperException(e);
+            }
+            if (tagPlugin == null) {
+                return;
+            }
+            tagPlugins.put(tagClass, tagPlugin);
+        }
+        initialized = true;
     }
 
     /**
-     * Invoke tag plugin for the given custom tag, if a plugin exists for 
+     * Invoke tag plugin for the given custom tag, if a plugin exists for
      * the custom tag's tag handler.
-     *
+     * <p/>
      * The given custom tag node will be manipulated by the plugin.
      */
     private void invokePlugin(Node.CustomTag n) {
-	TagPlugin tagPlugin = (TagPlugin)
-		tagPlugins.get(n.getTagHandlerClass().getName());
-	if (tagPlugin == null) {
-	    return;
-	}
+        TagPlugin tagPlugin = (TagPlugin)
+                tagPlugins.get(n.getTagHandlerClass().getName());
+        if (tagPlugin == null) {
+            return;
+        }
 
-	TagPluginContext tagPluginContext = new TagPluginContextImpl(n, pageInfo);
-	n.setTagPluginContext(tagPluginContext);
-	tagPlugin.doTag(tagPluginContext);
+        TagPluginContext tagPluginContext = new TagPluginContextImpl(n, pageInfo);
+        n.setTagPluginContext(tagPluginContext);
+        tagPlugin.doTag(tagPluginContext);
     }
 
     static class TagPluginContextImpl implements TagPluginContext {
-	private Node.CustomTag node;
-	private Node.Nodes curNodes;
-	private PageInfo pageInfo;
-	private HashMap pluginAttributes;
+        private Node.CustomTag node;
+        private Node.Nodes curNodes;
+        private PageInfo pageInfo;
+        private HashMap pluginAttributes;
 
-	TagPluginContextImpl(Node.CustomTag n, PageInfo pageInfo) {
-	    this.node = n;
-	    this.pageInfo = pageInfo;
-	    curNodes = new Node.Nodes();
-	    n.setAtETag(curNodes);
-	    curNodes = new Node.Nodes();
-	    n.setAtSTag(curNodes);
-	    n.setUseTagPlugin(true);
-	    pluginAttributes = new HashMap();
-	}
+        TagPluginContextImpl(Node.CustomTag n, PageInfo pageInfo) {
+            this.node = n;
+            this.pageInfo = pageInfo;
+            curNodes = new Node.Nodes();
+            n.setAtETag(curNodes);
+            curNodes = new Node.Nodes();
+            n.setAtSTag(curNodes);
+            n.setUseTagPlugin(true);
+            pluginAttributes = new HashMap();
+        }
 
-	public TagPluginContext getParentContext() {
-	    Node parent = node.getParent();
-	    if (! (parent instanceof Node.CustomTag)) {
-		return null;
-	    }
-	    return ((Node.CustomTag) parent).getTagPluginContext();
-	}
+        public TagPluginContext getParentContext() {
+            Node parent = node.getParent();
+            if (!(parent instanceof Node.CustomTag)) {
+                return null;
+            }
+            return ((Node.CustomTag) parent).getTagPluginContext();
+        }
 
-	public void setPluginAttribute(String key, Object value) {
-	    pluginAttributes.put(key, value);
-	}
+        public void setPluginAttribute(String key, Object value) {
+            pluginAttributes.put(key, value);
+        }
 
-	public Object getPluginAttribute(String key) {
-	    return pluginAttributes.get(key);
-	}
+        public Object getPluginAttribute(String key) {
+            return pluginAttributes.get(key);
+        }
 
-	public boolean isScriptless() {
-	    return node.getChildInfo().isScriptless();
-	}
+        public boolean isScriptless() {
+            return node.getChildInfo().isScriptless();
+        }
 
-	public boolean isConstantAttribute(String attribute) {
-	    Node.JspAttribute attr = getNodeAttribute(attribute);
-	    if (attr == null)
-		return false;
-	    return attr.isLiteral();
-	}
-
-	public String getConstantAttribute(String attribute) {
-	    Node.JspAttribute attr = getNodeAttribute(attribute);
+        public boolean isConstantAttribute(String attribute) {
+            Node.JspAttribute attr = getNodeAttribute(attribute);
             if (attr == null)
-		return null;
-	    return attr.getValue();
-	}
+                return false;
+            return attr.isLiteral();
+        }
 
-	public boolean isAttributeSpecified(String attribute) {
-	    return getNodeAttribute(attribute) != null;
-	}
+        public String getConstantAttribute(String attribute) {
+            Node.JspAttribute attr = getNodeAttribute(attribute);
+            if (attr == null)
+                return null;
+            return attr.getValue();
+        }
 
-	public String getTemporaryVariableName() {
-	    return JspUtil.nextTemporaryVariableName();
-	}
+        public boolean isAttributeSpecified(String attribute) {
+            return getNodeAttribute(attribute) != null;
+        }
 
-	public void generateImport(String imp) {
-	    pageInfo.addImport(imp);
-	}
+        public String getTemporaryVariableName() {
+            return JspUtil.nextTemporaryVariableName();
+        }
 
-	public void generateDeclaration(String id, String text) {
-	    if (pageInfo.isPluginDeclared(id)) {
-		return;
-	    }
-	    curNodes.add(new Node.Declaration(text, node.getStart(), null));
-	}
+        public void generateImport(String imp) {
+            pageInfo.addImport(imp);
+        }
 
-	public void generateJavaSource(String sourceCode) {
-	    curNodes.add(new Node.Scriptlet(sourceCode, node.getStart(),
-					    null));
-	}
+        public void generateDeclaration(String id, String text) {
+            if (pageInfo.isPluginDeclared(id)) {
+                return;
+            }
+            curNodes.add(new Node.Declaration(text, node.getStart(), null));
+        }
 
-	public void generateAttribute(String attributeName) {
-	    curNodes.add(new Node.AttributeGenerator(node.getStart(),
-						     attributeName,
-						     node));
-	}
+        public void generateJavaSource(String sourceCode) {
+            curNodes.add(new Node.Scriptlet(sourceCode, node.getStart(),
+                    null));
+        }
 
-	public void dontUseTagPlugin() {
-	    node.setUseTagPlugin(false);
-	}
+        public void generateAttribute(String attributeName) {
+            curNodes.add(new Node.AttributeGenerator(node.getStart(),
+                    attributeName,
+                    node));
+        }
 
-	public void generateBody() {
-	    // Since we'll generate the body anyway, this is really a nop, 
-	    // except for the fact that it lets us put the Java sources the
-	    // plugins produce in the correct order (w.r.t the body).
-	    curNodes = node.getAtETag();
-	}
+        public void dontUseTagPlugin() {
+            node.setUseTagPlugin(false);
+        }
 
-	private Node.JspAttribute getNodeAttribute(String attribute) {
-	    Node.JspAttribute[] attrs = node.getJspAttributes();
-	    for (int i=0; attrs != null && i < attrs.length; i++) {
-		if (attrs[i].getName().equals(attribute)) {
-		    return attrs[i];
-		}
-	    }
-	    return null;
-	}
+        public void generateBody() {
+            // Since we'll generate the body anyway, this is really a nop,
+            // except for the fact that it lets us put the Java sources the
+            // plugins produce in the correct order (w.r.t the body).
+            curNodes = node.getAtETag();
+        }
+
+        private Node.JspAttribute getNodeAttribute(String attribute) {
+            Node.JspAttribute[] attrs = node.getJspAttributes();
+            for (int i = 0; attrs != null && i < attrs.length; i++) {
+                if (attrs[i].getName().equals(attribute)) {
+                    return attrs[i];
+                }
+            }
+            return null;
+        }
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TextOptimizer.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TextOptimizer.java
index cd9ab29..bd151d1 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TextOptimizer.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TextOptimizer.java
@@ -42,9 +42,9 @@
             collectText();
         }
 
-	/*
-         * The following directis are ignored in text concatenation
-         */
+        /*
+        * The following directis are ignored in text concatenation
+        */
 
         public void visit(Node.PageDirective n) throws JasperException {
         }
@@ -88,7 +88,7 @@
 
         /**
          * This method breaks concatenation mode.  As a side effect it copies
-         * the concatenated string to the first text node 
+         * the concatenated string to the first text node
          */
         private void collectText() {
 
@@ -107,7 +107,7 @@
         TextCatVisitor v = new TextCatVisitor(compiler);
         page.visit(v);
 
-	// Cleanup, in case the page ends with a template text
+        // Cleanup, in case the page ends with a template text
         v.collectText();
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java
index 3e77cef..faaea3e 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java
@@ -17,9 +17,9 @@
 
 package org.apache.struts2.jasper.compiler;
 
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.struts2.jasper.Constants;
 import org.apache.struts2.jasper.JasperException;
 import org.apache.struts2.jasper.xmlparser.ParserUtils;
@@ -37,16 +37,16 @@
 /**
  * A container for all tag libraries that are defined "globally"
  * for the web application.
- * 
+ * <p/>
  * Tag Libraries can be defined globally in one of two ways:
- *   1. Via <taglib> elements in web.xml:
- *      the uri and location of the tag-library are specified in
- *      the <taglib> element.
- *   2. Via packaged jar files that contain .tld files
- *      within the META-INF directory, or some subdirectory
- *      of it. The taglib is 'global' if it has the <uri>
- *      element defined.
- *
+ * 1. Via <taglib> elements in web.xml:
+ * the uri and location of the tag-library are specified in
+ * the <taglib> element.
+ * 2. Via packaged jar files that contain .tld files
+ * within the META-INF directory, or some subdirectory
+ * of it. The taglib is 'global' if it has the <uri>
+ * element defined.
+ * <p/>
  * A mapping between the taglib URI and its associated TaglibraryInfoImpl
  * is maintained in this container.
  * Actually, that's what we'd like to do. However, because of the
@@ -55,7 +55,7 @@
  * across page invocations. A bug has been submitted to the spec lead.
  * In the mean time, all we do is save the 'location' where the
  * TLD associated with a taglib URI can be found.
- *
+ * <p/>
  * When a JSP page has a taglib directive, the mappings in this container
  * are first searched (see method getLocation()).
  * If a mapping is found, then the location of the TLD is returned.
@@ -70,7 +70,7 @@
 public class TldLocationsCache {
 
     // Logger
-    private Log log = LogFactory.getLog(TldLocationsCache.class);
+    private Logger log = LoggerFactory.getLogger(TldLocationsCache.class);
 
     /**
      * The types of URI one may specify for a tag library
@@ -90,8 +90,8 @@
      * The mapping of the 'global' tag library URI to the location (resource
      * path) of the TLD associated with that tag library. The location is
      * returned as a String array:
-     *    [0] The location
-     *    [1] If the location is a jar file, this is the location of the tld.
+     * [0] The location
+     * [1] If the location is a jar file, this is the location of the tld.
      */
     private Hashtable mappings;
 
@@ -105,6 +105,7 @@
     /*
      * Initializes the set of JARs that are known not to contain any TLDs
      */
+
     static {
         noTldJars = new HashSet();
         noTldJars.add("ant.jar");
@@ -157,20 +158,21 @@
         noTldJars.add("localedata.jar");
         noTldJars.add("dnsns.jar");
     }
-    
+
     public TldLocationsCache(ServletContext ctxt) {
         this(ctxt, true);
     }
 
-    /** Constructor. 
+    /**
+     * Constructor.
      *
-     * @param ctxt the servlet context of the web application in which Jasper 
-     * is running
-     * @param redeployMode if true, then the compiler will allow redeploying 
-     * a tag library from the same jar, at the expense of slowing down the
-     * server a bit. Note that this may only work on JDK 1.3.1_01a and later,
-     * because of JDK bug 4211817 fixed in this release.
-     * If redeployMode is false, a faster but less capable mode will be used.
+     * @param ctxt         the servlet context of the web application in which Jasper
+     *                     is running
+     * @param redeployMode if true, then the compiler will allow redeploying
+     *                     a tag library from the same jar, at the expense of slowing down the
+     *                     server a bit. Note that this may only work on JDK 1.3.1_01a and later,
+     *                     because of JDK bug 4211817 fixed in this release.
+     *                     If redeployMode is false, a faster but less capable mode will be used.
      */
     public TldLocationsCache(ServletContext ctxt, boolean redeployMode) {
         this.ctxt = ctxt;
@@ -182,8 +184,8 @@
     /**
      * Sets the list of JARs that are known not to contain any TLDs.
      *
-     * @param jarNames List of comma-separated names of JAR files that are 
-     * known not to contain any TLDs 
+     * @param jarNames List of comma-separated names of JAR files that are
+     *                 known not to contain any TLDs
      */
     public static void setNoTldJars(String jarNames) {
         if (jarNames != null) {
@@ -197,19 +199,18 @@
 
     /**
      * Gets the 'location' of the TLD associated with the given taglib 'uri'.
-     *
+     * <p/>
      * Returns null if the uri is not associated with any tag library 'exposed'
      * in the web application. A tag library is 'exposed' either explicitly in
      * web.xml or implicitly via the uri tag in the TLD of a taglib deployed
      * in a jar file (WEB-INF/lib).
-     * 
-     * @param uri The taglib uri
      *
+     * @param uri The taglib uri
      * @return An array of two Strings: The first element denotes the real
-     * path to the TLD. If the path to the TLD points to a jar file, then the
-     * second element denotes the name of the TLD entry in the jar file.
-     * Returns null if the uri is not associated with any tag library 'exposed'
-     * in the web application.
+     *         path to the TLD. If the path to the TLD points to a jar file, then the
+     *         second element denotes the name of the TLD entry in the jar file.
+     *         Returns null if the uri is not associated with any tag library 'exposed'
+     *         in the web application.
      */
     public String[] getLocation(String uri) throws JasperException {
         if (!initialized) {
@@ -236,11 +237,11 @@
         return paths;
     }
 
-    /** 
+    /**
      * Returns the type of a URI:
-     *     ABS_URI
-     *     ROOT_REL_URI
-     *     NOROOT_REL_URI
+     * ABS_URI
+     * ROOT_REL_URI
+     * NOROOT_REL_URI
      */
     public static int uriType(String uri) {
         if (uri.indexOf(':') != -1) {
@@ -267,33 +268,28 @@
 
     /*
      * Populates taglib map described in web.xml.
-     */    
+     */
     private void processWebDotXml() throws Exception {
 
         InputStream is = null;
 
         try {
             // Acquire input stream to web application deployment descriptor
-            String altDDName = (String)ctxt.getAttribute(
-                                                    Constants.ALT_DD_ATTR);
+            String altDDName = (String) ctxt.getAttribute(
+                    Constants.ALT_DD_ATTR);
             URL uri = null;
             if (altDDName != null) {
                 try {
-                    uri = new URL(FILE_PROTOCOL+altDDName.replace('\\', '/'));
+                    uri = new URL(FILE_PROTOCOL + altDDName.replace('\\', '/'));
                 } catch (MalformedURLException e) {
                     if (log.isWarnEnabled()) {
                         log.warn(Localizer.getMessage(
-                                            "jsp.error.internal.filenotfound",
-                                            altDDName));
+                                "jsp.error.internal.filenotfound",
+                                altDDName));
                     }
                 }
             } else {
                 uri = ctxt.getResource(WEB_XML);
-                if (uri == null && log.isWarnEnabled()) {
-                    log.warn(Localizer.getMessage(
-                                            "jsp.error.internal.filenotfound",
-                                            WEB_XML));
-                }
             }
 
             if (uri == null) {
@@ -301,7 +297,7 @@
             }
             is = uri.openStream();
             InputSource ip = new InputSource(is);
-            ip.setSystemId(uri.toExternalForm()); 
+            ip.setSystemId(uri.toExternalForm());
 
             // Parse the web application deployment descriptor
             TreeNode webtld = null;
@@ -341,13 +337,14 @@
                     tagLoc = ctxt.getResource(tagLoc).toString();
                     tagLoc2 = "META-INF/taglib.tld";
                 }
-                mappings.put(tagUri, new String[] { tagLoc, tagLoc2 });
+                mappings.put(tagUri, new String[]{tagLoc, tagLoc2});
             }
         } finally {
             if (is != null) {
                 try {
                     is.close();
-                } catch (Throwable t) {}
+                } catch (Throwable t) {
+                }
             }
         }
     }
@@ -357,12 +354,12 @@
      * (or a subdirectory of it), adding an implicit map entry to the taglib
      * map for any TLD that has a <uri> element.
      *
-     * @param conn The JarURLConnection to the JAR file to scan
+     * @param conn   The JarURLConnection to the JAR file to scan
      * @param ignore true if any exceptions raised when processing the given
-     * JAR should be ignored, false otherwise
+     *               JAR should be ignored, false otherwise
      */
     private void scanJar(JarURLConnection conn, boolean ignore)
-                throws JasperException {
+            throws JasperException {
 
         JarFile jarFile = null;
         String resourcePath = conn.getJarFileURL().toString();
@@ -383,7 +380,7 @@
                     // Add implicit map entry only if its uri is not already
                     // present in the map
                     if (uri != null && mappings.get(uri) == null) {
-                        mappings.put(uri, new String[]{ resourcePath, name });
+                        mappings.put(uri, new String[]{resourcePath, name});
                     }
                 } finally {
                     if (stream != null) {
@@ -458,7 +455,7 @@
                 // Add implicit map entry only if its uri is not already
                 // present in the map
                 if (uri != null && mappings.get(uri) == null) {
-                    mappings.put(uri, new String[] { path, null });
+                    mappings.put(uri, new String[]{path, null});
                 }
             }
         }
@@ -468,9 +465,8 @@
      * Returns the value of the uri element of the given TLD, or null if the
      * given TLD does not contain any such element.
      */
-    private String getUriFromTld(String resourcePath, InputStream in) 
-        throws JasperException
-    {
+    private String getUriFromTld(String resourcePath, InputStream in)
+            throws JasperException {
         // Parse the tag library descriptor at the specified resource path
         TreeNode tld = new ParserUtils().parseXMLDocument(resourcePath, in);
         TreeNode uri = tld.findChild("uri");
@@ -505,17 +501,17 @@
     private void scanJars() throws Exception {
 
         ClassLoader webappLoader
-            = Thread.currentThread().getContextClassLoader();
+                = Thread.currentThread().getContextClassLoader();
         ClassLoader loader = webappLoader;
 
         while (loader != null) {
             if (loader instanceof URLClassLoader) {
                 URL[] urls = ((URLClassLoader) loader).getURLs();
-                for (int i=0; i<urls.length; i++) {
+                for (int i = 0; i < urls.length; i++) {
                     URLConnection conn = urls[i].openConnection();
                     if (conn instanceof JarURLConnection) {
                         if (needScanJar(loader, webappLoader,
-                                        ((JarURLConnection) conn).getJarFile().getName())) {
+                                ((JarURLConnection) conn).getJarFile().getName())) {
                             scanJar((JarURLConnection) conn, true);
                         }
                     } else {
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Validator.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Validator.java
index d0c72c5..bedfd6c 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Validator.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/Validator.java
@@ -51,19 +51,19 @@
         private ErrorDispatcher err;
 
         private static final JspUtil.ValidAttribute[] pageDirectiveAttrs = {
-            new JspUtil.ValidAttribute("language"),
-            new JspUtil.ValidAttribute("extends"),
-            new JspUtil.ValidAttribute("import"),
-            new JspUtil.ValidAttribute("session"),
-            new JspUtil.ValidAttribute("buffer"),
-            new JspUtil.ValidAttribute("autoFlush"),
-            new JspUtil.ValidAttribute("isThreadSafe"),
-            new JspUtil.ValidAttribute("info"),
-            new JspUtil.ValidAttribute("errorPage"),
-            new JspUtil.ValidAttribute("isErrorPage"),
-            new JspUtil.ValidAttribute("contentType"),
-            new JspUtil.ValidAttribute("pageEncoding"),
-            new JspUtil.ValidAttribute("isELIgnored")
+                new JspUtil.ValidAttribute("language"),
+                new JspUtil.ValidAttribute("extends"),
+                new JspUtil.ValidAttribute("import"),
+                new JspUtil.ValidAttribute("session"),
+                new JspUtil.ValidAttribute("buffer"),
+                new JspUtil.ValidAttribute("autoFlush"),
+                new JspUtil.ValidAttribute("isThreadSafe"),
+                new JspUtil.ValidAttribute("info"),
+                new JspUtil.ValidAttribute("errorPage"),
+                new JspUtil.ValidAttribute("isErrorPage"),
+                new JspUtil.ValidAttribute("contentType"),
+                new JspUtil.ValidAttribute("pageEncoding"),
+                new JspUtil.ValidAttribute("isELIgnored")
         };
 
         private boolean pageEncodingSeen = false;
@@ -85,10 +85,10 @@
             pageEncodingSeen = pageEncodingSeenSave;
         }
 
-        public void visit(Node.PageDirective n) throws JasperException {    
+        public void visit(Node.PageDirective n) throws JasperException {
 
             JspUtil.checkAttributes("Page directive", n,
-                                    pageDirectiveAttrs, err);
+                    pageDirectiveAttrs, err);
 
             // JSP.2.10.1
             Attributes attrs = n.getAttributes();
@@ -101,80 +101,80 @@
                         pageInfo.setLanguage(value, n, err, true);
                     } else if (!pageInfo.getLanguage(false).equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.language",
-                                     pageInfo.getLanguage(false), value);
+                                pageInfo.getLanguage(false), value);
                     }
                 } else if ("extends".equals(attr)) {
                     if (pageInfo.getExtends(false) == null) {
                         pageInfo.setExtends(value, n);
                     } else if (!pageInfo.getExtends(false).equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.extends",
-                                     pageInfo.getExtends(false), value);
+                                pageInfo.getExtends(false), value);
                     }
                 } else if ("contentType".equals(attr)) {
                     if (pageInfo.getContentType() == null) {
                         pageInfo.setContentType(value);
                     } else if (!pageInfo.getContentType().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.contenttype",
-                                     pageInfo.getContentType(), value);
+                                pageInfo.getContentType(), value);
                     }
                 } else if ("session".equals(attr)) {
                     if (pageInfo.getSession() == null) {
                         pageInfo.setSession(value, n, err);
                     } else if (!pageInfo.getSession().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.session",
-                                     pageInfo.getSession(), value);
+                                pageInfo.getSession(), value);
                     }
                 } else if ("buffer".equals(attr)) {
                     if (pageInfo.getBufferValue() == null) {
                         pageInfo.setBufferValue(value, n, err);
                     } else if (!pageInfo.getBufferValue().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.buffer",
-                                     pageInfo.getBufferValue(), value);
+                                pageInfo.getBufferValue(), value);
                     }
                 } else if ("autoFlush".equals(attr)) {
                     if (pageInfo.getAutoFlush() == null) {
                         pageInfo.setAutoFlush(value, n, err);
                     } else if (!pageInfo.getAutoFlush().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.autoflush",
-                                     pageInfo.getAutoFlush(), value);
+                                pageInfo.getAutoFlush(), value);
                     }
                 } else if ("isThreadSafe".equals(attr)) {
                     if (pageInfo.getIsThreadSafe() == null) {
                         pageInfo.setIsThreadSafe(value, n, err);
                     } else if (!pageInfo.getIsThreadSafe().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.isthreadsafe",
-                                     pageInfo.getIsThreadSafe(), value);
+                                pageInfo.getIsThreadSafe(), value);
                     }
                 } else if ("isELIgnored".equals(attr)) {
                     if (pageInfo.getIsELIgnored() == null) {
                         pageInfo.setIsELIgnored(value, n, err, true);
                     } else if (!pageInfo.getIsELIgnored().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.iselignored",
-                                     pageInfo.getIsELIgnored(), value);
+                                pageInfo.getIsELIgnored(), value);
                     }
                 } else if ("isErrorPage".equals(attr)) {
                     if (pageInfo.getIsErrorPage() == null) {
                         pageInfo.setIsErrorPage(value, n, err);
                     } else if (!pageInfo.getIsErrorPage().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.iserrorpage",
-                                     pageInfo.getIsErrorPage(), value);
+                                pageInfo.getIsErrorPage(), value);
                     }
                 } else if ("errorPage".equals(attr)) {
                     if (pageInfo.getErrorPage() == null) {
                         pageInfo.setErrorPage(value);
                     } else if (!pageInfo.getErrorPage().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.errorpage",
-                                     pageInfo.getErrorPage(), value);
+                                pageInfo.getErrorPage(), value);
                     }
                 } else if ("info".equals(attr)) {
                     if (pageInfo.getInfo() == null) {
                         pageInfo.setInfo(value);
                     } else if (!pageInfo.getInfo().equals(value)) {
                         err.jspError(n, "jsp.error.page.conflict.info",
-                                     pageInfo.getInfo(), value);
+                                pageInfo.getInfo(), value);
                     }
                 } else if ("pageEncoding".equals(attr)) {
-                    if (pageEncodingSeen) 
+                    if (pageEncodingSeen)
                         err.jspError(n, "jsp.error.page.multi.pageencoding");
                     // 'pageEncoding' can occur at most once per file
                     pageEncodingSeen = true;
@@ -195,9 +195,9 @@
             // Note: Most of the validation is done in TagFileProcessor
             // when it created a TagInfo object from the
             // tag file in which the directive appeared.
-        
+
             // This method does additional processing to collect page info
-            
+
             Attributes attrs = n.getAttributes();
             for (int i = 0; attrs != null && i < attrs.getLength(); i++) {
                 String attr = attrs.getQName(i);
@@ -208,17 +208,17 @@
                         pageInfo.setLanguage(value, n, err, false);
                     } else if (!pageInfo.getLanguage(false).equals(value)) {
                         err.jspError(n, "jsp.error.tag.conflict.language",
-                                     pageInfo.getLanguage(false), value);
+                                pageInfo.getLanguage(false), value);
                     }
                 } else if ("isELIgnored".equals(attr)) {
                     if (pageInfo.getIsELIgnored() == null) {
                         pageInfo.setIsELIgnored(value, n, err, false);
                     } else if (!pageInfo.getIsELIgnored().equals(value)) {
                         err.jspError(n, "jsp.error.tag.conflict.iselignored",
-                                     pageInfo.getIsELIgnored(), value);
+                                pageInfo.getIsELIgnored(), value);
                     }
                 } else if ("pageEncoding".equals(attr)) {
-                    if (pageEncodingSeen) 
+                    if (pageEncodingSeen)
                         err.jspError(n, "jsp.error.tag.multi.pageencoding");
                     pageEncodingSeen = true;
                     n.getRoot().setPageEncoding(value);
@@ -265,12 +265,12 @@
              * pattern matches this page.
              * Treat "UTF-16", "UTF-16BE", and "UTF-16LE" as identical.
              */
-            if (configEnc != null && !pageDirEnc.equals(configEnc) 
+            if (configEnc != null && !pageDirEnc.equals(configEnc)
                     && (!pageDirEnc.startsWith("UTF-16")
-                        || !configEnc.startsWith("UTF-16"))) {
+                    || !configEnc.startsWith("UTF-16"))) {
                 err.jspError(pageDir,
-                             "jsp.error.config_pagedir_encoding_mismatch",
-                             configEnc, pageDirEnc);
+                        "jsp.error.config_pagedir_encoding_mismatch",
+                        configEnc, pageDirEnc);
             }
 
             /*
@@ -282,12 +282,12 @@
              */
             if (root.isXmlSyntax() && root.isEncodingSpecifiedInProlog()) {
                 String pageEnc = root.getPageEncoding();
-                if (!pageDirEnc.equals(pageEnc) 
+                if (!pageDirEnc.equals(pageEnc)
                         && (!pageDirEnc.startsWith("UTF-16")
-                            || !pageEnc.startsWith("UTF-16"))) {
+                        || !pageEnc.startsWith("UTF-16"))) {
                     err.jspError(pageDir,
-                                 "jsp.error.prolog_pagedir_encoding_mismatch",
-                                 pageEnc, pageDirEnc);
+                            "jsp.error.prolog_pagedir_encoding_mismatch",
+                            pageEnc, pageDirEnc);
                 }
             }
         }
@@ -303,80 +303,80 @@
         private ClassLoader loader;
 
         private static final JspUtil.ValidAttribute[] jspRootAttrs = {
-            new JspUtil.ValidAttribute("xsi:schemaLocation"),
-            new JspUtil.ValidAttribute("version", true) };
+                new JspUtil.ValidAttribute("xsi:schemaLocation"),
+                new JspUtil.ValidAttribute("version", true)};
 
         private static final JspUtil.ValidAttribute[] includeDirectiveAttrs = {
-            new JspUtil.ValidAttribute("file", true) };
+                new JspUtil.ValidAttribute("file", true)};
 
         private static final JspUtil.ValidAttribute[] taglibDirectiveAttrs = {
-            new JspUtil.ValidAttribute("uri"),
-            new JspUtil.ValidAttribute("tagdir"),
-            new JspUtil.ValidAttribute("prefix", true) };
+                new JspUtil.ValidAttribute("uri"),
+                new JspUtil.ValidAttribute("tagdir"),
+                new JspUtil.ValidAttribute("prefix", true)};
 
         private static final JspUtil.ValidAttribute[] includeActionAttrs = {
-            new JspUtil.ValidAttribute("page", true, true),
-            new JspUtil.ValidAttribute("flush") };
+                new JspUtil.ValidAttribute("page", true, true),
+                new JspUtil.ValidAttribute("flush")};
 
         private static final JspUtil.ValidAttribute[] paramActionAttrs = {
-            new JspUtil.ValidAttribute("name", true),
-            new JspUtil.ValidAttribute("value", true, true) };
+                new JspUtil.ValidAttribute("name", true),
+                new JspUtil.ValidAttribute("value", true, true)};
 
         private static final JspUtil.ValidAttribute[] forwardActionAttrs = {
-            new JspUtil.ValidAttribute("page", true, true) };
+                new JspUtil.ValidAttribute("page", true, true)};
 
         private static final JspUtil.ValidAttribute[] getPropertyAttrs = {
-            new JspUtil.ValidAttribute("name", true),
-            new JspUtil.ValidAttribute("property", true) };
+                new JspUtil.ValidAttribute("name", true),
+                new JspUtil.ValidAttribute("property", true)};
 
         private static final JspUtil.ValidAttribute[] setPropertyAttrs = {
-            new JspUtil.ValidAttribute("name", true),
-            new JspUtil.ValidAttribute("property", true),
-            new JspUtil.ValidAttribute("value", false, true),
-            new JspUtil.ValidAttribute("param") };
+                new JspUtil.ValidAttribute("name", true),
+                new JspUtil.ValidAttribute("property", true),
+                new JspUtil.ValidAttribute("value", false, true),
+                new JspUtil.ValidAttribute("param")};
 
         private static final JspUtil.ValidAttribute[] useBeanAttrs = {
-            new JspUtil.ValidAttribute("id", true),
-            new JspUtil.ValidAttribute("scope"),
-            new JspUtil.ValidAttribute("class"),
-            new JspUtil.ValidAttribute("type"),
-            new JspUtil.ValidAttribute("beanName", false, true) };
+                new JspUtil.ValidAttribute("id", true),
+                new JspUtil.ValidAttribute("scope"),
+                new JspUtil.ValidAttribute("class"),
+                new JspUtil.ValidAttribute("type"),
+                new JspUtil.ValidAttribute("beanName", false, true)};
 
         private static final JspUtil.ValidAttribute[] plugInAttrs = {
-            new JspUtil.ValidAttribute("type",true),
-            new JspUtil.ValidAttribute("code", true),
-            new JspUtil.ValidAttribute("codebase"),
-            new JspUtil.ValidAttribute("align"),
-            new JspUtil.ValidAttribute("archive"),
-            new JspUtil.ValidAttribute("height", false, true),
-            new JspUtil.ValidAttribute("hspace"),
-            new JspUtil.ValidAttribute("jreversion"),
-            new JspUtil.ValidAttribute("name"),
-            new JspUtil.ValidAttribute("vspace"),
-            new JspUtil.ValidAttribute("width", false, true),
-            new JspUtil.ValidAttribute("nspluginurl"),
-            new JspUtil.ValidAttribute("iepluginurl") };
-            
+                new JspUtil.ValidAttribute("type", true),
+                new JspUtil.ValidAttribute("code", true),
+                new JspUtil.ValidAttribute("codebase"),
+                new JspUtil.ValidAttribute("align"),
+                new JspUtil.ValidAttribute("archive"),
+                new JspUtil.ValidAttribute("height", false, true),
+                new JspUtil.ValidAttribute("hspace"),
+                new JspUtil.ValidAttribute("jreversion"),
+                new JspUtil.ValidAttribute("name"),
+                new JspUtil.ValidAttribute("vspace"),
+                new JspUtil.ValidAttribute("width", false, true),
+                new JspUtil.ValidAttribute("nspluginurl"),
+                new JspUtil.ValidAttribute("iepluginurl")};
+
         private static final JspUtil.ValidAttribute[] attributeAttrs = {
-            new JspUtil.ValidAttribute("name", true),
-            new JspUtil.ValidAttribute("trim") };
-            
+                new JspUtil.ValidAttribute("name", true),
+                new JspUtil.ValidAttribute("trim")};
+
         private static final JspUtil.ValidAttribute[] invokeAttrs = {
-            new JspUtil.ValidAttribute("fragment", true),
-            new JspUtil.ValidAttribute("var"),
-            new JspUtil.ValidAttribute("varReader"),
-            new JspUtil.ValidAttribute("scope") };
+                new JspUtil.ValidAttribute("fragment", true),
+                new JspUtil.ValidAttribute("var"),
+                new JspUtil.ValidAttribute("varReader"),
+                new JspUtil.ValidAttribute("scope")};
 
         private static final JspUtil.ValidAttribute[] doBodyAttrs = {
-            new JspUtil.ValidAttribute("var"),
-            new JspUtil.ValidAttribute("varReader"),
-            new JspUtil.ValidAttribute("scope") };
+                new JspUtil.ValidAttribute("var"),
+                new JspUtil.ValidAttribute("varReader"),
+                new JspUtil.ValidAttribute("scope")};
 
         private static final JspUtil.ValidAttribute[] jspOutputAttrs = {
-            new JspUtil.ValidAttribute("omit-xml-declaration"),
-            new JspUtil.ValidAttribute("doctype-root-element"),
-            new JspUtil.ValidAttribute("doctype-public"),
-            new JspUtil.ValidAttribute("doctype-system") };
+                new JspUtil.ValidAttribute("omit-xml-declaration"),
+                new JspUtil.ValidAttribute("doctype-root-element"),
+                new JspUtil.ValidAttribute("doctype-public"),
+                new JspUtil.ValidAttribute("doctype-system")};
 
         /*
          * Constructor
@@ -389,7 +389,7 @@
 
         public void visit(Node.JspRoot n) throws JasperException {
             JspUtil.checkAttributes("Jsp:root", n,
-                                    jspRootAttrs, err);
+                    jspRootAttrs, err);
             String version = n.getTextAttribute("version");
             if (!version.equals("1.2") && !version.equals("2.0")) {
                 err.jspError(n, "jsp.error.jsproot.version.invalid", version);
@@ -399,13 +399,13 @@
 
         public void visit(Node.IncludeDirective n) throws JasperException {
             JspUtil.checkAttributes("Include directive", n,
-                                    includeDirectiveAttrs, err);
+                    includeDirectiveAttrs, err);
             visitBody(n);
         }
 
         public void visit(Node.TaglibDirective n) throws JasperException {
             JspUtil.checkAttributes("Taglib directive", n,
-                                    taglibDirectiveAttrs, err);
+                    taglibDirectiveAttrs, err);
             // Either 'uri' or 'tagdir' attribute must be specified
             String uri = n.getAttributeValue("uri");
             String tagdir = n.getAttributeValue("tagdir");
@@ -419,14 +419,14 @@
 
         public void visit(Node.ParamAction n) throws JasperException {
             JspUtil.checkAttributes("Param action", n,
-                                    paramActionAttrs, err);
+                    paramActionAttrs, err);
             // make sure the value of the 'name' attribute is not a
             // request-time expression
             throwErrorIfExpression(n, "name", "jsp:param");
             n.setValue(getJspAttribute("value", null, null,
-                                       n.getAttributeValue("value"),
-                                       java.lang.String.class,
-                                       n, false));
+                    n.getAttributeValue("value"),
+                    java.lang.String.class,
+                    n, false));
             visitBody(n);
         }
 
@@ -441,59 +441,61 @@
 
         public void visit(Node.IncludeAction n) throws JasperException {
             JspUtil.checkAttributes("Include action", n,
-                                    includeActionAttrs, err);
+                    includeActionAttrs, err);
             n.setPage(getJspAttribute("page", null, null,
-                                      n.getAttributeValue("page"), 
-                                      java.lang.String.class, n, false));
+                    n.getAttributeValue("page"),
+                    java.lang.String.class, n, false));
             visitBody(n);
-        };
+        }
+
+        ;
 
         public void visit(Node.ForwardAction n) throws JasperException {
             JspUtil.checkAttributes("Forward", n,
-                                    forwardActionAttrs, err);
+                    forwardActionAttrs, err);
             n.setPage(getJspAttribute("page", null, null,
-                                      n.getAttributeValue("page"), 
-                                      java.lang.String.class, n, false));
+                    n.getAttributeValue("page"),
+                    java.lang.String.class, n, false));
             visitBody(n);
         }
 
         public void visit(Node.GetProperty n) throws JasperException {
             JspUtil.checkAttributes("GetProperty", n,
-                                    getPropertyAttrs, err);
+                    getPropertyAttrs, err);
         }
 
         public void visit(Node.SetProperty n) throws JasperException {
             JspUtil.checkAttributes("SetProperty", n,
-                                    setPropertyAttrs, err);
+                    setPropertyAttrs, err);
             String property = n.getTextAttribute("property");
             String param = n.getTextAttribute("param");
             String value = n.getAttributeValue("value");
 
-            n.setValue(getJspAttribute("value", null, null, value, 
-                java.lang.Object.class, n, false));
+            n.setValue(getJspAttribute("value", null, null, value,
+                    java.lang.Object.class, n, false));
 
             boolean valueSpecified = n.getValue() != null;
 
-            if ("*".equals(property)) { 
+            if ("*".equals(property)) {
                 if (param != null || valueSpecified)
                     err.jspError(n, "jsp.error.setProperty.invalid");
-                
+
             } else if (param != null && valueSpecified) {
                 err.jspError(n, "jsp.error.setProperty.invalid");
             }
-            
+
             visitBody(n);
         }
 
         public void visit(Node.UseBean n) throws JasperException {
             JspUtil.checkAttributes("UseBean", n,
-                                    useBeanAttrs, err);
+                    useBeanAttrs, err);
 
-            String name = n.getTextAttribute ("id");
-            String scope = n.getTextAttribute ("scope");
+            String name = n.getTextAttribute("id");
+            String scope = n.getTextAttribute("scope");
             JspUtil.checkScope(scope, n, err);
-            String className = n.getTextAttribute ("class");
-            String type = n.getTextAttribute ("type");
+            String className = n.getTextAttribute("class");
+            String type = n.getTextAttribute("type");
             BeanRepository beanInfo = pageInfo.getBeanRepository();
 
             if (className == null && type == null)
@@ -506,9 +508,9 @@
                 err.jspError(n, "jsp.error.usebean.noSession");
 
             Node.JspAttribute jattr
-                = getJspAttribute("beanName", null, null,
-                                  n.getAttributeValue("beanName"),
-                                  java.lang.String.class, n, false);
+                    = getJspAttribute("beanName", null, null,
+                    n.getAttributeValue("beanName"),
+                    java.lang.String.class, n, false);
             n.setBeanName(jattr);
             if (className != null && jattr != null)
                 err.jspError(n, "jsp.error.usebean.notBoth");
@@ -543,32 +545,32 @@
                 err.jspError(n, "jsp.error.plugin.badtype");
             if (n.getTextAttribute("code") == null)
                 err.jspError(n, "jsp.error.plugin.nocode");
-            
+
             Node.JspAttribute width
-                = getJspAttribute("width", null, null,
-                                  n.getAttributeValue("width"), 
-                                  java.lang.String.class, n, false);
-            n.setWidth( width );
-            
+                    = getJspAttribute("width", null, null,
+                    n.getAttributeValue("width"),
+                    java.lang.String.class, n, false);
+            n.setWidth(width);
+
             Node.JspAttribute height
-                = getJspAttribute("height", null, null,
-                                  n.getAttributeValue("height"), 
-                                  java.lang.String.class, n, false);
-            n.setHeight( height );
+                    = getJspAttribute("height", null, null,
+                    n.getAttributeValue("height"),
+                    java.lang.String.class, n, false);
+            n.setHeight(height);
 
             visitBody(n);
         }
 
         public void visit(Node.NamedAttribute n) throws JasperException {
             JspUtil.checkAttributes("Attribute", n,
-                                    attributeAttrs, err);
+                    attributeAttrs, err);
             visitBody(n);
         }
-        
+
         public void visit(Node.JspBody n) throws JasperException {
             visitBody(n);
         }
-        
+
         public void visit(Node.Declaration n) throws JasperException {
             if (pageInfo.isScriptingInvalid()) {
                 err.jspError(n.getStart(), "jsp.error.no.scriptlets");
@@ -588,17 +590,17 @@
         }
 
         public void visit(Node.ELExpression n) throws JasperException {
-            if ( !pageInfo.isELIgnored() ) {
+            if (!pageInfo.isELIgnored()) {
                 String expressions = "${" + new String(n.getText()) + "}";
                 ELNode.Nodes el = ELParser.parse(expressions);
                 validateFunctions(el, n);
                 JspUtil.validateExpressions(
-                    n.getStart(),
-                    expressions,
-                    java.lang.String.class, // XXX - Should template text 
-                                            // always evaluate to String?
-                    getFunctionMapper(el),
-                    err);
+                        n.getStart(),
+                        expressions,
+                        java.lang.String.class, // XXX - Should template text
+                        // always evaluate to String?
+                        getFunctionMapper(el),
+                        err);
                 n.setEL(el);
             }
         }
@@ -612,14 +614,14 @@
             if (attrs != null) {
                 int attrSize = attrs.getLength();
                 Node.JspAttribute[] jspAttrs = new Node.JspAttribute[attrSize];
-                for (int i=0; i < attrSize; i++) {
+                for (int i = 0; i < attrSize; i++) {
                     jspAttrs[i] = getJspAttribute(attrs.getQName(i),
-                                                  attrs.getURI(i),
-                                                  attrs.getLocalName(i),
-                                                  attrs.getValue(i),
-                                                  java.lang.Object.class,
-                                                  n,
-                                                  false);
+                            attrs.getURI(i),
+                            attrs.getLocalName(i),
+                            attrs.getValue(i),
+                            java.lang.Object.class,
+                            n,
+                            false);
                 }
                 n.setJspAttributes(jspAttrs);
             }
@@ -638,7 +640,7 @@
              * The bodyconet of a SimpleTag cannot be JSP.
              */
             if (n.implementsSimpleTag() &&
-                tagInfo.getBodyContent().equalsIgnoreCase(TagInfo.BODY_CONTENT_JSP)) {
+                    tagInfo.getBodyContent().equalsIgnoreCase(TagInfo.BODY_CONTENT_JSP)) {
                 err.jspError(n, "jsp.error.simpletag.badbodycontent",
                         tagInfo.getTagClassName());
             }
@@ -651,7 +653,7 @@
             if (tagInfo.hasDynamicAttributes()
                     && !n.implementsDynamicAttributes()) {
                 err.jspError(n, "jsp.error.dynamic.attributes.not.implemented",
-                             n.getQName());
+                        n.getQName());
             }
 
             /*
@@ -664,25 +666,25 @@
             String customActionUri = n.getURI();
             Attributes attrs = n.getAttributes();
             int attrsSize = (attrs == null) ? 0 : attrs.getLength();
-            for (int i=0; i<tldAttrs.length; i++) {
+            for (int i = 0; i < tldAttrs.length; i++) {
                 String attr = null;
                 if (attrs != null) {
                     attr = attrs.getValue(tldAttrs[i].getName());
                     if (attr == null) {
                         attr = attrs.getValue(customActionUri,
-                                              tldAttrs[i].getName());
+                                tldAttrs[i].getName());
                     }
                 }
                 Node.NamedAttribute na =
                         n.getNamedAttributeNode(tldAttrs[i].getName());
-                
+
                 if (tldAttrs[i].isRequired() && attr == null && na == null) {
                     err.jspError(n, "jsp.error.missing_attribute",
-                                 tldAttrs[i].getName(), n.getLocalName());
+                            tldAttrs[i].getName(), n.getLocalName());
                 }
                 if (attr != null && na != null) {
                     err.jspError(n, "jsp.error.duplicate.name.jspattribute",
-                        tldAttrs[i].getName());
+                            tldAttrs[i].getName());
                 }
             }
 
@@ -708,7 +710,7 @@
                     && tei.getVariableInfo(tagData).length > 0
                     && tagInfo.getTagVariableInfos().length > 0) {
                 err.jspError("jsp.error.non_null_tei_and_var_subelems",
-                             n.getQName());
+                        n.getQName());
             }
 
             n.setTagData(tagData);
@@ -729,31 +731,31 @@
 
             // XML-style 'name' attribute, which is mandatory, must not be
             // included in JspAttribute array
-            int jspAttrSize = xmlAttrLen-1 + namedAttrs.size();
+            int jspAttrSize = xmlAttrLen - 1 + namedAttrs.size();
 
             Node.JspAttribute[] jspAttrs = new Node.JspAttribute[jspAttrSize];
             int jspAttrIndex = 0;
 
             // Process XML-style attributes
-            for (int i=0; i<xmlAttrLen; i++) {
+            for (int i = 0; i < xmlAttrLen; i++) {
                 if ("name".equals(attrs.getLocalName(i))) {
                     n.setNameAttribute(getJspAttribute(attrs.getQName(i),
-                                                       attrs.getURI(i),
-                                                       attrs.getLocalName(i),
-                                                       attrs.getValue(i),
-                                                       java.lang.String.class,
-                                                       n,
-                                                       false));
+                            attrs.getURI(i),
+                            attrs.getLocalName(i),
+                            attrs.getValue(i),
+                            java.lang.String.class,
+                            n,
+                            false));
                 } else {
-                    if (jspAttrIndex<jspAttrSize) {
+                    if (jspAttrIndex < jspAttrSize) {
                         jspAttrs[jspAttrIndex++]
-                            = getJspAttribute(attrs.getQName(i),
-                                              attrs.getURI(i),
-                                              attrs.getLocalName(i),
-                                              attrs.getValue(i),
-                                              java.lang.Object.class,
-                                              n,
-                                              false);
+                                = getJspAttribute(attrs.getQName(i),
+                                attrs.getURI(i),
+                                attrs.getLocalName(i),
+                                attrs.getValue(i),
+                                java.lang.Object.class,
+                                n,
+                                false);
                     }
                 }
             }
@@ -762,9 +764,9 @@
             }
 
             // Process named attributes
-            for (int i=0; i<namedAttrs.size(); i++) {
+            for (int i = 0; i < namedAttrs.size(); i++) {
                 Node.NamedAttribute na =
-                    (Node.NamedAttribute) namedAttrs.getNode(i);
+                        (Node.NamedAttribute) namedAttrs.getNode(i);
                 jspAttrs[jspAttrIndex++] = new Node.JspAttribute(na, false);
             }
 
@@ -791,31 +793,31 @@
             String doctypeSystemOld = pageInfo.getDoctypeSystem();
 
             if (omitXmlDecl != null && omitXmlDeclOld != null &&
-                        !omitXmlDecl.equals(omitXmlDeclOld) ) {
+                    !omitXmlDecl.equals(omitXmlDeclOld)) {
                 err.jspError(n, "jsp.error.jspoutput.conflict",
                         "omit-xml-declaration", omitXmlDeclOld, omitXmlDecl);
             }
 
             if (doctypeName != null && doctypeNameOld != null &&
-                        !doctypeName.equals(doctypeNameOld) ) {
+                    !doctypeName.equals(doctypeNameOld)) {
                 err.jspError(n, "jsp.error.jspoutput.conflict",
                         "doctype-root-element", doctypeNameOld, doctypeName);
             }
 
             if (doctypePublic != null && doctypePublicOld != null &&
-                        !doctypePublic.equals(doctypePublicOld) ) {
+                    !doctypePublic.equals(doctypePublicOld)) {
                 err.jspError(n, "jsp.error.jspoutput.conflict",
                         "doctype-public", doctypePublicOld, doctypePublic);
             }
 
             if (doctypeSystem != null && doctypeSystemOld != null &&
-                        !doctypeSystem.equals(doctypeSystemOld) ) {
+                    !doctypeSystem.equals(doctypeSystemOld)) {
                 err.jspError(n, "jsp.error.jspoutput.conflict",
                         "doctype-system", doctypeSystemOld, doctypeSystem);
             }
 
             if (doctypeName == null && doctypeSystem != null ||
-                doctypeName != null && doctypeSystem == null) {
+                    doctypeName != null && doctypeSystem == null) {
                 err.jspError(n, "jsp.error.jspoutput.doctypenamesystem");
             }
 
@@ -841,7 +843,7 @@
 
             JspUtil.checkAttributes("Invoke", n, invokeAttrs, err);
 
-            String scope = n.getTextAttribute ("scope");
+            String scope = n.getTextAttribute("scope");
             JspUtil.checkScope(scope, n, err);
 
             String var = n.getTextAttribute("var");
@@ -858,7 +860,7 @@
 
             JspUtil.checkAttributes("DoBody", n, doBodyAttrs, err);
 
-            String scope = n.getTextAttribute ("scope");
+            String scope = n.getTextAttribute("scope");
             JspUtil.checkScope(scope, n, err);
 
             String var = n.getTextAttribute("var");
@@ -904,37 +906,36 @@
             TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
             Attributes attrs = n.getAttributes();
 
-            for (int i=0; attrs != null && i<attrs.getLength(); i++) {
+            for (int i = 0; attrs != null && i < attrs.getLength(); i++) {
                 boolean found = false;
-                for (int j=0; tldAttrs != null && j<tldAttrs.length; j++) {
+                for (int j = 0; tldAttrs != null && j < tldAttrs.length; j++) {
                     if (attrs.getLocalName(i).equals(tldAttrs[j].getName())
                             && (attrs.getURI(i) == null
-                                || attrs.getURI(i).length() == 0
-                                || attrs.getURI(i).equals(n.getURI()))) {
+                            || attrs.getURI(i).length() == 0
+                            || attrs.getURI(i).equals(n.getURI()))) {
                         if (tldAttrs[j].canBeRequestTime()) {
                             Class expectedType = String.class;
                             try {
                                 String typeStr = tldAttrs[j].getTypeName();
-                                if( tldAttrs[j].isFragment() ) {
+                                if (tldAttrs[j].isFragment()) {
                                     expectedType = JspFragment.class;
-                                }
-                                else if( typeStr != null ) {
+                                } else if (typeStr != null) {
                                     expectedType = JspUtil.toClass(typeStr,
-                                                                   loader);
+                                            loader);
                                 }
                                 jspAttrs[i]
-                                    = getJspAttribute(attrs.getQName(i),
-                                                      attrs.getURI(i),
-                                                      attrs.getLocalName(i),
-                                                      attrs.getValue(i),
-                                                      expectedType,
-                                                      n,
-                                                      false);
+                                        = getJspAttribute(attrs.getQName(i),
+                                        attrs.getURI(i),
+                                        attrs.getLocalName(i),
+                                        attrs.getValue(i),
+                                        expectedType,
+                                        n,
+                                        false);
                             } catch (ClassNotFoundException e) {
-                                err.jspError(n, 
-                                    "jsp.error.unknown_attribute_type",
-                                    tldAttrs[j].getName(), 
-                                    tldAttrs[j].getTypeName() );
+                                err.jspError(n,
+                                        "jsp.error.unknown_attribute_type",
+                                        tldAttrs[j].getName(),
+                                        tldAttrs[j].getTypeName());
                             }
                         } else {
                             // Attribute does not accept any expressions.
@@ -942,23 +943,23 @@
                             if (isExpression(n, attrs.getValue(i))) {
                                 err.jspError(n,
                                         "jsp.error.attribute.custom.non_rt_with_expr",
-                                             tldAttrs[j].getName());
+                                        tldAttrs[j].getName());
                             }
                             jspAttrs[i]
-                                = new Node.JspAttribute(attrs.getQName(i),
-                                                        attrs.getURI(i),
-                                                        attrs.getLocalName(i),
-                                                        attrs.getValue(i),
-                                                        false,
-                                                        null,
-                                                        false);
+                                    = new Node.JspAttribute(attrs.getQName(i),
+                                    attrs.getURI(i),
+                                    attrs.getLocalName(i),
+                                    attrs.getValue(i),
+                                    false,
+                                    null,
+                                    false);
                         }
                         if (isExpression(n, attrs.getValue(i))) {
                             tagDataAttrs.put(attrs.getQName(i),
-                                             TagData.REQUEST_TIME_VALUE);
+                                    TagData.REQUEST_TIME_VALUE);
                         } else {
                             tagDataAttrs.put(attrs.getQName(i),
-                                             attrs.getValue(i));
+                                    attrs.getValue(i));
                         }
                         found = true;
                         break;
@@ -967,15 +968,15 @@
                 if (!found) {
                     if (tagInfo.hasDynamicAttributes()) {
                         jspAttrs[i] = getJspAttribute(attrs.getQName(i),
-                                                      attrs.getURI(i),
-                                                      attrs.getLocalName(i),
-                                                      attrs.getValue(i),
-                                                      java.lang.Object.class,
-                                                      n,
-                                                      true);
+                                attrs.getURI(i),
+                                attrs.getLocalName(i),
+                                attrs.getValue(i),
+                                java.lang.Object.class,
+                                n,
+                                true);
                     } else {
                         err.jspError(n, "jsp.error.bad_attribute",
-                                     attrs.getQName(i), n.getLocalName());
+                                attrs.getQName(i), n.getLocalName());
                     }
                 }
             }
@@ -998,11 +999,11 @@
             TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
             Node.Nodes naNodes = n.getNamedAttributeNodes();
 
-            for (int i=0; i<naNodes.size(); i++) {
+            for (int i = 0; i < naNodes.size(); i++) {
                 Node.NamedAttribute na = (Node.NamedAttribute)
-                    naNodes.getNode(i);
+                        naNodes.getNode(i);
                 boolean found = false;
-                for (int j=0; j<tldAttrs.length; j++) {
+                for (int j = 0; j < tldAttrs.length; j++) {
                     /*
                      * See above comment about namespace matches. For named
                      * attributes, we use the prefix instead of URI as the
@@ -1015,7 +1016,7 @@
                     String attrPrefix = na.getPrefix();
                     if (na.getLocalName().equals(tldAttrs[j].getName())
                             && (attrPrefix == null || attrPrefix.length() == 0
-                                || attrPrefix.equals(n.getPrefix()))) {
+                            || attrPrefix.equals(n.getPrefix()))) {
                         jspAttrs[start + i] = new Node.JspAttribute(na, false);
                         NamedAttributeVisitor nav = null;
                         if (na.getBody() != null) {
@@ -1024,9 +1025,9 @@
                         }
                         if (nav != null && nav.hasDynamicContent()) {
                             tagDataAttrs.put(na.getName(),
-                                             TagData.REQUEST_TIME_VALUE);
+                                    TagData.REQUEST_TIME_VALUE);
                         } else {
-                            tagDataAttrs.put(na.getName(), na.getText());    
+                            tagDataAttrs.put(na.getName(), na.getText());
                         }
                         found = true;
                         break;
@@ -1037,7 +1038,7 @@
                         jspAttrs[start + i] = new Node.JspAttribute(na, true);
                     } else {
                         err.jspError(n, "jsp.error.bad_attribute",
-                                     na.getName(), n.getLocalName());
+                                na.getName(), n.getLocalName());
                     }
                 }
             }
@@ -1046,7 +1047,7 @@
         /**
          * Preprocess attributes that can be expressions.  Expression
          * delimiters are stripped.
-         * <p>
+         * <p/>
          * If value is null, checks if there are any
          * NamedAttribute subelements in the tree node, and if so,
          * constructs a JspAttribute out of a child NamedAttribute node.
@@ -1069,25 +1070,23 @@
             if (value != null) {
                 if (n.getRoot().isXmlSyntax() && value.startsWith("%=")) {
                     result = new Node.JspAttribute(
-                                        qName,
-                                        uri,
-                                        localName,
-                                        value.substring(2, value.length()-1),
-                                        true,
-                                        null,
-                                        dynamic);
-                }
-                else if(!n.getRoot().isXmlSyntax() && value.startsWith("<%=")) {
+                            qName,
+                            uri,
+                            localName,
+                            value.substring(2, value.length() - 1),
+                            true,
+                            null,
+                            dynamic);
+                } else if (!n.getRoot().isXmlSyntax() && value.startsWith("<%=")) {
                     result = new Node.JspAttribute(
-                                        qName,
-                                        uri,
-                                        localName,
-                                        value.substring(3, value.length()-2),
-                                        true,
-                                        null,
-                                        dynamic);
-                }
-                else {
+                            qName,
+                            uri,
+                            localName,
+                            value.substring(3, value.length() - 2),
+                            true,
+                            null,
+                            dynamic);
+                } else {
                     // The attribute can contain expressions but is not a
                     // scriptlet expression; thus, we want to run it through 
                     // the expression interpreter
@@ -1098,34 +1097,33 @@
                     if (el.containsEL() && !pageInfo.isELIgnored()) {
                         validateFunctions(el, n);
                         JspUtil.validateExpressions(
-                            n.getStart(),
-                            value, 
-                            expectedType, 
-                            getFunctionMapper(el),
-                            this.err);
+                                n.getStart(),
+                                value,
+                                expectedType,
+                                getFunctionMapper(el),
+                                this.err);
 
-                        
+
                         result = new Node.JspAttribute(qName, uri, localName,
-                                                       value, false, el,
-                                                       dynamic);
+                                value, false, el,
+                                dynamic);
                     } else {
                         value = value.replace(Constants.HACK_CHAR, '$');
                         result = new Node.JspAttribute(qName, uri, localName,
-                                                       value, false, null,
-                                                       dynamic);
+                                value, false, null,
+                                dynamic);
                     }
                 }
-            }
-            else {
+            } else {
                 // Value is null.  Check for any NamedAttribute subnodes
                 // that might contain the value for this attribute.
                 // Otherwise, the attribute wasn't found so we return null.
 
                 Node.NamedAttribute namedAttributeNode =
-                    n.getNamedAttributeNode( qName );
-                if( namedAttributeNode != null ) {
+                        n.getNamedAttributeNode(qName);
+                if (namedAttributeNode != null) {
                     result = new Node.JspAttribute(namedAttributeNode,
-                                                   dynamic);
+                            dynamic);
                 }
             }
 
@@ -1152,13 +1150,13 @@
          */
         private void throwErrorIfExpression(Node n, String attrName,
                                             String actionName)
-                    throws JasperException {
+                throws JasperException {
             if (n.getAttributes() != null
                     && n.getAttributes().getValue(attrName) != null
                     && isExpression(n, n.getAttributes().getValue(attrName))) {
                 err.jspError(n,
-                             "jsp.error.attribute.standard.non_rt_with_expr",
-                             attrName, actionName);
+                        "jsp.error.attribute.standard.non_rt_with_expr",
+                        attrName, actionName);
             }
         }
 
@@ -1172,7 +1170,7 @@
                 }
                 visitBody(n);
             }
-            
+
             public boolean hasDynamicContent() {
                 return hasDynamicContent;
             }
@@ -1191,9 +1189,9 @@
                     if (prefix == null && k < 0) {
                         // prefix not specified and a default ns found
                         return attrs.getValue(i);
-                    }   
+                    }
                     if (prefix != null && k >= 0 &&
-                                prefix.equals(name.substring(k+1))) {
+                            prefix.equals(name.substring(k + 1))) {
                         return attrs.getValue(i);
                     }
                 }
@@ -1204,7 +1202,7 @@
         /**
          * Validate functions in EL expressions
          */
-        private void validateFunctions(ELNode.Nodes el, Node n) 
+        private void validateFunctions(ELNode.Nodes el, Node n)
                 throws JasperException {
 
             class FVVisitor extends ELNode.Visitor {
@@ -1229,11 +1227,10 @@
                     if (uri == null) {
                         if (prefix == null) {
                             err.jspError(n, "jsp.error.noFunctionPrefix",
-                                function);
-                        }
-                        else {
+                                    function);
+                        } else {
                             err.jspError(n,
-                                "jsp.error.attribute.invalidPrefix", prefix);
+                                    "jsp.error.attribute.invalidPrefix", prefix);
                         }
                     }
                     TagLibraryInfo taglib = pageInfo.getTaglib(uri);
@@ -1267,25 +1264,26 @@
                 throws JasperException {
             FunctionInfo funcInfo = func.getFunctionInfo();
             String signature = funcInfo.getFunctionSignature();
-            
+
             int start = signature.indexOf(' ');
             if (start < 0) {
                 err.jspError("jsp.error.tld.fn.invalid.signature",
-                             func.getPrefix(), func.getName());
+                        func.getPrefix(), func.getName());
             }
             int end = signature.indexOf('(');
             if (end < 0) {
                 err.jspError("jsp.error.tld.fn.invalid.signature.parenexpected",
-                             func.getPrefix(), func.getName());
+                        func.getPrefix(), func.getName());
             }
-            return signature.substring(start+1, end).trim();
+            return signature.substring(start + 1, end).trim();
         }
 
         /**
          * Get the parameters types from the function signature.
+         *
          * @return An array of parameter class names
          */
-        private String[] getParameters(ELNode.Function func) 
+        private String[] getParameters(ELNode.Function func)
                 throws JasperException {
             FunctionInfo funcInfo = func.getFunctionInfo();
             String signature = funcInfo.getFunctionSignature();
@@ -1301,7 +1299,7 @@
                     p = signature.indexOf(')', start);
                     if (p < 0) {
                         err.jspError("jsp.error.tld.fn.invalid.signature",
-                                     func.getPrefix(), func.getName());
+                                func.getPrefix(), func.getName());
                     }
                     lastArg = true;
                 }
@@ -1312,7 +1310,7 @@
                 if (lastArg) {
                     break;
                 }
-                start = p+1;
+                start = p + 1;
             }
             return (String[]) params.toArray(new String[params.size()]);
         }
@@ -1323,6 +1321,7 @@
             class ValidateFunctionMapper implements FunctionMapper {
 
                 private HashMap fnmap = new java.util.HashMap();
+
                 public void mapFunction(String fnQName, Method method) {
                     fnmap.put(fnQName, method);
                 }
@@ -1349,9 +1348,9 @@
                                 n.getFunctionInfo().getFunctionClass());
                     } catch (ClassNotFoundException e) {
                         err.jspError("jsp.error.function.classnotfound",
-                                     n.getFunctionInfo().getFunctionClass(),
-                                     n.getPrefix() + ':' + n.getName(),
-                                     e.getMessage());
+                                n.getFunctionInfo().getFunctionClass(),
+                                n.getPrefix() + ':' + n.getName(),
+                                e.getMessage());
                     }
                     String paramTypes[] = n.getParameters();
                     int size = paramTypes.length;
@@ -1362,19 +1361,19 @@
                             params[i] = JspUtil.toClass(paramTypes[i], loader);
                         }
                         method = c.getDeclaredMethod(n.getMethodName(),
-                                                     params);
+                                params);
                     } catch (ClassNotFoundException e) {
                         err.jspError("jsp.error.signature.classnotfound",
-                                     paramTypes[i],
-                                     n.getPrefix() + ':' + n.getName(),
-                                     e.getMessage());
-                    } catch (NoSuchMethodException e ) {
+                                paramTypes[i],
+                                n.getPrefix() + ':' + n.getName(),
+                                e.getMessage());
+                    } catch (NoSuchMethodException e) {
                         err.jspError("jsp.error.noFunctionMethod",
-                                     n.getMethodName(), n.getName(),
-                                     c.getName());
+                                n.getMethodName(), n.getName(),
+                                c.getName());
                     }
                     fmapper.mapFunction(n.getPrefix() + ':' + n.getName(),
-                                        method);
+                            method);
                 }
             }
 
@@ -1411,7 +1410,7 @@
                 errMsg.append(Localizer.getMessage(
                         "jsp.error.tei.invalid.attributes", n.getQName()));
                 errMsg.append("</h3>");
-                for (int i=0; i<errors.length; i++) {
+                for (int i = 0; i < errors.length; i++) {
                     errMsg.append("<p>");
                     if (errors[i].getId() != null) {
                         errMsg.append(errors[i].getId());
@@ -1445,7 +1444,7 @@
             boolean isXml = page.getRoot().isXmlSyntax();
             String defaultType;
             if (contentType == null) {
-                defaultType = isXml? "text/xml": "text/html";
+                defaultType = isXml ? "text/xml" : "text/html";
             } else {
                 defaultType = contentType;
             }
@@ -1497,13 +1496,13 @@
      * imported tag libraries.
      */
     private static void validateXmlView(PageData xmlView, Compiler compiler)
-                throws JasperException {
+            throws JasperException {
 
         StringBuffer errMsg = null;
         ErrorDispatcher errDisp = compiler.getErrorDispatcher();
 
-        for (Iterator iter=compiler.getPageInfo().getTaglibs().iterator();
-                 iter.hasNext(); ) {
+        for (Iterator iter = compiler.getPageInfo().getTaglibs().iterator();
+             iter.hasNext();) {
 
             Object o = iter.next();
             if (!(o instanceof TagLibraryInfoImpl))
@@ -1520,7 +1519,7 @@
                         tli.getShortName(),
                         compiler.getPageInfo().getJspFile()));
                 errMsg.append("</h3>");
-                for (int i=0; i<errors.length; i++) {
+                for (int i = 0; i < errors.length; i++) {
                     if (errors[i] != null) {
                         errMsg.append("<p>");
                         errMsg.append(errors[i].getId());
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPlugin.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPlugin.java
index b798874..57ef8e7 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPlugin.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPlugin.java
@@ -21,7 +21,7 @@
  * This interface is to be implemented by the plugin author, to supply
  * an alternate implementation of the tag handlers.  It can be used to
  * specify the Java codes to be generated when a tag is invoked.
- *
+ * <p/>
  * An implementation of this interface must be registered in a file
  * named "tagPlugins.xml" under WEB-INF.
  */
@@ -30,6 +30,7 @@
 
     /**
      * Generate codes for a custom tag.
+     *
      * @param ctxt a TagPluginContext for accessing Jasper functions
      */
     void doTag(TagPluginContext ctxt);
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPluginContext.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPluginContext.java
index 30e0a60..2ddd73f 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPluginContext.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/compiler/tagplugin/TagPluginContext.java
@@ -43,6 +43,7 @@
 
     /**
      * Generate an import statement
+     *
      * @param s Name of the import class, '*' allowed.
      */
     void generateImport(String s);
@@ -50,13 +51,14 @@
     /**
      * Generate a declaration in the of the generated class.  This can be
      * used to declare an innter class, a method, or a class variable.
-     * @param id An unique ID identifying the declaration.  It is not
-     *           part of the declaration, and is used to ensure that the
-     *           declaration will only appear once.  If this method is
-     *           invoked with the same id more than once in the translation
-     *           unit, only the first declaration will be taken.
+     *
+     * @param id   An unique ID identifying the declaration.  It is not
+     *             part of the declaration, and is used to ensure that the
+     *             declaration will only appear once.  If this method is
+     *             invoked with the same id more than once in the translation
+     *             unit, only the first declaration will be taken.
      * @param text The text of the declaration.
-     **/
+     */
     void generateDeclaration(String id, String text);
 
     /**
@@ -81,6 +83,7 @@
      * Generate codesto evaluate value of a attribute in the custom tag
      * The codes is a Java expression.
      * NOTE: Currently cannot handle attributes that are fragments.
+     *
      * @param attribute The specified attribute
      */
     void generateAttribute(String attribute);
@@ -103,6 +106,7 @@
      * The operations available for PluginContext so obtained is limited
      * to getPluginAttribute and setPluginAttribute, and queries (e.g.
      * isScriptless().  There should be no calls to generate*().
+     *
      * @return The pluginContext for the parent node.
      *         null if the parent is not a custom tag, or if the pluginConxt
      *         if not available (because useTagPlugin is false, e.g).
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/BodyContentImpl.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/BodyContentImpl.java
index 9c0eebb..4aa07dc 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/BodyContentImpl.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/BodyContentImpl.java
@@ -29,30 +29,30 @@
 /**
  * Write text to a character-output stream, buffering characters so as
  * to provide for the efficient writing of single characters, arrays,
- * and strings. 
- *
- * Provide support for discarding for the output that has been buffered. 
+ * and strings.
+ * <p/>
+ * Provide support for discarding for the output that has been buffered.
  *
  * @author Rajiv Mordani
  * @author Jan Luehe
  */
 public class BodyContentImpl extends BodyContent {
-    
-    private static final String LINE_SEPARATOR = 
-        System.getProperty("line.separator");
-    private static final boolean LIMIT_BUFFER = 
-        Boolean.valueOf(System.getProperty("org.apache.struts2.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "false")).booleanValue();
-    
+
+    private static final String LINE_SEPARATOR =
+            System.getProperty("line.separator");
+    private static final boolean LIMIT_BUFFER =
+            Boolean.valueOf(System.getProperty("org.apache.struts2.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "false")).booleanValue();
+
     private char[] cb;
     private int nextChar;
     private boolean closed;
-    
+
     // Enclosed writer to which any output is written
     private Writer writer;
-    
+
     // See comment in setWriter()
     private int bufferSizeSave;
-    
+
     /**
      * Constructor.
      */
@@ -63,7 +63,7 @@
         nextChar = 0;
         closed = false;
     }
-    
+
     /**
      * Write a single character.
      */
@@ -73,15 +73,15 @@
         } else {
             ensureOpen();
             if (nextChar >= bufferSize) {
-                reAllocBuff (1);
+                reAllocBuff(1);
             }
             cb[nextChar++] = (char) c;
         }
     }
-    
+
     /**
      * Write a portion of an array of characters.
-     *
+     * <p/>
      * <p> Ordinarily this method stores characters from the given array into
      * this stream's buffer, flushing the buffer to the underlying stream as
      * needed.  If the requested length is at least as large as the buffer,
@@ -91,30 +91,30 @@
      * unnecessarily.
      *
      * @param cbuf A character array
-     * @param off Offset from which to start reading characters
-     * @param len Number of characters to write
+     * @param off  Offset from which to start reading characters
+     * @param len  Number of characters to write
      */
     public void write(char[] cbuf, int off, int len) throws IOException {
         if (writer != null) {
             writer.write(cbuf, off, len);
         } else {
             ensureOpen();
-            
+
             if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                     ((off + len) > cbuf.length) || ((off + len) < 0)) {
                 throw new IndexOutOfBoundsException();
             } else if (len == 0) {
                 return;
-            } 
-            
+            }
+
             if (len >= bufferSize - nextChar)
-                reAllocBuff (len);
-            
+                reAllocBuff(len);
+
             System.arraycopy(cbuf, off, cb, nextChar, len);
-            nextChar+=len;
+            nextChar += len;
         }
     }
-    
+
     /**
      * Write an array of characters.  This method cannot be inherited from the
      * Writer class because it must suppress I/O exceptions.
@@ -126,11 +126,11 @@
             write(buf, 0, buf.length);
         }
     }
-    
+
     /**
      * Write a portion of a String.
      *
-     * @param s String to be written
+     * @param s   String to be written
      * @param off Offset from which to start reading characters
      * @param len Number of characters to be written
      */
@@ -141,12 +141,12 @@
             ensureOpen();
             if (len >= bufferSize - nextChar)
                 reAllocBuff(len);
-            
+
             s.getChars(off, off + len, cb, nextChar);
             nextChar += len;
         }
     }
-    
+
     /**
      * Write a string.  This method cannot be inherited from the Writer class
      * because it must suppress I/O exceptions.
@@ -158,7 +158,7 @@
             write(s, 0, s.length());
         }
     }
-    
+
     /**
      * Write a line separator.  The line separator string is defined by the
      * system property <tt>line.separator</tt>, and is not necessarily a single
@@ -173,7 +173,7 @@
             write(LINE_SEPARATOR);
         }
     }
-    
+
     /**
      * Print a boolean value.  The string produced by <code>{@link
      * java.lang.String#valueOf(boolean)}</code> is translated into bytes
@@ -191,7 +191,7 @@
             write(b ? "true" : "false");
         }
     }
-    
+
     /**
      * Print a character.  The character is translated into one or more bytes
      * according to the platform's default character encoding, and these bytes
@@ -208,7 +208,7 @@
             write(String.valueOf(c));
         }
     }
-    
+
     /**
      * Print an integer.  The string produced by <code>{@link
      * java.lang.String#valueOf(int)}</code> is translated into bytes according
@@ -226,7 +226,7 @@
             write(String.valueOf(i));
         }
     }
-    
+
     /**
      * Print a long integer.  The string produced by <code>{@link
      * java.lang.String#valueOf(long)}</code> is translated into bytes
@@ -244,7 +244,7 @@
             write(String.valueOf(l));
         }
     }
-    
+
     /**
      * Print a floating-point number.  The string produced by <code>{@link
      * java.lang.String#valueOf(float)}</code> is translated into bytes
@@ -262,7 +262,7 @@
             write(String.valueOf(f));
         }
     }
-    
+
     /**
      * Print a double-precision floating-point number.  The string produced by
      * <code>{@link java.lang.String#valueOf(double)}</code> is translated into
@@ -280,7 +280,7 @@
             write(String.valueOf(d));
         }
     }
-    
+
     /**
      * Print an array of characters.  The characters are converted into bytes
      * according to the platform's default character encoding, and these bytes
@@ -288,7 +288,6 @@
      * <code>{@link #write(int)}</code> method.
      *
      * @param s The array of chars to be printed
-     *
      * @throws NullPointerException If <code>s</code> is <code>null</code>
      * @throws IOException
      */
@@ -299,7 +298,7 @@
             write(s);
         }
     }
-    
+
     /**
      * Print a string.  If the argument is <code>null</code> then the string
      * <code>"null"</code> is printed.  Otherwise, the string's characters are
@@ -318,7 +317,7 @@
             write(s);
         }
     }
-    
+
     /**
      * Print an object.  The string produced by the <code>{@link
      * java.lang.String#valueOf(Object)}</code> method is translated into bytes
@@ -336,7 +335,7 @@
             write(String.valueOf(obj));
         }
     }
-    
+
     /**
      * Terminate the current line by writing the line separator string.  The
      * line separator string is defined by the system property
@@ -348,7 +347,7 @@
     public void println() throws IOException {
         newLine();
     }
-    
+
     /**
      * Print a boolean value and then terminate the line.  This method behaves
      * as though it invokes <code>{@link #print(boolean)}</code> and then
@@ -360,7 +359,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a character and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(char)}</code> and then
@@ -372,7 +371,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print an integer and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(int)}</code> and then
@@ -384,7 +383,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a long integer and then terminate the line.  This method behaves
      * as though it invokes <code>{@link #print(long)}</code> and then
@@ -396,7 +395,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a floating-point number and then terminate the line.  This method
      * behaves as though it invokes <code>{@link #print(float)}</code> and then
@@ -408,7 +407,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a double-precision floating-point number and then terminate the
      * line.  This method behaves as though it invokes <code>{@link
@@ -416,11 +415,11 @@
      *
      * @throws IOException
      */
-    public void println(double x) throws IOException{
+    public void println(double x) throws IOException {
         print(x);
         println();
     }
-    
+
     /**
      * Print an array of characters and then terminate the line.  This method
      * behaves as though it invokes <code>{@link #print(char[])}</code> and
@@ -432,7 +431,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a String and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(String)}</code> and then
@@ -444,7 +443,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print an Object and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(Object)}</code> and then
@@ -456,11 +455,11 @@
         print(x);
         println();
     }
-    
+
     /**
      * Clear the contents of the buffer. If the buffer has been already
      * been flushed then the clear operation shall throw an IOException
-     * to signal the fact that some data has already been irrevocably 
+     * to signal the fact that some data has already been irrevocably
      * written to the client response stream.
      *
      * @throws IOException If an I/O error occurs
@@ -476,7 +475,7 @@
             }
         }
     }
-    
+
     /**
      * Clears the current contents of the buffer. Unlike clear(), this
      * mehtod will not throw an IOException if the buffer has already been
@@ -490,7 +489,7 @@
             this.clear();
         }
     }
-    
+
     /**
      * Close the stream, flushing it first.  Once a stream has been closed,
      * further write() or flush() invocations will cause an IOException to be
@@ -505,14 +504,14 @@
             closed = true;
         }
     }
-    
+
     /**
      * @return the number of bytes unused in the buffer
      */
     public int getRemaining() {
-        return (writer == null) ? bufferSize-nextChar : 0;
+        return (writer == null) ? bufferSize - nextChar : 0;
     }
-    
+
     /**
      * Return the value of this BodyJspWriter as a Reader.
      * Note: this is after evaluation!!  There are no scriptlets,
@@ -521,9 +520,9 @@
      * @return the value of this BodyJspWriter as a Reader
      */
     public Reader getReader() {
-        return (writer == null) ? new CharArrayReader (cb, 0, nextChar) : null;
+        return (writer == null) ? new CharArrayReader(cb, 0, nextChar) : null;
     }
-    
+
     /**
      * Return the value of the BodyJspWriter as a String.
      * Note: this is after evaluation!!  There are no scriptlets,
@@ -534,14 +533,14 @@
     public String getString() {
         return (writer == null) ? new String(cb, 0, nextChar) : null;
     }
-    
+
     /**
      * Write the contents of this BodyJspWriter into a Writer.
      * Subclasses are likely to do interesting things with the
      * implementation so some things are extra efficient.
      *
      * @param out The writer into which to place the contents of this body
-     * evaluation
+     *            evaluation
      */
     public void writeOut(Writer out) throws IOException {
         if (writer == null) {
@@ -550,7 +549,7 @@
             // it doesn't allow to flush.
         }
     }
-    
+
     /**
      * Sets the writer to which all output is written.
      */
@@ -576,33 +575,33 @@
             clearBody();
         }
     }
-    
+
     private void ensureOpen() throws IOException {
         if (closed) throw new IOException("Stream closed");
     }
-    
+
     /**
      * Reallocates buffer since the spec requires it to be unbounded.
      */
     private void reAllocBuff(int len) {
-        
+
         if (bufferSize + len <= cb.length) {
             bufferSize = cb.length;
             return;
         }
-        
+
         if (len < cb.length) {
             len = cb.length;
         }
-        
+
         bufferSize = cb.length + len;
         char[] tmp = new char[bufferSize];
-        
+
         System.arraycopy(cb, 0, tmp, 0, cb.length);
         cb = tmp;
         tmp = null;
-        
+
     }
-    
-    
+
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/HttpJspBase.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/HttpJspBase.java
index 49087b2..95444dc 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/HttpJspBase.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/HttpJspBase.java
@@ -33,35 +33,35 @@
  *
  * @author Anil K. Vijendran
  */
-public abstract class HttpJspBase 
-    extends HttpServlet 
-    implements HttpJspPage 
-        
-    
+public abstract class HttpJspBase
+        extends HttpServlet
+        implements HttpJspPage
+
+
 {
-    
+
     static {
-        if( JspFactory.getDefaultFactory() == null ) {
+        if (JspFactory.getDefaultFactory() == null) {
             JspFactoryImpl factory = new JspFactoryImpl();
-            if( System.getSecurityManager() != null ) {
+            if (System.getSecurityManager() != null) {
                 String basePackage = "org.apache.struts2.jasper.";
                 try {
-                    factory.getClass().getClassLoader().loadClass( basePackage +
-                                                                   "runtime.JspFactoryImpl$PrivilegedGetPageContext");
-                    factory.getClass().getClassLoader().loadClass( basePackage +
-                                                                   "runtime.JspFactoryImpl$PrivilegedReleasePageContext");
-                    factory.getClass().getClassLoader().loadClass( basePackage +
-                                                                   "runtime.JspRuntimeLibrary");
-                    factory.getClass().getClassLoader().loadClass( basePackage +
-                                                                   "runtime.JspRuntimeLibrary$PrivilegedIntrospectHelper");
-                    factory.getClass().getClassLoader().loadClass( basePackage +
-                                                                   "runtime.ServletResponseWrapperInclude");
-                    factory.getClass().getClassLoader().loadClass( basePackage +
-                                                                   "servlet.JspServletWrapper");
+                    factory.getClass().getClassLoader().loadClass(basePackage +
+                            "runtime.JspFactoryImpl$PrivilegedGetPageContext");
+                    factory.getClass().getClassLoader().loadClass(basePackage +
+                            "runtime.JspFactoryImpl$PrivilegedReleasePageContext");
+                    factory.getClass().getClassLoader().loadClass(basePackage +
+                            "runtime.JspRuntimeLibrary");
+                    factory.getClass().getClassLoader().loadClass(basePackage +
+                            "runtime.JspRuntimeLibrary$PrivilegedIntrospectHelper");
+                    factory.getClass().getClassLoader().loadClass(basePackage +
+                            "runtime.ServletResponseWrapperInclude");
+                    factory.getClass().getClassLoader().loadClass(basePackage +
+                            "servlet.JspServletWrapper");
                 } catch (ClassNotFoundException ex) {
-                    org.apache.commons.logging.LogFactory.getLog( HttpJspBase.class )
-                        .error("Jasper JspRuntimeContext preload of class failed: " +
-                                       ex.getMessage(), ex);
+                    org.apache.commons.logging.LogFactory.getLog(HttpJspBase.class)
+                            .error("Jasper JspRuntimeContext preload of class failed: " +
+                                    ex.getMessage(), ex);
                 }
             }
             JspFactory.setDefaultFactory(factory);
@@ -71,32 +71,30 @@
     protected HttpJspBase() {
     }
 
-    public final void init(ServletConfig config) 
-	throws ServletException 
-    {
+    public final void init(ServletConfig config)
+            throws ServletException {
         super.init(config);
-	jspInit();
+        jspInit();
         _jspInit();
     }
-    
+
     public String getServletInfo() {
-	return Localizer.getMessage("jsp.engine.info");
+        return Localizer.getMessage("jsp.engine.info");
     }
 
     public final void destroy() {
-	jspDestroy();
-	_jspDestroy();
+        jspDestroy();
+        _jspDestroy();
     }
 
     /**
      * Entry point into service.
      */
-    public final void service(HttpServletRequest request, HttpServletResponse response) 
-	throws ServletException, IOException 
-    {
+    public final void service(HttpServletRequest request, HttpServletResponse response)
+            throws ServletException, IOException {
         _jspService(request, response);
     }
-    
+
     public void jspInit() {
     }
 
@@ -109,7 +107,7 @@
     protected void _jspDestroy() {
     }
 
-    public abstract void _jspService(HttpServletRequest request, 
-				     HttpServletResponse response) 
-	throws ServletException, IOException;
+    public abstract void _jspService(HttpServletRequest request,
+                                     HttpServletResponse response)
+            throws ServletException, IOException;
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspContextWrapper.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspContextWrapper.java
index cb88cd8..49ca0d7 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspContextWrapper.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspContextWrapper.java
@@ -36,7 +36,7 @@
 
 /**
  * Implementation of a JSP Context Wrapper.
- *
+ * <p/>
  * The JSP Context Wrapper is a JspContext created and maintained by a tag
  * handler implementation. It wraps the Invoking JSP Context, that is, the
  * JspContext instance passed to the tag handler by the invoking page via
@@ -46,12 +46,12 @@
  * @author Jan Luehe
  */
 public class JspContextWrapper
-            extends PageContext implements VariableResolver {
+        extends PageContext implements VariableResolver {
 
     // Invoking JSP context
     private PageContext invokingJspCtxt;
 
-    private transient Hashtable	pageAttributes;
+    private transient Hashtable pageAttributes;
 
     // ArrayList of NESTED scripting variables
     private ArrayList nestedVars;
@@ -70,225 +70,222 @@
      * The variable resolver, for evaluating EL expressions.
      */
     private VariableResolverImpl variableResolver
-        = new VariableResolverImpl(this);
+            = new VariableResolverImpl(this);
 
     public JspContextWrapper(JspContext jspContext, ArrayList nestedVars,
-			     ArrayList atBeginVars, ArrayList atEndVars,
-			     Map aliases) {
+                             ArrayList atBeginVars, ArrayList atEndVars,
+                             Map aliases) {
         this.invokingJspCtxt = (PageContext) jspContext;
-	this.nestedVars = nestedVars;
-	this.atBeginVars = atBeginVars;
-	this.atEndVars = atEndVars;
-	this.pageAttributes = new Hashtable(16);
-	this.aliases = aliases;
+        this.nestedVars = nestedVars;
+        this.atBeginVars = atBeginVars;
+        this.atEndVars = atEndVars;
+        this.pageAttributes = new Hashtable(16);
+        this.aliases = aliases;
 
-	if (nestedVars != null) {
-	    this.originalNestedVars = new Hashtable(nestedVars.size());
-	}
-	syncBeginTagFile();
+        if (nestedVars != null) {
+            this.originalNestedVars = new Hashtable(nestedVars.size());
+        }
+        syncBeginTagFile();
     }
 
     public void initialize(Servlet servlet, ServletRequest request,
                            ServletResponse response, String errorPageURL,
                            boolean needsSession, int bufferSize,
                            boolean autoFlush)
-        throws IOException, IllegalStateException, IllegalArgumentException
-    {
+            throws IOException, IllegalStateException, IllegalArgumentException {
     }
-    
+
     public Object getAttribute(String name) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
-	return pageAttributes.get(name);
+        return pageAttributes.get(name);
     }
 
     public Object getAttribute(String name, int scope) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
-	if (scope == PAGE_SCOPE) {
-	    return pageAttributes.get(name);
-	}
+        if (scope == PAGE_SCOPE) {
+            return pageAttributes.get(name);
+        }
 
-	return invokingJspCtxt.getAttribute(name, scope);
+        return invokingJspCtxt.getAttribute(name, scope);
     }
 
     public void setAttribute(String name, Object value) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
-	if (value != null) {
-	    pageAttributes.put(name, value);
-	} else {
-	    removeAttribute(name, PAGE_SCOPE);
-	}
+        if (value != null) {
+            pageAttributes.put(name, value);
+        } else {
+            removeAttribute(name, PAGE_SCOPE);
+        }
     }
 
     public void setAttribute(String name, Object value, int scope) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
-	if (scope == PAGE_SCOPE) {
-	    if (value != null) {
-		pageAttributes.put(name, value);
-	    } else {
-		removeAttribute(name, PAGE_SCOPE);
-	    }
-	} else {
-	    invokingJspCtxt.setAttribute(name, value, scope);
-	}
+        if (scope == PAGE_SCOPE) {
+            if (value != null) {
+                pageAttributes.put(name, value);
+            } else {
+                removeAttribute(name, PAGE_SCOPE);
+            }
+        } else {
+            invokingJspCtxt.setAttribute(name, value, scope);
+        }
     }
 
     public Object findAttribute(String name) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
         Object o = pageAttributes.get(name);
         if (o == null) {
-	    o = invokingJspCtxt.getAttribute(name, REQUEST_SCOPE);
-	    if (o == null) {
-		if (getSession() != null) {
-		    o = invokingJspCtxt.getAttribute(name, SESSION_SCOPE);
-		}
-		if (o == null) {
-		    o = invokingJspCtxt.getAttribute(name, APPLICATION_SCOPE);
-		} 
-	    }
-	}
+            o = invokingJspCtxt.getAttribute(name, REQUEST_SCOPE);
+            if (o == null) {
+                if (getSession() != null) {
+                    o = invokingJspCtxt.getAttribute(name, SESSION_SCOPE);
+                }
+                if (o == null) {
+                    o = invokingJspCtxt.getAttribute(name, APPLICATION_SCOPE);
+                }
+            }
+        }
 
-	return o;
+        return o;
     }
 
     public void removeAttribute(String name) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
-	pageAttributes.remove(name);
-	invokingJspCtxt.removeAttribute(name, REQUEST_SCOPE);
-	if (getSession() != null) {
-	    invokingJspCtxt.removeAttribute(name, SESSION_SCOPE);
-	}
-	invokingJspCtxt.removeAttribute(name, APPLICATION_SCOPE);
+        pageAttributes.remove(name);
+        invokingJspCtxt.removeAttribute(name, REQUEST_SCOPE);
+        if (getSession() != null) {
+            invokingJspCtxt.removeAttribute(name, SESSION_SCOPE);
+        }
+        invokingJspCtxt.removeAttribute(name, APPLICATION_SCOPE);
     }
 
     public void removeAttribute(String name, int scope) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
-	if (scope == PAGE_SCOPE){
-	    pageAttributes.remove(name);
-	} else {
-	    invokingJspCtxt.removeAttribute(name, scope);
-	}
+        if (scope == PAGE_SCOPE) {
+            pageAttributes.remove(name);
+        } else {
+            invokingJspCtxt.removeAttribute(name, scope);
+        }
     }
 
     public int getAttributesScope(String name) {
 
-	if (name == null) {
-	    throw new NullPointerException(
-	            Localizer.getMessage("jsp.error.attribute.null_name"));
-	}
+        if (name == null) {
+            throw new NullPointerException(
+                    Localizer.getMessage("jsp.error.attribute.null_name"));
+        }
 
-	if (pageAttributes.get(name) != null) {
-	    return PAGE_SCOPE;
-	} else {
-	    return invokingJspCtxt.getAttributesScope(name);
-	}
+        if (pageAttributes.get(name) != null) {
+            return PAGE_SCOPE;
+        } else {
+            return invokingJspCtxt.getAttributesScope(name);
+        }
     }
 
     public Enumeration getAttributeNamesInScope(int scope) {
         if (scope == PAGE_SCOPE) {
             return pageAttributes.keys();
-	}
+        }
 
-	return invokingJspCtxt.getAttributeNamesInScope(scope);
+        return invokingJspCtxt.getAttributeNamesInScope(scope);
     }
 
     public void release() {
-	invokingJspCtxt.release();
+        invokingJspCtxt.release();
     }
 
     public JspWriter getOut() {
-	return invokingJspCtxt.getOut();
+        return invokingJspCtxt.getOut();
     }
 
     public HttpSession getSession() {
-	return invokingJspCtxt.getSession();
+        return invokingJspCtxt.getSession();
     }
 
     public Object getPage() {
-	return invokingJspCtxt.getPage();
+        return invokingJspCtxt.getPage();
     }
 
     public ServletRequest getRequest() {
-	return invokingJspCtxt.getRequest();
+        return invokingJspCtxt.getRequest();
     }
 
     public ServletResponse getResponse() {
-	return invokingJspCtxt.getResponse();
+        return invokingJspCtxt.getResponse();
     }
 
     public Exception getException() {
-	return invokingJspCtxt.getException();
+        return invokingJspCtxt.getException();
     }
 
     public ServletConfig getServletConfig() {
-	return invokingJspCtxt.getServletConfig();
+        return invokingJspCtxt.getServletConfig();
     }
 
     public ServletContext getServletContext() {
-	return invokingJspCtxt.getServletContext();
+        return invokingJspCtxt.getServletContext();
     }
 
     public void forward(String relativeUrlPath)
-        throws ServletException, IOException
-    {
-	invokingJspCtxt.forward(relativeUrlPath);
+            throws ServletException, IOException {
+        invokingJspCtxt.forward(relativeUrlPath);
     }
 
     public void include(String relativeUrlPath)
-	throws ServletException, IOException
-    {
-	invokingJspCtxt.include(relativeUrlPath);
+            throws ServletException, IOException {
+        invokingJspCtxt.include(relativeUrlPath);
     }
 
-    public void include(String relativeUrlPath, boolean flush) 
-	    throws ServletException, IOException {
-	include(relativeUrlPath, false); // XXX
+    public void include(String relativeUrlPath, boolean flush)
+            throws ServletException, IOException {
+        include(relativeUrlPath, false); // XXX
     }
 
     public VariableResolver getVariableResolver() {
-	return this;
+        return this;
     }
 
     public BodyContent pushBody() {
-	return invokingJspCtxt.pushBody();
+        return invokingJspCtxt.pushBody();
     }
 
     public JspWriter pushBody(Writer writer) {
-	return invokingJspCtxt.pushBody(writer);
+        return invokingJspCtxt.pushBody(writer);
     }
 
     public JspWriter popBody() {
@@ -296,28 +293,25 @@
     }
 
     public ExpressionEvaluator getExpressionEvaluator() {
-	return invokingJspCtxt.getExpressionEvaluator();
+        return invokingJspCtxt.getExpressionEvaluator();
     }
 
     public void handlePageException(Exception ex)
-        throws IOException, ServletException 
-    {
-	// Should never be called since handleException() called with a
-	// Throwable in the generated servlet.
-	handlePageException((Throwable) ex);
+            throws IOException, ServletException {
+        // Should never be called since handleException() called with a
+        // Throwable in the generated servlet.
+        handlePageException((Throwable) ex);
     }
 
     public void handlePageException(Throwable t)
-        throws IOException, ServletException 
-    {
-	invokingJspCtxt.handlePageException(t);
+            throws IOException, ServletException {
+        invokingJspCtxt.handlePageException(t);
     }
 
     /**
      * VariableResolver interface
      */
-    public Object resolveVariable( String pName ) throws ELException
-    {
+    public Object resolveVariable(String pName) throws ELException {
         return variableResolver.resolveVariable(pName);
     }
 
@@ -325,24 +319,24 @@
      * Synchronize variables at begin of tag file
      */
     public void syncBeginTagFile() {
-	saveNestedVariables();
+        saveNestedVariables();
     }
 
     /**
      * Synchronize variables before fragment invokation
      */
     public void syncBeforeInvoke() {
-	copyTagToPageScope(VariableInfo.NESTED);
-	copyTagToPageScope(VariableInfo.AT_BEGIN);
+        copyTagToPageScope(VariableInfo.NESTED);
+        copyTagToPageScope(VariableInfo.AT_BEGIN);
     }
 
     /**
      * Synchronize variables at end of tag file
      */
     public void syncEndTagFile() {
-	copyTagToPageScope(VariableInfo.AT_BEGIN);
-	copyTagToPageScope(VariableInfo.AT_END);
-	restoreNestedVariables();
+        copyTagToPageScope(VariableInfo.AT_BEGIN);
+        copyTagToPageScope(VariableInfo.AT_END);
+        restoreNestedVariables();
     }
 
     /**
@@ -352,36 +346,36 @@
      * @param scope variable scope (one of NESTED, AT_BEGIN, or AT_END)
      */
     private void copyTagToPageScope(int scope) {
-	Iterator iter = null;
+        Iterator iter = null;
 
-	switch (scope) {
-	case VariableInfo.NESTED:
-	    if (nestedVars != null) {
-		iter = nestedVars.iterator();
-	    }
-	    break;
-	case VariableInfo.AT_BEGIN:
-	    if (atBeginVars != null) {
-		iter = atBeginVars.iterator();
-	    }
-	    break;
-	case VariableInfo.AT_END:
-	    if (atEndVars != null) {
-		iter = atEndVars.iterator();
-	    }
-	    break;
-	}
+        switch (scope) {
+            case VariableInfo.NESTED:
+                if (nestedVars != null) {
+                    iter = nestedVars.iterator();
+                }
+                break;
+            case VariableInfo.AT_BEGIN:
+                if (atBeginVars != null) {
+                    iter = atBeginVars.iterator();
+                }
+                break;
+            case VariableInfo.AT_END:
+                if (atEndVars != null) {
+                    iter = atEndVars.iterator();
+                }
+                break;
+        }
 
-	while ((iter != null) && iter.hasNext()) {
-	    String varName = (String) iter.next();
-	    Object obj = getAttribute(varName);
-	    varName = findAlias(varName);
-	    if (obj != null) {
-		invokingJspCtxt.setAttribute(varName, obj);
-	    } else {
-		invokingJspCtxt.removeAttribute(varName, PAGE_SCOPE);
-	    }
-	}
+        while ((iter != null) && iter.hasNext()) {
+            String varName = (String) iter.next();
+            Object obj = getAttribute(varName);
+            varName = findAlias(varName);
+            if (obj != null) {
+                invokingJspCtxt.setAttribute(varName, obj);
+            } else {
+                invokingJspCtxt.removeAttribute(varName, PAGE_SCOPE);
+            }
+        }
     }
 
     /**
@@ -389,17 +383,17 @@
      * the invoking JSP context, so they can later be restored.
      */
     private void saveNestedVariables() {
-	if (nestedVars != null) {
-	    Iterator iter = nestedVars.iterator();
-	    while (iter.hasNext()) {
-		String varName = (String) iter.next();
-		varName = findAlias(varName);
-		Object obj = invokingJspCtxt.getAttribute(varName);
-		if (obj != null) {
-		    originalNestedVars.put(varName, obj);
-		}
-	    }
-	}
+        if (nestedVars != null) {
+            Iterator iter = nestedVars.iterator();
+            while (iter.hasNext()) {
+                String varName = (String) iter.next();
+                varName = findAlias(varName);
+                Object obj = invokingJspCtxt.getAttribute(varName);
+                if (obj != null) {
+                    originalNestedVars.put(varName, obj);
+                }
+            }
+        }
     }
 
     /**
@@ -407,19 +401,19 @@
      * context.
      */
     private void restoreNestedVariables() {
-	if (nestedVars != null) {
-	    Iterator iter = nestedVars.iterator();
-	    while (iter.hasNext()) {
-		String varName = (String) iter.next();
-		varName = findAlias(varName);
-		Object obj = originalNestedVars.get(varName);
-		if (obj != null) {
-		    invokingJspCtxt.setAttribute(varName, obj);
-		} else {
-		    invokingJspCtxt.removeAttribute(varName, PAGE_SCOPE);
-		}
-	    }
-	}
+        if (nestedVars != null) {
+            Iterator iter = nestedVars.iterator();
+            while (iter.hasNext()) {
+                String varName = (String) iter.next();
+                varName = findAlias(varName);
+                Object obj = originalNestedVars.get(varName);
+                if (obj != null) {
+                    invokingJspCtxt.setAttribute(varName, obj);
+                } else {
+                    invokingJspCtxt.removeAttribute(varName, PAGE_SCOPE);
+                }
+            }
+        }
     }
 
     /**
@@ -428,18 +422,18 @@
      *
      * @param varName The variable name to check
      * @return The variable name for which varName is used as an alias, or
-     * varName if it is not being used as an alias
+     *         varName if it is not being used as an alias
      */
     private String findAlias(String varName) {
 
-	if (aliases == null)
-	    return varName;
+        if (aliases == null)
+            return varName;
 
-	String alias = (String) aliases.get(varName);
-	if (alias == null) {
-	    return varName;
-	}
-	return alias;
+        String alias = (String) aliases.get(varName);
+        if (alias == null) {
+            return varName;
+        }
+        return alias;
     }
 }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFactoryImpl.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFactoryImpl.java
index 6c0dee1..8d68de8 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFactoryImpl.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFactoryImpl.java
@@ -16,8 +16,8 @@
  */
 package org.apache.struts2.jasper.runtime;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.util.SimplePool;
 
 import javax.servlet.Servlet;
@@ -37,72 +37,72 @@
 public class JspFactoryImpl extends JspFactory {
 
     // Logger
-    private Log log = LogFactory.getLog(JspFactoryImpl.class);
+    private Logger log = LoggerFactory.getLogger(JspFactoryImpl.class);
 
     private static final String SPEC_VERSION = "2.0";
-    private static final boolean USE_POOL = 
-        Boolean.valueOf(System.getProperty("org.apache.struts2.jasper.runtime.JspFactoryImpl.USE_POOL", "true")).booleanValue();
+    private static final boolean USE_POOL =
+            Boolean.valueOf(System.getProperty("org.apache.struts2.jasper.runtime.JspFactoryImpl.USE_POOL", "true")).booleanValue();
 
     private SimplePool pool = new SimplePool(100);
-    
+
     public PageContext getPageContext(Servlet servlet,
-				      ServletRequest request,
+                                      ServletRequest request,
                                       ServletResponse response,
-                                      String errorPageURL,                    
+                                      String errorPageURL,
                                       boolean needsSession,
-				      int bufferSize,
+                                      int bufferSize,
                                       boolean autoflush) {
-	if( System.getSecurityManager() != null ) {
-	    PrivilegedGetPageContext dp = new PrivilegedGetPageContext(
-		(JspFactoryImpl)this, servlet, request, response, errorPageURL,
-                needsSession, bufferSize, autoflush);
-	    return (PageContext)AccessController.doPrivileged(dp);
-	} else {
-	    return internalGetPageContext(servlet, request, response,
-					  errorPageURL, needsSession,
-					  bufferSize, autoflush);
-	}
+        if (System.getSecurityManager() != null) {
+            PrivilegedGetPageContext dp = new PrivilegedGetPageContext(
+                    (JspFactoryImpl) this, servlet, request, response, errorPageURL,
+                    needsSession, bufferSize, autoflush);
+            return (PageContext) AccessController.doPrivileged(dp);
+        } else {
+            return internalGetPageContext(servlet, request, response,
+                    errorPageURL, needsSession,
+                    bufferSize, autoflush);
+        }
     }
 
     public void releasePageContext(PageContext pc) {
-	if( pc == null )
-	    return;
-        if( System.getSecurityManager() != null ) {
+        if (pc == null)
+            return;
+        if (System.getSecurityManager() != null) {
             PrivilegedReleasePageContext dp = new PrivilegedReleasePageContext(
-                (JspFactoryImpl)this,pc);
+                    (JspFactoryImpl) this, pc);
             AccessController.doPrivileged(dp);
         } else {
             internalReleasePageContext(pc);
-	}
+        }
     }
 
     public JspEngineInfo getEngineInfo() {
         return new JspEngineInfo() {
-		public String getSpecificationVersion() {
-		    return SPEC_VERSION;
-		}
-	    };
+            public String getSpecificationVersion() {
+                return SPEC_VERSION;
+            }
+        };
     }
 
     private PageContext internalGetPageContext(Servlet servlet,
-					       ServletRequest request,
-					       ServletResponse response, 
-					       String errorPageURL, 
-					       boolean needsSession,
-					       int bufferSize, 
-					       boolean autoflush) {
+                                               ServletRequest request,
+                                               ServletResponse response,
+                                               String errorPageURL,
+                                               boolean needsSession,
+                                               int bufferSize,
+                                               boolean autoflush) {
         try {
-	    PageContext pc;
-	    if( USE_POOL ) {
+            PageContext pc;
+            if (USE_POOL) {
                 pc = (PageContext) pool.get();
-		if( pc == null ) {
-		    pc= new PageContextImpl(this);
-		}
-	    } else {
-		pc = new PageContextImpl(this);
-	    }
-	    pc.initialize(servlet, request, response, errorPageURL, 
-                          needsSession, bufferSize, autoflush);
+                if (pc == null) {
+                    pc = new PageContextImpl(this);
+                }
+            } else {
+                pc = new PageContextImpl(this);
+            }
+            pc.initialize(servlet, request, response, errorPageURL,
+                    needsSession, bufferSize, autoflush);
             return pc;
         } catch (Throwable ex) {
             /* FIXME: need to do something reasonable here!! */
@@ -113,65 +113,65 @@
 
     private void internalReleasePageContext(PageContext pc) {
         pc.release();
-	if (USE_POOL && (pc instanceof PageContextImpl)) {
-	    pool.put( pc );
-	}
+        if (USE_POOL && (pc instanceof PageContextImpl)) {
+            pool.put(pc);
+        }
     }
 
     private class PrivilegedGetPageContext implements PrivilegedAction {
 
-	private JspFactoryImpl factory;
-	private Servlet servlet;
-	private ServletRequest request;
-	private ServletResponse response;
-	private String errorPageURL;
-	private boolean needsSession;
-	private int bufferSize;
-	private boolean autoflush;
+        private JspFactoryImpl factory;
+        private Servlet servlet;
+        private ServletRequest request;
+        private ServletResponse response;
+        private String errorPageURL;
+        private boolean needsSession;
+        private int bufferSize;
+        private boolean autoflush;
 
-	PrivilegedGetPageContext(JspFactoryImpl factory,
-				 Servlet servlet,
-				 ServletRequest request,
-				 ServletResponse response,
-				 String errorPageURL,
-				 boolean needsSession,
-				 int bufferSize,
-				 boolean autoflush) {
-	    this.factory = factory;
-	    this.servlet = servlet;
-	    this.request = request;
-	    this.response = response;
-	    this.errorPageURL = errorPageURL;
-	    this.needsSession = needsSession;
-	    this.bufferSize = bufferSize;
-	    this.autoflush = autoflush;
-	}
- 
-	public Object run() {
-	    return factory.internalGetPageContext(servlet,
-						  request,
-						  response,
-						  errorPageURL,
-						  needsSession,
-						  bufferSize,
-						  autoflush);
-	}
+        PrivilegedGetPageContext(JspFactoryImpl factory,
+                                 Servlet servlet,
+                                 ServletRequest request,
+                                 ServletResponse response,
+                                 String errorPageURL,
+                                 boolean needsSession,
+                                 int bufferSize,
+                                 boolean autoflush) {
+            this.factory = factory;
+            this.servlet = servlet;
+            this.request = request;
+            this.response = response;
+            this.errorPageURL = errorPageURL;
+            this.needsSession = needsSession;
+            this.bufferSize = bufferSize;
+            this.autoflush = autoflush;
+        }
+
+        public Object run() {
+            return factory.internalGetPageContext(servlet,
+                    request,
+                    response,
+                    errorPageURL,
+                    needsSession,
+                    bufferSize,
+                    autoflush);
+        }
     }
 
     private class PrivilegedReleasePageContext implements PrivilegedAction {
 
         private JspFactoryImpl factory;
-	private PageContext pageContext;
+        private PageContext pageContext;
 
         PrivilegedReleasePageContext(JspFactoryImpl factory,
-				     PageContext pageContext) {
+                                     PageContext pageContext) {
             this.factory = factory;
             this.pageContext = pageContext;
         }
 
         public Object run() {
             factory.internalReleasePageContext(pageContext);
-	    return null;
+            return null;
         }
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFragmentHelper.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFragmentHelper.java
index bd7db42..d354be2 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFragmentHelper.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspFragmentHelper.java
@@ -27,39 +27,37 @@
  * This class allows for the emulation of numerous fragments within
  * a single class, which in turn reduces the load on the class loader
  * since there are potentially many JspFragments in a single page.
- * <p>
+ * <p/>
  * The class also provides various utility methods for JspFragment
  * implementations.
  *
  * @author Mark Roth
  */
-public abstract class JspFragmentHelper 
-    extends JspFragment 
-{
-    
+public abstract class JspFragmentHelper
+        extends JspFragment {
+
     protected int discriminator;
     protected JspContext jspContext;
     protected PageContext _jspx_page_context;
     protected JspTag parentTag;
 
-    public JspFragmentHelper( int discriminator, JspContext jspContext, 
-        JspTag parentTag ) 
-    {
+    public JspFragmentHelper(int discriminator, JspContext jspContext,
+                             JspTag parentTag) {
         this.discriminator = discriminator;
         this.jspContext = jspContext;
         this._jspx_page_context = null;
-        if( jspContext instanceof PageContext ) {
-            _jspx_page_context = (PageContext)jspContext;
+        if (jspContext instanceof PageContext) {
+            _jspx_page_context = (PageContext) jspContext;
         }
         this.parentTag = parentTag;
     }
-    
+
     public JspContext getJspContext() {
         return this.jspContext;
     }
-    
+
     public JspTag getParentTag() {
         return this.parentTag;
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspRuntimeLibrary.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspRuntimeLibrary.java
index 3c6a3f7..0815962 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspRuntimeLibrary.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspRuntimeLibrary.java
@@ -41,8 +41,8 @@
 
 /**
  * Bunch of util methods that are used by code generated for useBean,
- * getProperty and setProperty.  
- *
+ * getProperty and setProperty.
+ * <p/>
  * The __begin, __end stuff is there so that the JSP engine can
  * actually parse this file and inline them if people don't want
  * runtime dependencies on this class. However, I'm not sure if that
@@ -52,14 +52,14 @@
  * @author Shawn Bayern
  */
 public class JspRuntimeLibrary {
-    
+
     private static final String SERVLET_EXCEPTION
-        = "javax.servlet.error.exception";
+            = "javax.servlet.error.exception";
     private static final String JSP_EXCEPTION
-        = "javax.servlet.jsp.jspException";
+            = "javax.servlet.jsp.jspException";
 
     protected static class PrivilegedIntrospectHelper
-        implements PrivilegedExceptionAction {
+            implements PrivilegedExceptionAction {
 
         private Object bean;
         private String prop;
@@ -70,8 +70,7 @@
 
         PrivilegedIntrospectHelper(Object bean, String prop,
                                    String value, ServletRequest request,
-                                   String param, boolean ignoreMethodNF)
-        {
+                                   String param, boolean ignoreMethodNF) {
             this.bean = bean;
             this.prop = prop;
             this.value = value;
@@ -79,10 +78,10 @@
             this.param = param;
             this.ignoreMethodNF = ignoreMethodNF;
         }
-         
+
         public Object run() throws JasperException {
             internalIntrospecthelper(
-                bean,prop,value,request,param,ignoreMethodNF);
+                    bean, prop, value, request, param, ignoreMethodNF);
             return null;
         }
     }
@@ -91,7 +90,7 @@
      * Returns the value of the javax.servlet.error.exception request
      * attribute value, if present, otherwise the value of the
      * javax.servlet.jsp.jspException request attribute value.
-     *
+     * <p/>
      * This method is called at the beginning of the generated servlet code
      * for a JSP error page, when the "exception" implicit scripting language
      * variable is initialized.
@@ -134,7 +133,7 @@
             return (char) 0;
         } else {
             // this trick avoids escaping issues
-            return (char)(int) s.charAt(0);
+            return (char) (int) s.charAt(0);
         }
     }
 
@@ -190,7 +189,7 @@
         } else if (target == Character.class) {
             if (isNullOrEmpty)
                 return new Character((char) 0);
-            else 
+            else
                 return new Character(s.charAt(0));
         } else if (target == Double.class) {
             if (isNullOrEmpty)
@@ -222,11 +221,10 @@
         }
     }
 
-   // __begin convertMethod
+    // __begin convertMethod
     public static Object convert(String propertyName, String s, Class t,
-                                 Class propertyEditorClass) 
-       throws JasperException 
-    {
+                                 Class propertyEditorClass)
+            throws JasperException {
         try {
             if (s == null) {
                 if (t.equals(Boolean.class) || t.equals(Boolean.TYPE))
@@ -236,36 +234,36 @@
             }
             if (propertyEditorClass != null) {
                 return getValueFromBeanInfoPropertyEditor(
-                                    t, propertyName, s, propertyEditorClass);
-            } else if ( t.equals(Boolean.class) || t.equals(Boolean.TYPE) ) {
+                        t, propertyName, s, propertyEditorClass);
+            } else if (t.equals(Boolean.class) || t.equals(Boolean.TYPE)) {
                 if (s.equalsIgnoreCase("on") || s.equalsIgnoreCase("true"))
                     s = "true";
                 else
                     s = "false";
                 return new Boolean(s);
-            } else if ( t.equals(Byte.class) || t.equals(Byte.TYPE) ) {
+            } else if (t.equals(Byte.class) || t.equals(Byte.TYPE)) {
                 return new Byte(s);
             } else if (t.equals(Character.class) || t.equals(Character.TYPE)) {
                 return s.length() > 0 ? new Character(s.charAt(0)) : null;
-            } else if ( t.equals(Short.class) || t.equals(Short.TYPE) ) {
+            } else if (t.equals(Short.class) || t.equals(Short.TYPE)) {
                 return new Short(s);
-            } else if ( t.equals(Integer.class) || t.equals(Integer.TYPE) ) {
+            } else if (t.equals(Integer.class) || t.equals(Integer.TYPE)) {
                 return new Integer(s);
-            } else if ( t.equals(Float.class) || t.equals(Float.TYPE) ) {
+            } else if (t.equals(Float.class) || t.equals(Float.TYPE)) {
                 return new Float(s);
-            } else if ( t.equals(Long.class) || t.equals(Long.TYPE) ) {
+            } else if (t.equals(Long.class) || t.equals(Long.TYPE)) {
                 return new Long(s);
-            } else if ( t.equals(Double.class) || t.equals(Double.TYPE) ) {
+            } else if (t.equals(Double.class) || t.equals(Double.TYPE)) {
                 return new Double(s);
-            } else if ( t.equals(String.class) ) {
+            } else if (t.equals(String.class)) {
                 return s;
-            } else if ( t.equals(java.io.File.class) ) {
+            } else if (t.equals(java.io.File.class)) {
                 return new java.io.File(s);
             } else if (t.getName().equals("java.lang.Object")) {
-                return new Object[] {s};
+                return new Object[]{s};
             } else {
                 return getValueFromPropertyEditorManager(
-                                            t, propertyName, s);
+                        t, propertyName, s);
             }
         } catch (Exception ex) {
             throw new JasperException(ex);
@@ -274,84 +272,83 @@
     // __end convertMethod
 
     // __begin introspectMethod
+
     public static void introspect(Object bean, ServletRequest request)
-                                  throws JasperException
-    {
+            throws JasperException {
         Enumeration e = request.getParameterNames();
-        while ( e.hasMoreElements() ) {
-            String name  = (String) e.nextElement();
+        while (e.hasMoreElements()) {
+            String name = (String) e.nextElement();
             String value = request.getParameter(name);
             introspecthelper(bean, name, value, request, name, true);
         }
     }
     // __end introspectMethod
-    
+
     // __begin introspecthelperMethod
+
     public static void introspecthelper(Object bean, String prop,
                                         String value, ServletRequest request,
                                         String param, boolean ignoreMethodNF)
-                                        throws JasperException
-    {
-        if( System.getSecurityManager() != null ) {
+            throws JasperException {
+        if (System.getSecurityManager() != null) {
             try {
                 PrivilegedIntrospectHelper dp =
-                    new PrivilegedIntrospectHelper(
-                        bean,prop,value,request,param,ignoreMethodNF);
+                        new PrivilegedIntrospectHelper(
+                                bean, prop, value, request, param, ignoreMethodNF);
                 AccessController.doPrivileged(dp);
-            } catch( PrivilegedActionException pe) {
+            } catch (PrivilegedActionException pe) {
                 Exception e = pe.getException();
-                throw (JasperException)e;
+                throw (JasperException) e;
             }
         } else {
             internalIntrospecthelper(
-                bean,prop,value,request,param,ignoreMethodNF);
+                    bean, prop, value, request, param, ignoreMethodNF);
         }
     }
 
     private static void internalIntrospecthelper(Object bean, String prop,
-                                        String value, ServletRequest request,
-                                        String param, boolean ignoreMethodNF) 
-                                        throws JasperException
-    {
+                                                 String value, ServletRequest request,
+                                                 String param, boolean ignoreMethodNF)
+            throws JasperException {
         Method method = null;
         Class type = null;
         Class propertyEditorClass = null;
         try {
             java.beans.BeanInfo info
-                = java.beans.Introspector.getBeanInfo(bean.getClass());
-            if ( info != null ) {
+                    = java.beans.Introspector.getBeanInfo(bean.getClass());
+            if (info != null) {
                 java.beans.PropertyDescriptor pd[]
-                    = info.getPropertyDescriptors();
-                for (int i = 0 ; i < pd.length ; i++) {
-                    if ( pd[i].getName().equals(prop) ) {
+                        = info.getPropertyDescriptors();
+                for (int i = 0; i < pd.length; i++) {
+                    if (pd[i].getName().equals(prop)) {
                         method = pd[i].getWriteMethod();
-                        type   = pd[i].getPropertyType();
+                        type = pd[i].getPropertyType();
                         propertyEditorClass = pd[i].getPropertyEditorClass();
                         break;
                     }
                 }
             }
-            if ( method != null ) {
+            if (method != null) {
                 if (type.isArray()) {
                     if (request == null) {
                         throw new JasperException(
-                            Localizer.getMessage("jsp.error.beans.setproperty.noindexset"));
+                                Localizer.getMessage("jsp.error.beans.setproperty.noindexset"));
                     }
                     Class t = type.getComponentType();
                     String[] values = request.getParameterValues(param);
                     //XXX Please check.
-                    if(values == null) return;
-                    if(t.equals(String.class)) {
-                        method.invoke(bean, new Object[] { values });
+                    if (values == null) return;
+                    if (t.equals(String.class)) {
+                        method.invoke(bean, new Object[]{values});
                     } else {
-                        createTypedArray (prop, bean, method, values, t,
-                                          propertyEditorClass); 
+                        createTypedArray(prop, bean, method, values, t,
+                                propertyEditorClass);
                     }
                 } else {
-                    if(value == null || (param != null && value.equals(""))) return;
+                    if (value == null || (param != null && value.equals(""))) return;
                     Object oval = convert(prop, value, type, propertyEditorClass);
-                    if ( oval != null )
-                        method.invoke(bean, new Object[] { oval });
+                    if (oval != null)
+                        method.invoke(bean, new Object[]{oval});
                 }
             }
         } catch (Exception ex) {
@@ -360,24 +357,25 @@
         if (!ignoreMethodNF && (method == null)) {
             if (type == null) {
                 throw new JasperException(
-                    Localizer.getMessage("jsp.error.beans.noproperty",
-                                         prop,
-                                         bean.getClass().getName()));
+                        Localizer.getMessage("jsp.error.beans.noproperty",
+                                prop,
+                                bean.getClass().getName()));
             } else {
                 throw new JasperException(
-                    Localizer.getMessage("jsp.error.beans.nomethod.setproperty",
-                                         prop,
-                                         type.getName(),
-                                         bean.getClass().getName()));
+                        Localizer.getMessage("jsp.error.beans.nomethod.setproperty",
+                                prop,
+                                type.getName(),
+                                bean.getClass().getName()));
             }
         }
     }
     // __end introspecthelperMethod
-    
+
     //-------------------------------------------------------------------
     // functions to convert builtin Java data types to string.
     //-------------------------------------------------------------------
     // __begin toStringMethod
+
     public static String toString(Object o) {
         return String.valueOf(o);
     }
@@ -427,174 +425,176 @@
                                         String[] values,
                                         Class t,
                                         Class propertyEditorClass)
-                throws JasperException {
+            throws JasperException {
 
         try {
             if (propertyEditorClass != null) {
                 Object[] tmpval = new Integer[values.length];
-                for (int i=0; i<values.length; i++) {
+                for (int i = 0; i < values.length; i++) {
                     tmpval[i] = getValueFromBeanInfoPropertyEditor(
                             t, propertyName, values[i], propertyEditorClass);
                 }
-                method.invoke (bean, new Object[] {tmpval});
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Integer.class)) {
-                Integer []tmpval = new Integer[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] =  new Integer (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                Integer[] tmpval = new Integer[values.length];
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = new Integer(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Byte.class)) {
                 Byte[] tmpval = new Byte[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = new Byte (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = new Byte(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Boolean.class)) {
                 Boolean[] tmpval = new Boolean[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = new Boolean (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = new Boolean(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Short.class)) {
                 Short[] tmpval = new Short[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = new Short (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = new Short(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Long.class)) {
                 Long[] tmpval = new Long[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = new Long (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = new Long(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Double.class)) {
                 Double[] tmpval = new Double[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = new Double (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = new Double(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Float.class)) {
                 Float[] tmpval = new Float[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = new Float (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = new Float(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(Character.class)) {
                 Character[] tmpval = new Character[values.length];
-                for (int i = 0 ; i < values.length; i++)
+                for (int i = 0; i < values.length; i++)
                     tmpval[i] = new Character(values[i].charAt(0));
-                method.invoke (bean, new Object[] {tmpval});
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(int.class)) {
-                int []tmpval = new int[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = Integer.parseInt (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                int[] tmpval = new int[values.length];
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = Integer.parseInt(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(byte.class)) {
                 byte[] tmpval = new byte[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = Byte.parseByte (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = Byte.parseByte(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(boolean.class)) {
                 boolean[] tmpval = new boolean[values.length];
-                for (int i = 0 ; i < values.length; i++)
+                for (int i = 0; i < values.length; i++)
                     tmpval[i] = (Boolean.valueOf(values[i])).booleanValue();
-                method.invoke (bean, new Object[] {tmpval});
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(short.class)) {
                 short[] tmpval = new short[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = Short.parseShort (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = Short.parseShort(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(long.class)) {
                 long[] tmpval = new long[values.length];
-                for (int i = 0 ; i < values.length; i++)
-                    tmpval[i] = Long.parseLong (values[i]);
-                method.invoke (bean, new Object[] {tmpval});
+                for (int i = 0; i < values.length; i++)
+                    tmpval[i] = Long.parseLong(values[i]);
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(double.class)) {
                 double[] tmpval = new double[values.length];
-                for (int i = 0 ; i < values.length; i++)
+                for (int i = 0; i < values.length; i++)
                     tmpval[i] = Double.valueOf(values[i]).doubleValue();
-                method.invoke (bean, new Object[] {tmpval});
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(float.class)) {
                 float[] tmpval = new float[values.length];
-                for (int i = 0 ; i < values.length; i++)
+                for (int i = 0; i < values.length; i++)
                     tmpval[i] = Float.valueOf(values[i]).floatValue();
-                method.invoke (bean, new Object[] {tmpval});
+                method.invoke(bean, new Object[]{tmpval});
             } else if (t.equals(char.class)) {
                 char[] tmpval = new char[values.length];
-                for (int i = 0 ; i < values.length; i++)
+                for (int i = 0; i < values.length; i++)
                     tmpval[i] = values[i].charAt(0);
-                method.invoke (bean, new Object[] {tmpval});
+                method.invoke(bean, new Object[]{tmpval});
             } else {
                 Object[] tmpval = new Integer[values.length];
-                for (int i=0; i<values.length; i++) {
-                    tmpval[i] =  
-                        getValueFromPropertyEditorManager(
-                                            t, propertyName, values[i]);
+                for (int i = 0; i < values.length; i++) {
+                    tmpval[i] =
+                            getValueFromPropertyEditorManager(
+                                    t, propertyName, values[i]);
                 }
-                method.invoke (bean, new Object[] {tmpval});
+                method.invoke(bean, new Object[]{tmpval});
             }
         } catch (Exception ex) {
-            throw new JasperException ("error in invoking method", ex);
+            throw new JasperException("error in invoking method", ex);
         }
     }
 
     /**
      * Escape special shell characters.
+     *
      * @param unescString The string to shell-escape
      * @return The escaped shell string.
      */
 
     public static String escapeQueryString(String unescString) {
-    if ( unescString == null )
-        return null;
-   
-    String escString    = "";
-    String shellSpChars = "&;`'\"|*?~<>^()[]{}$\\\n";
-   
-    for(int index=0; index<unescString.length(); index++) {
-        char nextChar = unescString.charAt(index);
+        if (unescString == null)
+            return null;
 
-        if( shellSpChars.indexOf(nextChar) != -1 )
-        escString += "\\";
+        String escString = "";
+        String shellSpChars = "&;`'\"|*?~<>^()[]{}$\\\n";
 
-        escString += nextChar;
-    }
-    return escString;
+        for (int index = 0; index < unescString.length(); index++) {
+            char nextChar = unescString.charAt(index);
+
+            if (shellSpChars.indexOf(nextChar) != -1)
+                escString += "\\";
+
+            escString += nextChar;
+        }
+        return escString;
     }
 
     /**
      * Decode an URL formatted string.
+     *
      * @param encoded The string to decode.
      * @return The decoded string.
      */
 
     public static String decode(String encoded) {
         // speedily leave if we're not needed
-    if (encoded == null) return null;
+        if (encoded == null) return null;
         if (encoded.indexOf('%') == -1 && encoded.indexOf('+') == -1)
-        return encoded;
+            return encoded;
 
-    //allocate the buffer - use byte[] to avoid calls to new.
+        //allocate the buffer - use byte[] to avoid calls to new.
         byte holdbuffer[] = new byte[encoded.length()];
 
         int bufcount = 0;
 
         for (int count = 0; count < encoded.length(); count++) {
-        char cur = encoded.charAt(count);
+            char cur = encoded.charAt(count);
             if (cur == '%') {
-            holdbuffer[bufcount++] =
-          (byte)Integer.parseInt(encoded.substring(count+1,count+3),16);
+                holdbuffer[bufcount++] =
+                        (byte) Integer.parseInt(encoded.substring(count + 1, count + 3), 16);
                 if (count + 2 >= encoded.length())
                     count = encoded.length();
                 else
                     count += 2;
             } else if (cur == '+') {
-        holdbuffer[bufcount++] = (byte) ' ';
-        } else {
-            holdbuffer[bufcount++] = (byte) cur;
+                holdbuffer[bufcount++] = (byte) ' ';
+            } else {
+                holdbuffer[bufcount++] = (byte) cur;
             }
         }
         // REVISIT -- remedy for Deprecated warning.
-    //return new String(holdbuffer,0,0,bufcount);
-    return new String(holdbuffer,0,bufcount);
+        //return new String(holdbuffer,0,0,bufcount);
+        return new String(holdbuffer, 0, bufcount);
     }
 
     // __begin lookupReadMethodMethod
     public static Object handleGetProperty(Object o, String prop)
-    throws JasperException {
+            throws JasperException {
         if (o == null) {
             throw new JasperException(
                     Localizer.getMessage("jsp.error.beans.nullbean"));
@@ -604,48 +604,49 @@
             Method method = getReadMethod(o.getClass(), prop);
             value = method.invoke(o, null);
         } catch (Exception ex) {
-            throw new JasperException (ex);
+            throw new JasperException(ex);
         }
         return value;
     }
     // __end lookupReadMethodMethod
 
     // handles <jsp:setProperty> with EL expression for 'value' attribute
-/** Use proprietaryEvaluate
+
+    /**
+     * Use proprietaryEvaluate
+     * public static void handleSetPropertyExpression(Object bean,
+     * String prop, String expression, PageContext pageContext,
+     * VariableResolver variableResolver, FunctionMapper functionMapper )
+     * throws JasperException
+     * {
+     * try {
+     * Method method = getWriteMethod(bean.getClass(), prop);
+     * method.invoke(bean, new Object[] {
+     * pageContext.getExpressionEvaluator().evaluate(
+     * expression,
+     * method.getParameterTypes()[0],
+     * variableResolver,
+     * functionMapper,
+     * null )
+     * });
+     * } catch (Exception ex) {
+     * throw new JasperException(ex);
+     * }
+     * }
+     */
     public static void handleSetPropertyExpression(Object bean,
-        String prop, String expression, PageContext pageContext,
-        VariableResolver variableResolver, FunctionMapper functionMapper )
-        throws JasperException
-    {
+                                                   String prop, String expression, PageContext pageContext,
+                                                   ProtectedFunctionMapper functionMapper)
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { 
-                pageContext.getExpressionEvaluator().evaluate(
-                    expression,
-                    method.getParameterTypes()[0],
-                    variableResolver,
-                    functionMapper,
-                    null )
-            });
-        } catch (Exception ex) {
-            throw new JasperException(ex);
-        }
-    }
-**/
-    public static void handleSetPropertyExpression(Object bean,
-        String prop, String expression, PageContext pageContext,
-        ProtectedFunctionMapper functionMapper )
-        throws JasperException
-    {
-        try {
-            Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] {
-                PageContextImpl.proprietaryEvaluate(
-                    expression,
-                    method.getParameterTypes()[0],
-                    pageContext,
-                    functionMapper,
-                    false )
+            method.invoke(bean, new Object[]{
+                    PageContextImpl.proprietaryEvaluate(
+                            expression,
+                            method.getParameterTypes()[0],
+                            pageContext,
+                            functionMapper,
+                            false)
             });
         } catch (Exception ex) {
             throw new JasperException(ex);
@@ -654,150 +655,141 @@
 
     public static void handleSetProperty(Object bean, String prop,
                                          Object value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { value });
+            method.invoke(bean, new Object[]{value});
         } catch (Exception ex) {
             throw new JasperException(ex);
         }
     }
-    
+
     public static void handleSetProperty(Object bean, String prop,
                                          int value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Integer(value) });
+            method.invoke(bean, new Object[]{new Integer(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
+        }
     }
-    
+
     public static void handleSetProperty(Object bean, String prop,
                                          short value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Short(value) });
+            method.invoke(bean, new Object[]{new Short(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
+        }
     }
-    
+
     public static void handleSetProperty(Object bean, String prop,
                                          long value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Long(value) });
+            method.invoke(bean, new Object[]{new Long(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
-    } 
-    
+        }
+    }
+
     public static void handleSetProperty(Object bean, String prop,
                                          double value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Double(value) });
+            method.invoke(bean, new Object[]{new Double(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
+        }
     }
-    
+
     public static void handleSetProperty(Object bean, String prop,
                                          float value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Float(value) });
+            method.invoke(bean, new Object[]{new Float(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
+        }
     }
-    
+
     public static void handleSetProperty(Object bean, String prop,
                                          char value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Character(value) });
+            method.invoke(bean, new Object[]{new Character(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
+        }
     }
 
     public static void handleSetProperty(Object bean, String prop,
                                          byte value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Byte(value) });
+            method.invoke(bean, new Object[]{new Byte(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
+        }
     }
-    
+
     public static void handleSetProperty(Object bean, String prop,
                                          boolean value)
-        throws JasperException
-    {
+            throws JasperException {
         try {
             Method method = getWriteMethod(bean.getClass(), prop);
-            method.invoke(bean, new Object[] { new Boolean(value) });
+            method.invoke(bean, new Object[]{new Boolean(value)});
         } catch (Exception ex) {
             throw new JasperException(ex);
-        }        
+        }
     }
-    
+
     public static Method getWriteMethod(Class beanClass, String prop)
-    throws JasperException {
-        Method method = null;        
+            throws JasperException {
+        Method method = null;
         Class type = null;
         try {
             java.beans.BeanInfo info
-                = java.beans.Introspector.getBeanInfo(beanClass);
-            if ( info != null ) {
+                    = java.beans.Introspector.getBeanInfo(beanClass);
+            if (info != null) {
                 java.beans.PropertyDescriptor pd[]
-                    = info.getPropertyDescriptors();
-                for (int i = 0 ; i < pd.length ; i++) {
-                    if ( pd[i].getName().equals(prop) ) {
+                        = info.getPropertyDescriptors();
+                for (int i = 0; i < pd.length; i++) {
+                    if (pd[i].getName().equals(prop)) {
                         method = pd[i].getWriteMethod();
-                        type   = pd[i].getPropertyType();
+                        type = pd[i].getPropertyType();
                         break;
                     }
                 }
-            } else {        
+            } else {
                 // just in case introspection silently fails.
                 throw new JasperException(
-                    Localizer.getMessage("jsp.error.beans.nobeaninfo",
-                                         beanClass.getName()));
+                        Localizer.getMessage("jsp.error.beans.nobeaninfo",
+                                beanClass.getName()));
             }
         } catch (Exception ex) {
-            throw new JasperException (ex);
+            throw new JasperException(ex);
         }
         if (method == null) {
             if (type == null) {
                 throw new JasperException(
                         Localizer.getMessage("jsp.error.beans.noproperty",
-                                             prop,
-                                             beanClass.getName()));
+                                prop,
+                                beanClass.getName()));
             } else {
                 throw new JasperException(
-                    Localizer.getMessage("jsp.error.beans.nomethod.setproperty",
-                                         prop,
-                                         type.getName(),
-                                         beanClass.getName()));
+                        Localizer.getMessage("jsp.error.beans.nomethod.setproperty",
+                                prop,
+                                type.getName(),
+                                beanClass.getName()));
             }
         }
         return method;
@@ -806,39 +798,39 @@
     public static Method getReadMethod(Class beanClass, String prop)
             throws JasperException {
 
-        Method method = null;        
+        Method method = null;
         Class type = null;
         try {
             java.beans.BeanInfo info
-                = java.beans.Introspector.getBeanInfo(beanClass);
-            if ( info != null ) {
+                    = java.beans.Introspector.getBeanInfo(beanClass);
+            if (info != null) {
                 java.beans.PropertyDescriptor pd[]
-                    = info.getPropertyDescriptors();
-                for (int i = 0 ; i < pd.length ; i++) {
-                    if ( pd[i].getName().equals(prop) ) {
+                        = info.getPropertyDescriptors();
+                for (int i = 0; i < pd.length; i++) {
+                    if (pd[i].getName().equals(prop)) {
                         method = pd[i].getReadMethod();
-                        type   = pd[i].getPropertyType();
+                        type = pd[i].getPropertyType();
                         break;
                     }
                 }
-            } else {        
+            } else {
                 // just in case introspection silently fails.
                 throw new JasperException(
-                    Localizer.getMessage("jsp.error.beans.nobeaninfo",
-                                         beanClass.getName()));
+                        Localizer.getMessage("jsp.error.beans.nobeaninfo",
+                                beanClass.getName()));
             }
         } catch (Exception ex) {
-            throw new JasperException (ex);
+            throw new JasperException(ex);
         }
         if (method == null) {
             if (type == null) {
                 throw new JasperException(
-                    Localizer.getMessage("jsp.error.beans.noproperty", prop,
-                                         beanClass.getName()));
+                        Localizer.getMessage("jsp.error.beans.noproperty", prop,
+                                beanClass.getName()));
             } else {
                 throw new JasperException(
-                    Localizer.getMessage("jsp.error.beans.nomethod", prop,
-                                         beanClass.getName()));
+                        Localizer.getMessage("jsp.error.beans.nomethod", prop,
+                                beanClass.getName()));
             }
         }
 
@@ -849,41 +841,39 @@
     // PropertyEditor Support
 
     public static Object getValueFromBeanInfoPropertyEditor(
-                           Class attrClass, String attrName, String attrValue,
-                           Class propertyEditorClass) 
-        throws JasperException 
-    {
+            Class attrClass, String attrName, String attrValue,
+            Class propertyEditorClass)
+            throws JasperException {
         try {
-            PropertyEditor pe = (PropertyEditor)propertyEditorClass.newInstance();
+            PropertyEditor pe = (PropertyEditor) propertyEditorClass.newInstance();
             pe.setAsText(attrValue);
             return pe.getValue();
         } catch (Exception ex) {
             throw new JasperException(
-                Localizer.getMessage("jsp.error.beans.property.conversion",
-                                     attrValue, attrClass.getName(), attrName,
-                                     ex.getMessage()));
+                    Localizer.getMessage("jsp.error.beans.property.conversion",
+                            attrValue, attrClass.getName(), attrName,
+                            ex.getMessage()));
         }
     }
 
     public static Object getValueFromPropertyEditorManager(
-                     Class attrClass, String attrName, String attrValue) 
-        throws JasperException 
-    {
+            Class attrClass, String attrName, String attrValue)
+            throws JasperException {
         try {
-            PropertyEditor propEditor = 
-                PropertyEditorManager.findEditor(attrClass);
+            PropertyEditor propEditor =
+                    PropertyEditorManager.findEditor(attrClass);
             if (propEditor != null) {
                 propEditor.setAsText(attrValue);
                 return propEditor.getValue();
             } else {
                 throw new IllegalArgumentException(
-                    Localizer.getMessage("jsp.error.beans.propertyeditor.notregistered"));
+                        Localizer.getMessage("jsp.error.beans.propertyeditor.notregistered"));
             }
         } catch (IllegalArgumentException ex) {
             throw new JasperException(
-                Localizer.getMessage("jsp.error.beans.property.conversion",
-                                     attrValue, attrClass.getName(), attrName,
-                                     ex.getMessage()));
+                    Localizer.getMessage("jsp.error.beans.property.conversion",
+                            attrValue, attrClass.getName(), attrName,
+                            ex.getMessage()));
         }
     }
 
@@ -897,7 +887,7 @@
      * Convert a possibly relative resource path into a context-relative
      * resource path that starts with a '/'.
      *
-     * @param request The servlet request we are processing
+     * @param request      The servlet request we are processing
      * @param relativePath The possibly relative resource path
      */
     public static String getContextRelativePath(ServletRequest request,
@@ -909,18 +899,17 @@
             return (relativePath);
         HttpServletRequest hrequest = (HttpServletRequest) request;
         String uri = (String)
-            request.getAttribute("javax.servlet.include.servlet_path");
+                request.getAttribute("javax.servlet.include.servlet_path");
         if (uri != null) {
             String pathInfo = (String)
-                request.getAttribute("javax.servlet.include.path_info");
+                    request.getAttribute("javax.servlet.include.path_info");
             if (pathInfo == null) {
-                if (uri.lastIndexOf('/') >= 0) 
+                if (uri.lastIndexOf('/') >= 0)
                     uri = uri.substring(0, uri.lastIndexOf('/'));
             }
-        }
-        else {
+        } else {
             uri = hrequest.getServletPath();
-            if (uri.lastIndexOf('/') >= 0) 
+            if (uri.lastIndexOf('/') >= 0)
                 uri = uri.substring(0, uri.lastIndexOf('/'));
         }
         return uri + '/' + relativePath;
@@ -932,21 +921,20 @@
      * Perform a RequestDispatcher.include() operation, with optional flushing
      * of the response beforehand.
      *
-     * @param request The servlet request we are processing
-     * @param response The servlet response we are processing
+     * @param request      The servlet request we are processing
+     * @param response     The servlet response we are processing
      * @param relativePath The relative path of the resource to be included
-     * @param out The Writer to whom we are currently writing
-     * @param flush Should we flush before the include is processed?
-     *
-     * @exception IOException if thrown by the included servlet
-     * @exception ServletException if thrown by the included servlet
+     * @param out          The Writer to whom we are currently writing
+     * @param flush        Should we flush before the include is processed?
+     * @throws IOException      if thrown by the included servlet
+     * @throws ServletException if thrown by the included servlet
      */
     public static void include(ServletRequest request,
                                ServletResponse response,
                                String relativePath,
                                JspWriter out,
                                boolean flush)
-        throws IOException, ServletException {
+            throws IOException, ServletException {
 
         if (flush && !(out instanceof BodyContent))
             out.flush();
@@ -962,7 +950,7 @@
         RequestDispatcher rd = request.getRequestDispatcher(resourcePath);
 
         rd.include(request,
-                   new ServletResponseWrapperInclude(response, out));
+                new ServletResponseWrapperInclude(response, out));
 
     }
 
@@ -971,8 +959,9 @@
      * This performs the same function as java.next.URLEncode.encode
      * in J2SDK1.4, and should be removed if the only platform supported
      * is 1.4 or higher.
-     * @param s The String to be URL encoded.
-     * @param enc The character encoding 
+     *
+     * @param s   The String to be URL encoded.
+     * @param enc The character encoding
      * @return The URL encoded String
      */
     public static String URLEncode(String s, String enc) {
@@ -994,19 +983,19 @@
             // Use the default encoding?
             writer = new OutputStreamWriter(buf);
         }
-        
+
         for (int i = 0; i < s.length(); i++) {
             int c = s.charAt(i);
             if (c == ' ') {
                 out.append('+');
             } else if (isSafeChar(c)) {
-                out.append((char)c);
+                out.append((char) c);
             } else {
                 // convert to external encoding before hex conversion
                 try {
                     writer.write(c);
                     writer.flush();
-                } catch(IOException e) {
+                } catch (IOException e) {
                     buf.reset();
                     continue;
                 }
@@ -1014,7 +1003,7 @@
                 for (int j = 0; j < ba.length; j++) {
                     out.append('%');
                     // Converting each byte in the buffer
-                    out.append(Character.forDigit((ba[j]>>4) & 0xf, 16));
+                    out.append(Character.forDigit((ba[j] >> 4) & 0xf, 16));
                     out.append(Character.forDigit(ba[j] & 0xf, 16));
                 }
                 buf.reset();
@@ -1034,7 +1023,7 @@
             return true;
         }
         if (c == '-' || c == '_' || c == '.' || c == '!' ||
-            c == '~' || c == '*' || c == '\'' || c == '(' || c == ')') {
+                c == '~' || c == '*' || c == '\'' || c == '(' || c == ')') {
             return true;
         }
         return false;
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspSourceDependent.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspSourceDependent.java
index 221d388..f4195bf 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspSourceDependent.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspSourceDependent.java
@@ -28,10 +28,10 @@
 
 public interface JspSourceDependent {
 
-   /**
-    * Returns a list of files names that the current page has a source
-    * dependency on.
-    */
+    /**
+     * Returns a list of files names that the current page has a source
+     * dependency on.
+     */
     // FIXME: Type used is Object due to very weird behavior 
     // with Eclipse JDT 3.1 in Java 5 mode
     public Object getDependants();
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspWriterImpl.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspWriterImpl.java
index 562adfb..a876564 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspWriterImpl.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/JspWriterImpl.java
@@ -31,50 +31,49 @@
 /**
  * Write text to a character-output stream, buffering characters so as
  * to provide for the efficient writing of single characters, arrays,
- * and strings. 
- *
- * Provide support for discarding for the output that has been 
- * buffered. 
- * 
+ * and strings.
+ * <p/>
+ * Provide support for discarding for the output that has been
+ * buffered.
+ * <p/>
  * This needs revisiting when the buffering problems in the JSP spec
- * are fixed -akv 
+ * are fixed -akv
  *
  * @author Anil K. Vijendran
  */
 public class JspWriterImpl extends JspWriter {
-    
+
     private Writer out;
-    private ServletResponse response;    
+    private ServletResponse response;
     private char cb[];
     private int nextChar;
     private boolean flushed = false;
     private boolean closed = false;
-    
+
     public JspWriterImpl() {
-        super( Constants.DEFAULT_BUFFER_SIZE, true );
+        super(Constants.DEFAULT_BUFFER_SIZE, true);
     }
-    
+
     /**
      * Create a buffered character-output stream that uses a default-sized
      * output buffer.
      *
-     * @param  response  A Servlet Response
+     * @param response A Servlet Response
      */
     public JspWriterImpl(ServletResponse response) {
         this(response, Constants.DEFAULT_BUFFER_SIZE, true);
     }
-    
+
     /**
      * Create a new buffered character-output stream that uses an output
      * buffer of the given size.
      *
-     * @param  response A Servlet Response
-     * @param  sz   	Output-buffer size, a positive integer
-     *
-     * @exception  IllegalArgumentException  If sz is <= 0
+     * @param response A Servlet Response
+     * @param sz       Output-buffer size, a positive integer
+     * @throws IllegalArgumentException If sz is <= 0
      */
-    public JspWriterImpl(ServletResponse response, int sz, 
-            boolean autoFlush) {
+    public JspWriterImpl(ServletResponse response, int sz,
+                         boolean autoFlush) {
         super(sz, autoFlush);
         if (sz < 0)
             throw new IllegalArgumentException("Buffer size <= 0");
@@ -82,17 +81,18 @@
         cb = sz == 0 ? null : new char[sz];
         nextChar = 0;
     }
-    
-    void init( ServletResponse response, int sz, boolean autoFlush ) {
-        this.response= response;
-        if( sz > 0 && ( cb == null || sz > cb.length ) )
-            cb=new char[sz];
+
+    void init(ServletResponse response, int sz, boolean autoFlush) {
+        this.response = response;
+        if (sz > 0 && (cb == null || sz > cb.length))
+            cb = new char[sz];
         nextChar = 0;
-        this.autoFlush=autoFlush;
-        this.bufferSize=sz;
+        this.autoFlush = autoFlush;
+        this.bufferSize = sz;
     }
-    
-    /** Package-level access
+
+    /**
+     * Package-level access
      */
     void recycle() {
         flushed = false;
@@ -101,7 +101,7 @@
         nextChar = 0;
         response = null;
     }
-    
+
     /**
      * Flush the output buffer to the underlying character stream, without
      * flushing the stream itself.  This method is non-private only so that it
@@ -118,25 +118,25 @@
         out.write(cb, 0, nextChar);
         nextChar = 0;
     }
-    
+
     private void initOut() throws IOException {
         if (out == null) {
             out = response.getWriter();
         }
     }
-    
-    private String getLocalizeMessage(final String message){
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            return (String)AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
-                    return Localizer.getMessage(message); 
+
+    private String getLocalizeMessage(final String message) {
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            return (String) AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
+                    return Localizer.getMessage(message);
                 }
             });
         } else {
             return Localizer.getMessage(message);
         }
     }
-    
+
     /**
      * Discard the output buffer.
      */
@@ -151,7 +151,7 @@
         ensureOpen();
         nextChar = 0;
     }
-    
+
     public void clearBuffer() throws IOException {
         if (bufferSize == 0)
             throw new IllegalStateException(
@@ -159,25 +159,23 @@
         ensureOpen();
         nextChar = 0;
     }
-    
+
     private final void bufferOverflow() throws IOException {
         throw new IOException(getLocalizeMessage("jsp.error.overflow"));
     }
-    
+
     /**
      * Flush the stream.
-     *
      */
-    public void flush()  throws IOException {
+    public void flush() throws IOException {
         flushBuffer();
         if (out != null) {
             out.flush();
         }
     }
-    
+
     /**
      * Close the stream.
-     *
      */
     public void close() throws IOException {
         if (response == null || closed)
@@ -189,21 +187,23 @@
         out = null;
         closed = true;
     }
-    
+
     /**
      * @return the number of bytes unused in the buffer
      */
     public int getRemaining() {
         return bufferSize - nextChar;
     }
-    
-    /** check to make sure that the stream has not been closed */
+
+    /**
+     * check to make sure that the stream has not been closed
+     */
     private void ensureOpen() throws IOException {
         if (response == null || closed)
             throw new IOException("Stream closed");
     }
-    
-    
+
+
     /**
      * Write a single character.
      */
@@ -212,8 +212,7 @@
         if (bufferSize == 0) {
             initOut();
             out.write(c);
-        }
-        else {
+        } else {
             if (nextChar >= bufferSize)
                 if (autoFlush)
                     flushBuffer();
@@ -222,7 +221,7 @@
             cb[nextChar++] = (char) c;
         }
     }
-    
+
     /**
      * Our own little min method, to avoid loading java.lang.Math if we've run
      * out of file descriptors and we're trying to print a stack trace.
@@ -231,10 +230,10 @@
         if (a < b) return a;
         return b;
     }
-    
+
     /**
      * Write a portion of an array of characters.
-     *
+     * <p/>
      * <p> Ordinarily this method stores characters from the given array into
      * this stream's buffer, flushing the buffer to the underlying stream as
      * needed.  If the requested length is at least as large as the buffer,
@@ -242,28 +241,27 @@
      * directly to the underlying stream.  Thus redundant
      * <code>DiscardableBufferedWriter</code>s will not copy data unnecessarily.
      *
-     * @param  cbuf  A character array
-     * @param  off   Offset from which to start reading characters
-     * @param  len   Number of characters to write
+     * @param cbuf A character array
+     * @param off  Offset from which to start reading characters
+     * @param len  Number of characters to write
      */
-    public void write(char cbuf[], int off, int len) 
-    throws IOException 
-    {
+    public void write(char cbuf[], int off, int len)
+            throws IOException {
         ensureOpen();
-        
+
         if (bufferSize == 0) {
             initOut();
             out.write(cbuf, off, len);
             return;
         }
-        
+
         if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                 ((off + len) > cbuf.length) || ((off + len) < 0)) {
             throw new IndexOutOfBoundsException();
         } else if (len == 0) {
             return;
-        } 
-        
+        }
+
         if (len >= bufferSize) {
             /* If the request length exceeds the size of the output buffer,
              flush the buffer and then write the data directly.  In this
@@ -276,22 +274,22 @@
             out.write(cbuf, off, len);
             return;
         }
-        
+
         int b = off, t = off + len;
         while (b < t) {
             int d = min(bufferSize - nextChar, t - b);
             System.arraycopy(cbuf, b, cb, nextChar, d);
             b += d;
             nextChar += d;
-            if (nextChar >= bufferSize) 
+            if (nextChar >= bufferSize)
                 if (autoFlush)
                     flushBuffer();
                 else
                     bufferOverflow();
         }
-        
+
     }
-    
+
     /**
      * Write an array of characters.  This method cannot be inherited from the
      * Writer class because it must suppress I/O exceptions.
@@ -299,13 +297,13 @@
     public void write(char buf[]) throws IOException {
         write(buf, 0, buf.length);
     }
-    
+
     /**
      * Write a portion of a String.
      *
-     * @param  s     String to be written
-     * @param  off   Offset from which to start reading characters
-     * @param  len   Number of characters to be written
+     * @param s   String to be written
+     * @param off Offset from which to start reading characters
+     * @param len Number of characters to be written
      */
     public void write(String s, int off, int len) throws IOException {
         ensureOpen();
@@ -320,14 +318,14 @@
             s.getChars(b, b + d, cb, nextChar);
             b += d;
             nextChar += d;
-            if (nextChar >= bufferSize) 
+            if (nextChar >= bufferSize)
                 if (autoFlush)
                     flushBuffer();
                 else
                     bufferOverflow();
         }
     }
-    
+
     /**
      * Write a string.  This method cannot be inherited from the Writer class
      * because it must suppress I/O exceptions.
@@ -335,31 +333,31 @@
     public void write(String s) throws IOException {
         // Simple fix for Bugzilla 35410
         // Calling the other write function so as to init the buffer anyways
-        if(s == null) {
+        if (s == null) {
             write(s, 0, 0);
         } else {
             write(s, 0, s.length());
         }
     }
-    
-    
+
+
     static String lineSeparator = System.getProperty("line.separator");
-    
+
     /**
      * Write a line separator.  The line separator string is defined by the
      * system property <tt>line.separator</tt>, and is not necessarily a single
      * newline ('\n') character.
      *
-     * @exception  IOException  If an I/O error occurs
+     * @throws IOException If an I/O error occurs
      */
-    
+
     public void newLine() throws IOException {
         write(lineSeparator);
     }
-    
-    
+
+
     /* Methods that do not terminate lines */
-    
+
     /**
      * Print a boolean value.  The string produced by <code>{@link
      * java.lang.String#valueOf(boolean)}</code> is translated into bytes
@@ -367,24 +365,24 @@
      * are written in exactly the manner of the <code>{@link
      * #write(int)}</code> method.
      *
-     * @param      b   The <code>boolean</code> to be printed
+     * @param b The <code>boolean</code> to be printed
      */
     public void print(boolean b) throws IOException {
         write(b ? "true" : "false");
     }
-    
+
     /**
      * Print a character.  The character is translated into one or more bytes
      * according to the platform's default character encoding, and these bytes
      * are written in exactly the manner of the <code>{@link
      * #write(int)}</code> method.
      *
-     * @param      c   The <code>char</code> to be printed
+     * @param c The <code>char</code> to be printed
      */
     public void print(char c) throws IOException {
         write(String.valueOf(c));
     }
-    
+
     /**
      * Print an integer.  The string produced by <code>{@link
      * java.lang.String#valueOf(int)}</code> is translated into bytes according
@@ -392,12 +390,12 @@
      * written in exactly the manner of the <code>{@link #write(int)}</code>
      * method.
      *
-     * @param      i   The <code>int</code> to be printed
+     * @param i The <code>int</code> to be printed
      */
     public void print(int i) throws IOException {
         write(String.valueOf(i));
     }
-    
+
     /**
      * Print a long integer.  The string produced by <code>{@link
      * java.lang.String#valueOf(long)}</code> is translated into bytes
@@ -405,12 +403,12 @@
      * are written in exactly the manner of the <code>{@link #write(int)}</code>
      * method.
      *
-     * @param      l   The <code>long</code> to be printed
+     * @param l The <code>long</code> to be printed
      */
     public void print(long l) throws IOException {
         write(String.valueOf(l));
     }
-    
+
     /**
      * Print a floating-point number.  The string produced by <code>{@link
      * java.lang.String#valueOf(float)}</code> is translated into bytes
@@ -418,12 +416,12 @@
      * are written in exactly the manner of the <code>{@link #write(int)}</code>
      * method.
      *
-     * @param      f   The <code>float</code> to be printed
+     * @param f The <code>float</code> to be printed
      */
     public void print(float f) throws IOException {
         write(String.valueOf(f));
     }
-    
+
     /**
      * Print a double-precision floating-point number.  The string produced by
      * <code>{@link java.lang.String#valueOf(double)}</code> is translated into
@@ -431,26 +429,25 @@
      * bytes are written in exactly the manner of the <code>{@link
      * #write(int)}</code> method.
      *
-     * @param      d   The <code>double</code> to be printed
+     * @param d The <code>double</code> to be printed
      */
     public void print(double d) throws IOException {
         write(String.valueOf(d));
     }
-    
+
     /**
      * Print an array of characters.  The characters are converted into bytes
      * according to the platform's default character encoding, and these bytes
      * are written in exactly the manner of the <code>{@link #write(int)}</code>
      * method.
      *
-     * @param      s   The array of chars to be printed
-     *
-     * @throws  NullPointerException  If <code>s</code> is <code>null</code>
+     * @param s The array of chars to be printed
+     * @throws NullPointerException If <code>s</code> is <code>null</code>
      */
     public void print(char s[]) throws IOException {
         write(s);
     }
-    
+
     /**
      * Print a string.  If the argument is <code>null</code> then the string
      * <code>"null"</code> is printed.  Otherwise, the string's characters are
@@ -458,7 +455,7 @@
      * encoding, and these bytes are written in exactly the manner of the
      * <code>{@link #write(int)}</code> method.
      *
-     * @param      s   The <code>String</code> to be printed
+     * @param s The <code>String</code> to be printed
      */
     public void print(String s) throws IOException {
         if (s == null) {
@@ -466,7 +463,7 @@
         }
         write(s);
     }
-    
+
     /**
      * Print an object.  The string produced by the <code>{@link
      * java.lang.String#valueOf(Object)}</code> method is translated into bytes
@@ -474,28 +471,28 @@
      * are written in exactly the manner of the <code>{@link #write(int)}</code>
      * method.
      *
-     * @param      obj   The <code>Object</code> to be printed
+     * @param obj The <code>Object</code> to be printed
      */
     public void print(Object obj) throws IOException {
         write(String.valueOf(obj));
     }
-    
+
     /* Methods that do terminate lines */
-    
+
     /**
      * Terminate the current line by writing the line separator string.  The
      * line separator string is defined by the system property
      * <code>line.separator</code>, and is not necessarily a single newline
      * character (<code>'\n'</code>).
-     *
+     * <p/>
      * Need to change this from PrintWriter because the default
      * println() writes  to the sink directly instead of through the
-     * write method...  
+     * write method...
      */
     public void println() throws IOException {
         newLine();
     }
-    
+
     /**
      * Print a boolean value and then terminate the line.  This method behaves
      * as though it invokes <code>{@link #print(boolean)}</code> and then
@@ -505,7 +502,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a character and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(char)}</code> and then <code>{@link
@@ -515,7 +512,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print an integer and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(int)}</code> and then <code>{@link
@@ -525,7 +522,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a long integer and then terminate the line.  This method behaves
      * as though it invokes <code>{@link #print(long)}</code> and then
@@ -535,7 +532,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a floating-point number and then terminate the line.  This method
      * behaves as though it invokes <code>{@link #print(float)}</code> and then
@@ -545,7 +542,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a double-precision floating-point number and then terminate the
      * line.  This method behaves as though it invokes <code>{@link
@@ -555,7 +552,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print an array of characters and then terminate the line.  This method
      * behaves as though it invokes <code>{@link #print(char[])}</code> and then
@@ -565,7 +562,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print a String and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(String)}</code> and then
@@ -575,7 +572,7 @@
         print(x);
         println();
     }
-    
+
     /**
      * Print an Object and then terminate the line.  This method behaves as
      * though it invokes <code>{@link #print(Object)}</code> and then
@@ -585,5 +582,5 @@
         print(x);
         println();
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PageContextImpl.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PageContextImpl.java
index aa14de4..abaeb35 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PageContextImpl.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PageContextImpl.java
@@ -59,7 +59,7 @@
 
     // The expression evaluator, for evaluating EL expressions.
     private static ExpressionEvaluatorImpl elExprEval
-        = new ExpressionEvaluatorImpl(false);
+            = new ExpressionEvaluatorImpl(false);
 
     // The variable resolver, for evaluating EL expressions.
     private VariableResolverImpl variableResolver;
@@ -74,7 +74,7 @@
     private String errorPageURL;
 
     // page-scope attributes
-    private transient Hashtable        attributes;
+    private transient Hashtable attributes;
 
     // per-request state
     private transient ServletRequest request;
@@ -105,7 +105,7 @@
                            boolean autoFlush) throws IOException {
 
         _initialize(servlet, request, response, errorPageURL, needsSession,
-                    bufferSize, autoFlush);
+                bufferSize, autoFlush);
     }
 
     private void _initialize(Servlet servlet,
@@ -127,10 +127,10 @@
 
         // Setup session (if required)
         if (request instanceof HttpServletRequest && needsSession)
-            this.session = ((HttpServletRequest)request).getSession();
+            this.session = ((HttpServletRequest) request).getSession();
         if (needsSession && session == null)
             throw new IllegalStateException
-                ("Page needs a session and none is available");
+                    ("Page needs a session and none is available");
 
         // initialize the initial out ...
         depth = -1;
@@ -155,14 +155,14 @@
         setAttribute(APPLICATION, context);
 
         isIncluded = request.getAttribute(
-            "javax.servlet.include.servlet_path") != null;
+                "javax.servlet.include.servlet_path") != null;
     }
 
     public void release() {
         out = baseOut;
         try {
             if (isIncluded) {
-                ((JspWriterImpl)out).flushBuffer();
+                ((JspWriterImpl) out).flushBuffer();
                 // push it into the including jspWriter
             } else {
                 // Old code:
@@ -170,11 +170,11 @@
                 // Do not flush the buffer even if we're not included (i.e.
                 // we are the main page. The servlet will flush it and close
                 // the stream.
-                ((JspWriterImpl)out).flushBuffer();
+                ((JspWriterImpl) out).flushBuffer();
             }
         } catch (IOException ex) {
             context.log(
-                "PageContextImpl.release(): Internal error flushing buffer");
+                    "PageContextImpl.release(): Internal error flushing buffer");
         }
 
         servlet = null;
@@ -197,9 +197,9 @@
                     Localizer.getMessage("jsp.error.attribute.null_name"));
         }
 
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            return AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            return AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     return doGetAttribute(name);
                 }
             });
@@ -209,7 +209,7 @@
 
     }
 
-    private Object doGetAttribute(String name){
+    private Object doGetAttribute(String name) {
         return attributes.get(name);
     }
 
@@ -220,9 +220,9 @@
                     Localizer.getMessage("jsp.error.attribute.null_name"));
         }
 
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            return AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            return AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     return doGetAttribute(name, scope);
                 }
             });
@@ -232,26 +232,26 @@
 
     }
 
-    private Object doGetAttribute(String name, int scope){
+    private Object doGetAttribute(String name, int scope) {
         switch (scope) {
             case PAGE_SCOPE:
-            return attributes.get(name);
+                return attributes.get(name);
 
             case REQUEST_SCOPE:
-            return request.getAttribute(name);
+                return request.getAttribute(name);
 
             case SESSION_SCOPE:
-            if (session == null) {
-                throw new IllegalStateException(
-                        Localizer.getMessage("jsp.error.page.noSession"));
-            }
-            return session.getAttribute(name);
+                if (session == null) {
+                    throw new IllegalStateException(
+                            Localizer.getMessage("jsp.error.page.noSession"));
+                }
+                return session.getAttribute(name);
 
             case APPLICATION_SCOPE:
-            return context.getAttribute(name);
+                return context.getAttribute(name);
 
             default:
-            throw new IllegalArgumentException("Invalid scope");
+                throw new IllegalArgumentException("Invalid scope");
         }
     }
 
@@ -262,9 +262,9 @@
                     Localizer.getMessage("jsp.error.attribute.null_name"));
         }
 
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     doSetAttribute(name, attribute);
                     return null;
                 }
@@ -274,7 +274,7 @@
         }
     }
 
-    private void doSetAttribute(String name, Object attribute){
+    private void doSetAttribute(String name, Object attribute) {
         if (attribute != null) {
             attributes.put(name, attribute);
         } else {
@@ -289,9 +289,9 @@
                     Localizer.getMessage("jsp.error.attribute.null_name"));
         }
 
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     doSetAttribute(name, o, scope);
                     return null;
                 }
@@ -302,31 +302,31 @@
 
     }
 
-    private void doSetAttribute(String name, Object o, int scope ){
+    private void doSetAttribute(String name, Object o, int scope) {
         if (o != null) {
             switch (scope) {
-            case PAGE_SCOPE:
-            attributes.put(name, o);
-            break;
+                case PAGE_SCOPE:
+                    attributes.put(name, o);
+                    break;
 
-            case REQUEST_SCOPE:
-            request.setAttribute(name, o);
-            break;
+                case REQUEST_SCOPE:
+                    request.setAttribute(name, o);
+                    break;
 
-            case SESSION_SCOPE:
-            if (session == null) {
-                throw new IllegalStateException(
-                        Localizer.getMessage("jsp.error.page.noSession"));
-            }
-            session.setAttribute(name, o);
-            break;
+                case SESSION_SCOPE:
+                    if (session == null) {
+                        throw new IllegalStateException(
+                                Localizer.getMessage("jsp.error.page.noSession"));
+                    }
+                    session.setAttribute(name, o);
+                    break;
 
-            case APPLICATION_SCOPE:
-            context.setAttribute(name, o);
-            break;
+                case APPLICATION_SCOPE:
+                    context.setAttribute(name, o);
+                    break;
 
-            default:
-            throw new IllegalArgumentException("Invalid scope");
+                default:
+                    throw new IllegalArgumentException("Invalid scope");
             }
         } else {
             removeAttribute(name, scope);
@@ -339,9 +339,9 @@
             throw new NullPointerException(
                     Localizer.getMessage("jsp.error.attribute.null_name"));
         }
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     doRemoveAttribute(name, scope);
                     return null;
                 }
@@ -351,30 +351,30 @@
         }
     }
 
-    private void doRemoveAttribute(String name, int scope){
+    private void doRemoveAttribute(String name, int scope) {
         switch (scope) {
-        case PAGE_SCOPE:
-            attributes.remove(name);
-            break;
+            case PAGE_SCOPE:
+                attributes.remove(name);
+                break;
 
-        case REQUEST_SCOPE:
-            request.removeAttribute(name);
-            break;
+            case REQUEST_SCOPE:
+                request.removeAttribute(name);
+                break;
 
-        case SESSION_SCOPE:
-            if (session == null) {
-            throw new IllegalStateException(
-                        Localizer.getMessage("jsp.error.page.noSession"));
-            }
-            session.removeAttribute(name);
-            break;
+            case SESSION_SCOPE:
+                if (session == null) {
+                    throw new IllegalStateException(
+                            Localizer.getMessage("jsp.error.page.noSession"));
+                }
+                session.removeAttribute(name);
+                break;
 
-        case APPLICATION_SCOPE:
-            context.removeAttribute(name);
-            break;
-            
-        default:
-            throw new IllegalArgumentException("Invalid scope");
+            case APPLICATION_SCOPE:
+                context.removeAttribute(name);
+                break;
+
+            default:
+                throw new IllegalArgumentException("Invalid scope");
         }
     }
 
@@ -385,9 +385,9 @@
                     Localizer.getMessage("jsp.error.attribute.null_name"));
         }
 
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            return ((Integer)AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            return ((Integer) AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     return new Integer(doGetAttributeScope(name));
                 }
             })).intValue();
@@ -396,7 +396,7 @@
         }
     }
 
-    private int doGetAttributeScope(String name){
+    private int doGetAttributeScope(String name) {
         if (attributes.get(name) != null)
             return PAGE_SCOPE;
 
@@ -407,7 +407,7 @@
             try {
                 if (session.getAttribute(name) != null)
                     return SESSION_SCOPE;
-            } catch(IllegalStateException ise) {
+            } catch (IllegalStateException ise) {
                 // Session has been invalidated.
                 // Ignore and fall through to application scope.
             }
@@ -420,9 +420,9 @@
     }
 
     public Object findAttribute(final String name) {
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            return AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            return AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     if (name == null) {
                         throw new NullPointerException(
                                 Localizer.getMessage("jsp.error.attribute.null_name"));
@@ -441,7 +441,7 @@
         }
     }
 
-    private Object doFindAttribute(String name){
+    private Object doFindAttribute(String name) {
 
         Object o = attributes.get(name);
         if (o != null)
@@ -454,7 +454,7 @@
         if (session != null) {
             try {
                 o = session.getAttribute(name);
-            } catch(IllegalStateException ise) {
+            } catch (IllegalStateException ise) {
                 // Session has been invalidated.
                 // Ignore and fall through to application scope.
             }
@@ -467,38 +467,38 @@
 
 
     public Enumeration getAttributeNamesInScope(final int scope) {
-        if (SecurityUtil.isPackageProtectionEnabled()){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
             return (Enumeration)
-                    AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
-                    return doGetAttributeNamesInScope(scope);
-                }
-            });
+                    AccessController.doPrivileged(new PrivilegedAction() {
+                        public Object run() {
+                            return doGetAttributeNamesInScope(scope);
+                        }
+                    });
         } else {
             return doGetAttributeNamesInScope(scope);
         }
     }
 
-    private Enumeration doGetAttributeNamesInScope(int scope){
+    private Enumeration doGetAttributeNamesInScope(int scope) {
         switch (scope) {
-        case PAGE_SCOPE:
-            return attributes.keys();
-            
-        case REQUEST_SCOPE:
-            return request.getAttributeNames();
+            case PAGE_SCOPE:
+                return attributes.keys();
 
-        case SESSION_SCOPE:
-            if (session == null) {
-            throw new IllegalStateException(
-                        Localizer.getMessage("jsp.error.page.noSession"));
-            }
-            return session.getAttributeNames();
+            case REQUEST_SCOPE:
+                return request.getAttributeNames();
 
-        case APPLICATION_SCOPE:
-            return context.getAttributeNames();
+            case SESSION_SCOPE:
+                if (session == null) {
+                    throw new IllegalStateException(
+                            Localizer.getMessage("jsp.error.page.noSession"));
+                }
+                return session.getAttributeNames();
 
-        default:
-            throw new IllegalArgumentException("Invalid scope");
+            case APPLICATION_SCOPE:
+                return context.getAttributeNames();
+
+            default:
+                throw new IllegalArgumentException("Invalid scope");
         }
     }
 
@@ -509,9 +509,9 @@
                     Localizer.getMessage("jsp.error.attribute.null_name"));
         }
 
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            AccessController.doPrivileged(new PrivilegedAction(){
-                public Object run(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
                     doRemoveAttribute(name);
                     return null;
                 }
@@ -519,16 +519,16 @@
         } else {
             doRemoveAttribute(name);
         }
-        }
+    }
 
 
-    private void doRemoveAttribute(String name){
+    private void doRemoveAttribute(String name) {
         removeAttribute(name, PAGE_SCOPE);
         removeAttribute(name, REQUEST_SCOPE);
-        if( session != null ) {
+        if (session != null) {
             try {
                 removeAttribute(name, SESSION_SCOPE);
-            } catch(IllegalStateException ise) {
+            } catch (IllegalStateException ise) {
                 // Session has been invalidated.
                 // Ignore and fall throw to application scope.
             }
@@ -540,14 +540,29 @@
         return out;
     }
 
-    public HttpSession getSession() { return session; }
-    public Servlet getServlet() { return servlet; }
-    public ServletConfig getServletConfig() { return config; }
+    public HttpSession getSession() {
+        return session;
+    }
+
+    public Servlet getServlet() {
+        return servlet;
+    }
+
+    public ServletConfig getServletConfig() {
+        return config;
+    }
+
     public ServletContext getServletContext() {
         return config.getServletContext();
     }
-    public ServletRequest getRequest() { return request; }
-    public ServletResponse getResponse() { return response; }
+
+    public ServletRequest getRequest() {
+        return request;
+    }
+
+    public ServletResponse getResponse() {
+        return response;
+    }
 
 
     /**
@@ -563,7 +578,7 @@
         Throwable t = JspRuntimeLibrary.getThrowable(request);
 
         // Only wrap if needed
-        if((t != null) && (! (t instanceof Exception))) {
+        if ((t != null) && (!(t instanceof Exception))) {
             t = new JspException(t);
         }
 
@@ -571,7 +586,9 @@
     }
 
 
-    public Object getPage() { return servlet; }
+    public Object getPage() {
+        return servlet;
+    }
 
 
     private final String getAbsolutePathRelativeToContext(String relativeUrlPath) {
@@ -579,38 +596,38 @@
 
         if (!path.startsWith("/")) {
             String uri = (String)
-                request.getAttribute("javax.servlet.include.servlet_path");
+                    request.getAttribute("javax.servlet.include.servlet_path");
             if (uri == null)
                 uri = ((HttpServletRequest) request).getServletPath();
             String baseURI = uri.substring(0, uri.lastIndexOf('/'));
-            path = baseURI+'/'+path;
+            path = baseURI + '/' + path;
         }
 
         return path;
     }
 
     public void include(String relativeUrlPath)
-                throws ServletException, IOException {
+            throws ServletException, IOException {
         JspRuntimeLibrary.include(request, response, relativeUrlPath, out,
-                                  true);
+                true);
     }
 
     public void include(final String relativeUrlPath, final boolean flush)
-                throws ServletException, IOException {
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            try{
-                AccessController.doPrivileged(new PrivilegedExceptionAction(){
-                    public Object run() throws Exception{
+            throws ServletException, IOException {
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            try {
+                AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                    public Object run() throws Exception {
                         doInclude(relativeUrlPath, flush);
                         return null;
                     }
                 });
-            } catch (PrivilegedActionException e){
-                Exception ex =  e.getException();
-                if (ex instanceof IOException){
-                    throw (IOException)ex;
+            } catch (PrivilegedActionException e) {
+                Exception ex = e.getException();
+                if (ex instanceof IOException) {
+                    throw (IOException) ex;
                 } else {
-                    throw (ServletException)ex;
+                    throw (ServletException) ex;
                 }
             }
         } else {
@@ -619,9 +636,9 @@
     }
 
     private void doInclude(String relativeUrlPath, boolean flush)
-                throws ServletException, IOException {
+            throws ServletException, IOException {
         JspRuntimeLibrary.include(request, response, relativeUrlPath, out,
-                                  flush);
+                flush);
     }
 
     public VariableResolver getVariableResolver() {
@@ -629,21 +646,21 @@
     }
 
     public void forward(final String relativeUrlPath)
-        throws ServletException, IOException {
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            try{
-                AccessController.doPrivileged(new PrivilegedExceptionAction(){
-                    public Object run() throws Exception{
+            throws ServletException, IOException {
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            try {
+                AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                    public Object run() throws Exception {
                         doForward(relativeUrlPath);
                         return null;
                     }
                 });
-            } catch (PrivilegedActionException e){
-                Exception ex =  e.getException();
-                if (ex instanceof IOException){
-                    throw (IOException)ex;
+            } catch (PrivilegedActionException e) {
+                Exception ex = e.getException();
+                if (ex instanceof IOException) {
+                    throw (IOException) ex;
                 } else {
-                    throw (ServletException)ex;
+                    throw (ServletException) ex;
                 }
             }
         } else {
@@ -652,14 +669,14 @@
     }
 
     private void doForward(String relativeUrlPath)
-        throws ServletException, IOException{
+            throws ServletException, IOException {
 
         // JSP.4.5 If the buffer was flushed, throw IllegalStateException
         try {
             out.clear();
         } catch (IOException ex) {
             IllegalStateException ise =
-                new IllegalStateException(Localizer.getMessage(
+                    new IllegalStateException(Localizer.getMessage(
                             "jsp.error.attempt_to_clear_flushed_buffer"));
             ise.initCause(ex);
             throw ise;
@@ -667,13 +684,13 @@
 
         // Make sure that the response object is not the wrapper for include
         while (response instanceof ServletResponseWrapperInclude) {
-            response = ((ServletResponseWrapperInclude)response).getResponse();
+            response = ((ServletResponseWrapperInclude) response).getResponse();
         }
 
         final String path = getAbsolutePathRelativeToContext(relativeUrlPath);
         String includeUri
-            = (String) request.getAttribute(Constants.INC_SERVLET_PATH);
-            
+                = (String) request.getAttribute(Constants.INC_SERVLET_PATH);
+
         if (includeUri != null)
             request.removeAttribute(Constants.INC_SERVLET_PATH);
         try {
@@ -693,7 +710,7 @@
         depth++;
         if (depth >= outs.length) {
             BodyContentImpl[] newOuts = new BodyContentImpl[depth + 1];
-            for (int i=0; i<outs.length; i++) {
+            for (int i = 0; i < outs.length; i++) {
                 newOuts[i] = outs[i];
             }
             newOuts[depth] = new BodyContentImpl(out);
@@ -735,33 +752,31 @@
     }
 
     public void handlePageException(Exception ex)
-        throws IOException, ServletException
-    {
+            throws IOException, ServletException {
         // Should never be called since handleException() called with a
         // Throwable in the generated servlet.
         handlePageException((Throwable) ex);
     }
 
     public void handlePageException(final Throwable t)
-        throws IOException, ServletException
-    {
+            throws IOException, ServletException {
         if (t == null)
             throw new NullPointerException("null Throwable");
 
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            try{
-                AccessController.doPrivileged(new PrivilegedExceptionAction(){
-                    public Object run() throws Exception{
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            try {
+                AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                    public Object run() throws Exception {
                         doHandlePageException(t);
                         return null;
                     }
                 });
-            } catch (PrivilegedActionException e){
-                Exception ex =  e.getException();
-                if (ex instanceof IOException){
-                    throw (IOException)ex;
+            } catch (PrivilegedActionException e) {
+                Exception ex = e.getException();
+                if (ex instanceof IOException) {
+                    throw (IOException) ex;
                 } else {
-                    throw (ServletException)ex;
+                    throw (ServletException) ex;
                 }
             }
         } else {
@@ -771,7 +786,7 @@
     }
 
     private void doHandlePageException(Throwable t)
-        throws IOException, ServletException {
+            throws IOException, ServletException {
 
         if (errorPageURL != null && !errorPageURL.equals("")) {
 
@@ -786,11 +801,11 @@
              */
             request.setAttribute("javax.servlet.jsp.jspException", t);
             request.setAttribute("javax.servlet.error.status_code",
-                new Integer(HttpServletResponse.SC_INTERNAL_SERVER_ERROR));
+                    new Integer(HttpServletResponse.SC_INTERNAL_SERVER_ERROR));
             request.setAttribute("javax.servlet.error.request_uri",
-            ((HttpServletRequest) request).getRequestURI());
+                    ((HttpServletRequest) request).getRequestURI());
             request.setAttribute("javax.servlet.error.servlet_name",
-                     config.getServletName());
+                    config.getServletName());
             try {
                 forward(errorPageURL);
             } catch (IllegalStateException ise) {
@@ -802,7 +817,7 @@
             Object newException = request.getAttribute("javax.servlet.error.exception");
 
             // t==null means the attribute was not set.
-            if( (newException!= null) && (newException==t) ) {
+            if ((newException != null) && (newException == t)) {
                 request.removeAttribute("javax.servlet.error.exception");
             }
 
@@ -816,9 +831,9 @@
             // Otherwise throw the exception wrapped inside a ServletException.
             // Set the exception as the root cause in the ServletException
             // to get a stack trace for the real problem
-            if (t instanceof IOException) throw (IOException)t;
-            if (t instanceof ServletException) throw (ServletException)t;
-            if (t instanceof RuntimeException) throw (RuntimeException)t;
+            if (t instanceof IOException) throw (IOException) t;
+            if (t instanceof ServletException) throw (ServletException) t;
+            if (t instanceof RuntimeException) throw (RuntimeException) t;
 
             Throwable rootCause = null;
             if (t instanceof JspException) {
@@ -828,10 +843,10 @@
             }
 
             if (rootCause != null) {
-                throw new ServletException(t.getClass().getName() + ": " + 
-                                           t.getMessage(), rootCause);
+                throw new ServletException(t.getClass().getName() + ": " +
+                        t.getMessage(), rootCause);
             }
-                 
+
             throw new ServletException(t);
         }
     }
@@ -855,7 +870,7 @@
         }
 
         StringBuffer sb = new StringBuffer();
-        for(int i = 0; i < s.length(); i++) {
+        for (int i = 0; i < s.length(); i++) {
             char c = s.charAt(i);
             if (c == '<') {
                 sb.append("&lt;");
@@ -880,32 +895,31 @@
      * out of JSTL and into its own project.  For now, this is necessary
      * because the standard machinery is too slow.
      *
-     * @param expression The expression to be evaluated
+     * @param expression   The expression to be evaluated
      * @param expectedType The expected resulting type
-     * @param pageContext The page context
-     * @param functionMap Maps prefix and name to Method
+     * @param pageContext  The page context
+     * @param functionMap  Maps prefix and name to Method
      * @return The result of the evaluation
      */
-    public static Object proprietaryEvaluate(final String expression, 
+    public static Object proprietaryEvaluate(final String expression,
                                              final Class expectedType,
                                              final PageContext pageContext,
                                              final ProtectedFunctionMapper functionMap,
                                              final boolean escape)
-        throws ELException
-    {
+            throws ELException {
         Object retValue;
-        if (SecurityUtil.isPackageProtectionEnabled()){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
             try {
                 retValue = AccessController.doPrivileged(
-                        new PrivilegedExceptionAction(){
+                        new PrivilegedExceptionAction() {
 
-                    public Object run() throws Exception{
-                        return elExprEval.evaluate(expression,
-                                                   expectedType,
-                                                   pageContext.getVariableResolver(),
-                                                   functionMap);
-                    }
-                });
+                            public Object run() throws Exception {
+                                return elExprEval.evaluate(expression,
+                                        expectedType,
+                                        pageContext.getVariableResolver(),
+                                        functionMap);
+                            }
+                        });
             } catch (PrivilegedActionException ex) {
                 Exception realEx = ex.getException();
                 if (realEx instanceof ELException) {
@@ -916,9 +930,9 @@
             }
         } else {
             retValue = elExprEval.evaluate(expression,
-                                           expectedType,
-                                           pageContext.getVariableResolver(),
-                                           functionMap);
+                    expectedType,
+                    pageContext.getVariableResolver(),
+                    functionMap);
         }
         if (escape) {
             retValue = XmlEscape(retValue.toString());
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PerThreadTagHandlerPool.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PerThreadTagHandlerPool.java
index 6a697c1..febb353 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PerThreadTagHandlerPool.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/PerThreadTagHandlerPool.java
@@ -79,22 +79,20 @@
      * instantiating one if this tag handler pool is empty.
      *
      * @param handlerClass Tag handler class
-     *
      * @return Reused or newly instantiated tag handler
-     *
      * @throws JspException if a tag handler cannot be instantiated
      */
     public Tag get(Class handlerClass) throws JspException {
-        PerThreadData ptd = (PerThreadData)perThread.get();
-        if(ptd.current >=0 ) {
+        PerThreadData ptd = (PerThreadData) perThread.get();
+        if (ptd.current >= 0) {
             return ptd.handlers[ptd.current--];
         } else {
-	    try {
-		return (Tag) handlerClass.newInstance();
-	    } catch (Exception e) {
-		throw new JspException(e.getMessage(), e);
-	    }
-	}
+            try {
+                return (Tag) handlerClass.newInstance();
+            } catch (Exception e) {
+                throw new JspException(e.getMessage(), e);
+            }
+        }
     }
 
     /**
@@ -105,9 +103,9 @@
      * @param handler Tag handler to add to this tag handler pool
      */
     public void reuse(Tag handler) {
-        PerThreadData ptd=(PerThreadData)perThread.get();
-	if (ptd.current < (ptd.handlers.length - 1)) {
-	    ptd.handlers[++ptd.current] = handler;
+        PerThreadData ptd = (PerThreadData) perThread.get();
+        if (ptd.current < (ptd.handlers.length - 1)) {
+            ptd.handlers[++ptd.current] = handler;
         } else {
             handler.release();
         }
@@ -116,15 +114,15 @@
     /**
      * Calls the release() method of all tag handlers in this tag handler pool.
      */
-    public void release() {        
+    public void release() {
         Enumeration enumeration = perThreadDataVector.elements();
         while (enumeration.hasMoreElements()) {
-	    PerThreadData ptd = (PerThreadData)enumeration.nextElement();
+            PerThreadData ptd = (PerThreadData) enumeration.nextElement();
             if (ptd.handlers != null) {
-                for (int i=ptd.current; i>=0; i--) {
+                for (int i = ptd.current; i >= 0; i--) {
                     if (ptd.handlers[i] != null) {
                         ptd.handlers[i].release();
-		    }
+                    }
                 }
             }
         }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ProtectedFunctionMapper.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ProtectedFunctionMapper.java
index e90f0d7..b494623 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ProtectedFunctionMapper.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ProtectedFunctionMapper.java
@@ -37,7 +37,7 @@
  */
 public final class ProtectedFunctionMapper implements FunctionMapper {
 
-    /** 
+    /**
      * Maps "prefix:name" to java.lang.Method objects.
      */
     private HashMap fnmap = null;
@@ -63,59 +63,58 @@
      */
     public static ProtectedFunctionMapper getInstance() {
         ProtectedFunctionMapper funcMapper;
-	if (SecurityUtil.isPackageProtectionEnabled()) {
-	    funcMapper = (ProtectedFunctionMapper)AccessController.doPrivileged(
-		new PrivilegedAction() {
-		public Object run() {
-		    return new ProtectedFunctionMapper();
-		}
-	    } );
-	} else {
-	    funcMapper = new ProtectedFunctionMapper();
-	}
-	funcMapper.fnmap = new java.util.HashMap();
-	return funcMapper;
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            funcMapper = (ProtectedFunctionMapper) AccessController.doPrivileged(
+                    new PrivilegedAction() {
+                        public Object run() {
+                            return new ProtectedFunctionMapper();
+                        }
+                    });
+        } else {
+            funcMapper = new ProtectedFunctionMapper();
+        }
+        funcMapper.fnmap = new java.util.HashMap();
+        return funcMapper;
     }
 
     /**
-     * Stores a mapping from the given EL function prefix and name to 
+     * Stores a mapping from the given EL function prefix and name to
      * the given Java method.
      *
-     * @param fnQName The EL function qualified name (including prefix)
-     * @param c The class containing the Java method
+     * @param fnQName    The EL function qualified name (including prefix)
+     * @param c          The class containing the Java method
      * @param methodName The name of the Java method
-     * @param args The arguments of the Java method
+     * @param args       The arguments of the Java method
      * @throws RuntimeException if no method with the given signature
-     *     could be found.
+     *                          could be found.
      */
     public void mapFunction(String fnQName, final Class c,
-			    final String methodName, final Class[] args ) 
-    {
-	java.lang.reflect.Method method;
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            try{
-                method = (java.lang.reflect.Method)AccessController.doPrivileged(new PrivilegedExceptionAction(){
+                            final String methodName, final Class[] args) {
+        java.lang.reflect.Method method;
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            try {
+                method = (java.lang.reflect.Method) AccessController.doPrivileged(new PrivilegedExceptionAction() {
 
-                    public Object run() throws Exception{
+                    public Object run() throws Exception {
                         return c.getDeclaredMethod(methodName, args);
-                    }                
-                });      
-            } catch (PrivilegedActionException ex){
+                    }
+                });
+            } catch (PrivilegedActionException ex) {
                 throw new RuntimeException(
-                    "Invalid function mapping - no such method: "
-		    + ex.getException().getMessage());               
+                        "Invalid function mapping - no such method: "
+                                + ex.getException().getMessage());
             }
         } else {
-             try {
+            try {
                 method = c.getDeclaredMethod(methodName, args);
-            } catch( NoSuchMethodException e ) {
+            } catch (NoSuchMethodException e) {
                 throw new RuntimeException(
-                    "Invalid function mapping - no such method: "
-		    + e.getMessage());
+                        "Invalid function mapping - no such method: "
+                                + e.getMessage());
             }
         }
 
-	this.fnmap.put(fnQName, method );
+        this.fnmap.put(fnQName, method);
     }
 
     /**
@@ -123,67 +122,66 @@
      * the given EL function prefix and name. This method is used for
      * the case when there is only one function in the EL expression.
      *
-     * @param fnQName The EL function qualified name (including prefix)
-     * @param c The class containing the Java method
+     * @param fnQName    The EL function qualified name (including prefix)
+     * @param c          The class containing the Java method
      * @param methodName The name of the Java method
-     * @param args The arguments of the Java method
+     * @param args       The arguments of the Java method
      * @throws RuntimeException if no method with the given signature
-     *     could be found.
+     *                          could be found.
      */
     public static ProtectedFunctionMapper getMapForFunction(
-		String fnQName, final Class c,
-                final String methodName, final Class[] args )
-    {
+            String fnQName, final Class c,
+            final String methodName, final Class[] args) {
         java.lang.reflect.Method method;
         ProtectedFunctionMapper funcMapper;
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            funcMapper = (ProtectedFunctionMapper)AccessController.doPrivileged(
-                new PrivilegedAction(){
-                public Object run() {
-                    return new ProtectedFunctionMapper();
-                }
-            });
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            funcMapper = (ProtectedFunctionMapper) AccessController.doPrivileged(
+                    new PrivilegedAction() {
+                        public Object run() {
+                            return new ProtectedFunctionMapper();
+                        }
+                    });
 
-            try{
-                method = (java.lang.reflect.Method)AccessController.doPrivileged
-(new PrivilegedExceptionAction(){
+            try {
+                method = (java.lang.reflect.Method) AccessController.doPrivileged
+                        (new PrivilegedExceptionAction() {
 
-                    public Object run() throws Exception{
-                        return c.getDeclaredMethod(methodName, args);
-                    }
-                });
-            } catch (PrivilegedActionException ex){
+                            public Object run() throws Exception {
+                                return c.getDeclaredMethod(methodName, args);
+                            }
+                        });
+            } catch (PrivilegedActionException ex) {
                 throw new RuntimeException(
-                    "Invalid function mapping - no such method: "
-                    + ex.getException().getMessage());
+                        "Invalid function mapping - no such method: "
+                                + ex.getException().getMessage());
             }
         } else {
-	    funcMapper = new ProtectedFunctionMapper();
-             try {
+            funcMapper = new ProtectedFunctionMapper();
+            try {
                 method = c.getDeclaredMethod(methodName, args);
-            } catch( NoSuchMethodException e ) {
+            } catch (NoSuchMethodException e) {
                 throw new RuntimeException(
-                    "Invalid function mapping - no such method: "
-                    + e.getMessage());
+                        "Invalid function mapping - no such method: "
+                                + e.getMessage());
             }
         }
         funcMapper.theMethod = method;
-	return funcMapper;
+        return funcMapper;
     }
 
     /**
      * Resolves the specified local name and prefix into a Java.lang.Method.
      * Returns null if the prefix and local name are not found.
-     * 
-     * @param prefix the prefix of the function
+     *
+     * @param prefix    the prefix of the function
      * @param localName the short name of the function
      * @return the result of the method mapping.  Null means no entry found.
-     **/
+     */
     public Method resolveFunction(String prefix, String localName) {
         if (this.fnmap != null) {
             return (Method) this.fnmap.get(prefix + ":" + localName);
         }
-	return theMethod;
+        return theMethod;
     }
 }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ServletResponseWrapperInclude.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ServletResponseWrapperInclude.java
index 35cc90d..86da343 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ServletResponseWrapperInclude.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/ServletResponseWrapperInclude.java
@@ -27,7 +27,7 @@
 
 /**
  * ServletResponseWrapper used by the JSP 'include' action.
- *
+ * <p/>
  * This wrapper response object is passed to RequestDispatcher.include(), so
  * that the output of the included resource is appended to that of the
  * including page.
@@ -44,22 +44,22 @@
 
     private JspWriter jspWriter;
 
-    public ServletResponseWrapperInclude(ServletResponse response, 
-					 JspWriter jspWriter) {
-	super((HttpServletResponse)response);
-	this.printWriter = new PrintWriter(jspWriter);
-	this.jspWriter = jspWriter;
+    public ServletResponseWrapperInclude(ServletResponse response,
+                                         JspWriter jspWriter) {
+        super((HttpServletResponse) response);
+        this.printWriter = new PrintWriter(jspWriter);
+        this.jspWriter = jspWriter;
     }
 
     /**
      * Returns a wrapper around the JspWriter of the including page.
      */
     public PrintWriter getWriter() throws IOException {
-	return printWriter;
+        return printWriter;
     }
 
     public ServletOutputStream getOutputStream() throws IOException {
-	throw new IllegalStateException();
+        throw new IllegalStateException();
     }
 
     /**
@@ -67,9 +67,9 @@
      * page.
      */
     public void resetBuffer() {
-	try {
-	    jspWriter.clearBuffer();
-	} catch (IOException ioe) {
-	}
+        try {
+            jspWriter.clearBuffer();
+        } catch (IOException ioe) {
+        }
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/TagHandlerPool.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/TagHandlerPool.java
index f77b978..782a789 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/TagHandlerPool.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/runtime/TagHandlerPool.java
@@ -32,43 +32,43 @@
 
     private Tag[] handlers;
 
-    public static String OPTION_TAGPOOL="tagpoolClassName";
-    public static String OPTION_MAXSIZE="tagpoolMaxSize";
+    public static String OPTION_TAGPOOL = "tagpoolClassName";
+    public static String OPTION_MAXSIZE = "tagpoolMaxSize";
 
     // index of next available tag handler
     private int current;
 
-    public static TagHandlerPool getTagHandlerPool( ServletConfig config) {
-        TagHandlerPool result=null;
+    public static TagHandlerPool getTagHandlerPool(ServletConfig config) {
+        TagHandlerPool result = null;
 
-        String tpClassName=getOption( config, OPTION_TAGPOOL, null);
-        if( tpClassName != null ) {
+        String tpClassName = getOption(config, OPTION_TAGPOOL, null);
+        if (tpClassName != null) {
             try {
-                Class c=Class.forName( tpClassName );
-                result=(TagHandlerPool)c.newInstance();
+                Class c = Class.forName(tpClassName);
+                result = (TagHandlerPool) c.newInstance();
             } catch (Exception e) {
                 e.printStackTrace();
-                result=null;
+                result = null;
             }
         }
-        if( result==null ) result=new TagHandlerPool();
+        if (result == null) result = new TagHandlerPool();
         result.init(config);
 
         return result;
     }
 
-    protected void init( ServletConfig config ) {
-        int maxSize=-1;
-        String maxSizeS=getOption(config, OPTION_MAXSIZE, null);
-        if( maxSizeS != null ) {
+    protected void init(ServletConfig config) {
+        int maxSize = -1;
+        String maxSizeS = getOption(config, OPTION_MAXSIZE, null);
+        if (maxSizeS != null) {
             try {
-                maxSize=Integer.parseInt(maxSizeS);
-            } catch( Exception ex) {
-                maxSize=-1;
+                maxSize = Integer.parseInt(maxSizeS);
+            } catch (Exception ex) {
+                maxSize = -1;
             }
         }
-        if( maxSize <0  ) {
-            maxSize=Constants.MAX_POOL_SIZE;
+        if (maxSize < 0) {
+            maxSize = Constants.MAX_POOL_SIZE;
         }
         this.handlers = new Tag[maxSize];
         this.current = -1;
@@ -78,7 +78,7 @@
      * Constructs a tag handler pool with the default capacity.
      */
     public TagHandlerPool() {
-	// Nothing - jasper generated servlets call the other constructor,
+        // Nothing - jasper generated servlets call the other constructor,
         // this should be used in future + init .
     }
 
@@ -89,8 +89,8 @@
      * @deprecated Use static getTagHandlerPool
      */
     public TagHandlerPool(int capacity) {
-	this.handlers = new Tag[capacity];
-	this.current = -1;
+        this.handlers = new Tag[capacity];
+        this.current = -1;
     }
 
     /**
@@ -98,14 +98,12 @@
      * instantiating one if this tag handler pool is empty.
      *
      * @param handlerClass Tag handler class
-     *
      * @return Reused or newly instantiated tag handler
-     *
      * @throws JspException if a tag handler cannot be instantiated
      */
     public Tag get(Class handlerClass) throws JspException {
-	Tag handler = null;
-        synchronized( this ) {
+        Tag handler = null;
+        synchronized (this) {
             if (current >= 0) {
                 handler = handlers[current--];
                 return handler;
@@ -129,7 +127,7 @@
      * @param handler Tag handler to add to this tag handler pool
      */
     public void reuse(Tag handler) {
-        synchronized( this ) {
+        synchronized (this) {
             if (current < (handlers.length - 1)) {
                 handlers[++current] = handler;
                 return;
@@ -144,20 +142,20 @@
      * handler pool.
      */
     public synchronized void release() {
-	for (int i=current; i>=0; i--) {
-	    handlers[i].release();
-	}
+        for (int i = current; i >= 0; i--) {
+            handlers[i].release();
+        }
     }
 
-    protected static String getOption( ServletConfig config, String name, String defaultV) {
-        if( config == null ) return defaultV;
+    protected static String getOption(ServletConfig config, String name, String defaultV) {
+        if (config == null) return defaultV;
 
-        String value=config.getInitParameter(name);
-        if( value != null ) return value;
-        if( config.getServletContext() ==null )
+        String value = config.getInitParameter(name);
+        if (value != null) return value;
+        if (config.getServletContext() == null)
             return defaultV;
-        value=config.getServletContext().getInitParameter(name);
-        if( value!=null ) return value;
+        value = config.getServletContext().getInitParameter(name);
+        if (value != null) return value;
         return defaultV;
     }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityClassLoad.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityClassLoad.java
index 3bc4e41..5969b6e 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityClassLoad.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityClassLoad.java
@@ -18,6 +18,9 @@
 
 package org.apache.struts2.jasper.security;
 
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
 /**
  * Static class used to preload java classes when using the
  * Java SecurityManager so that the defineClassInPackage
@@ -28,82 +31,81 @@
 
 public final class SecurityClassLoad {
 
-    private static org.apache.commons.logging.Log log=
-        org.apache.commons.logging.LogFactory.getLog( SecurityClassLoad.class );
+    private static Logger log = LoggerFactory.getLogger(SecurityClassLoad.class);
 
-    public static void securityClassLoad(ClassLoader loader){
+    public static void securityClassLoad(ClassLoader loader) {
 
-        if( System.getSecurityManager() == null ){
+        if (System.getSecurityManager() == null) {
             return;
         }
 
         String basePackage = "org.apache.struts2.jasper.";
         try {
-            loader.loadClass( basePackage +
-                "runtime.JspFactoryImpl$PrivilegedGetPageContext");
-            loader.loadClass( basePackage +
-                "runtime.JspFactoryImpl$PrivilegedReleasePageContext");
+            loader.loadClass(basePackage +
+                    "runtime.JspFactoryImpl$PrivilegedGetPageContext");
+            loader.loadClass(basePackage +
+                    "runtime.JspFactoryImpl$PrivilegedReleasePageContext");
 
-            loader.loadClass( basePackage +
-                "runtime.JspRuntimeLibrary");
-            loader.loadClass( basePackage +
-                "runtime.JspRuntimeLibrary$PrivilegedIntrospectHelper");
-            
-            loader.loadClass( basePackage +
-                "runtime.ServletResponseWrapperInclude");
-            loader.loadClass( basePackage +
-                "runtime.TagHandlerPool");
-            loader.loadClass( basePackage +
-                "runtime.JspFragmentHelper");
+            loader.loadClass(basePackage +
+                    "runtime.JspRuntimeLibrary");
+            loader.loadClass(basePackage +
+                    "runtime.JspRuntimeLibrary$PrivilegedIntrospectHelper");
 
-            loader.loadClass( basePackage +
-                "runtime.ProtectedFunctionMapper");
-            loader.loadClass( basePackage +
-                "runtime.ProtectedFunctionMapper$1");
-            loader.loadClass( basePackage +
-                "runtime.ProtectedFunctionMapper$2"); 
-            loader.loadClass( basePackage +
-                "runtime.ProtectedFunctionMapper$3");
-            loader.loadClass( basePackage +
-                "runtime.ProtectedFunctionMapper$4"); 
+            loader.loadClass(basePackage +
+                    "runtime.ServletResponseWrapperInclude");
+            loader.loadClass(basePackage +
+                    "runtime.TagHandlerPool");
+            loader.loadClass(basePackage +
+                    "runtime.JspFragmentHelper");
 
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$1");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$2");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$3");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$4");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$5");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$6");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$7");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$8");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$9");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$10");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$11");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$12");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$13");      
+            loader.loadClass(basePackage +
+                    "runtime.ProtectedFunctionMapper");
+            loader.loadClass(basePackage +
+                    "runtime.ProtectedFunctionMapper$1");
+            loader.loadClass(basePackage +
+                    "runtime.ProtectedFunctionMapper$2");
+            loader.loadClass(basePackage +
+                    "runtime.ProtectedFunctionMapper$3");
+            loader.loadClass(basePackage +
+                    "runtime.ProtectedFunctionMapper$4");
 
-            loader.loadClass( basePackage +
-                "runtime.JspContextWrapper");   
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$1");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$2");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$3");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$4");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$5");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$6");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$7");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$8");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$9");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$10");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$11");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$12");
+            loader.loadClass(basePackage +
+                    "runtime.PageContextImpl$13");
 
-            loader.loadClass( basePackage +
-                "servlet.JspServletWrapper");
+            loader.loadClass(basePackage +
+                    "runtime.JspContextWrapper");
 
-            loader.loadClass( basePackage +
-                "runtime.JspWriterImpl$1");
+            loader.loadClass(basePackage +
+                    "servlet.JspServletWrapper");
+
+            loader.loadClass(basePackage +
+                    "runtime.JspWriterImpl$1");
         } catch (ClassNotFoundException ex) {
             log.error("SecurityClassLoad", ex);
         }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityUtil.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityUtil.java
index 8333693..dc4e293 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityUtil.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/security/SecurityUtil.java
@@ -22,21 +22,21 @@
  * @author Jean-Francois Arcand
  */
 
-public final class SecurityUtil{
-    
-    private static boolean packageDefinitionEnabled =  
-         System.getProperty("package.definition") == null ? false : true;
-    
+public final class SecurityUtil {
+
+    private static boolean packageDefinitionEnabled =
+            System.getProperty("package.definition") == null ? false : true;
+
     /**
      * Return the <code>SecurityManager</code> only if Security is enabled AND
      * package protection mechanism is enabled.
      */
-    public static boolean isPackageProtectionEnabled(){
-        if (packageDefinitionEnabled && System.getSecurityManager() !=  null){
+    public static boolean isPackageProtectionEnabled() {
+        if (packageDefinitionEnabled && System.getSecurityManager() != null) {
             return true;
         }
         return false;
     }
-    
-    
+
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JasperLoader.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JasperLoader.java
index 54241ec..19806b4 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JasperLoader.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JasperLoader.java
@@ -27,7 +27,7 @@
 import java.security.PermissionCollection;
 
 /**
- * Class loader for loading servlet class files (corresponding to JSP files) 
+ * Class loader for loading servlet class files (corresponding to JSP files)
  * and tag handler class files (corresponding to tag files).
  *
  * @author Anil K. Vijendran
@@ -41,12 +41,12 @@
     private SecurityManager securityManager;
 
     public JasperLoader(URL[] urls, ClassLoader parent,
-			PermissionCollection permissionCollection,
-			CodeSource codeSource) {
-	super(urls, parent);
-	this.permissionCollection = permissionCollection;
-	this.parent = parent;
-	this.securityManager = System.getSecurityManager();
+                        PermissionCollection permissionCollection,
+                        CodeSource codeSource) {
+        super(urls, parent);
+        this.permissionCollection = permissionCollection;
+        this.parent = parent;
+        this.securityManager = System.getSecurityManager();
     }
 
     /**
@@ -55,8 +55,7 @@
      * with <code>false</code> as the second argument.
      *
      * @param name Name of the class to be loaded
-     *
-     * @exception ClassNotFoundException if the class was not found
+     * @throws ClassNotFoundException if the class was not found
      */
     public Class loadClass(String name) throws ClassNotFoundException {
 
@@ -69,72 +68,71 @@
      * be found, returns <code>ClassNotFoundException</code>.
      * <ul>
      * <li>Call <code>findLoadedClass(String)</code> to check if the
-     *     class has already been loaded.  If it has, the same
-     *     <code>Class</code> object is returned.</li>
+     * class has already been loaded.  If it has, the same
+     * <code>Class</code> object is returned.</li>
      * <li>If the <code>delegate</code> property is set to <code>true</code>,
-     *     call the <code>loadClass()</code> method of the parent class
-     *     loader, if any.</li>            
+     * call the <code>loadClass()</code> method of the parent class
+     * loader, if any.</li>
      * <li>Call <code>findClass()</code> to find this class in our locally
-     *     defined repositories.</li>      
+     * defined repositories.</li>
      * <li>Call the <code>loadClass()</code> method of our parent
-     *     class loader, if any.</li>      
+     * class loader, if any.</li>
      * </ul>
      * If the class was found using the above steps, and the
      * <code>resolve</code> flag is <code>true</code>, this method will then
      * call <code>resolveClass(Class)</code> on the resulting Class object.
-     *                                     
-     * @param name Name of the class to be loaded
+     *
+     * @param name    Name of the class to be loaded
      * @param resolve If <code>true</code> then resolve the class
-     *                                     
-     * @exception ClassNotFoundException if the class was not found
-     */                                    
+     * @throws ClassNotFoundException if the class was not found
+     */
     public Class loadClass(final String name, boolean resolve)
-        throws ClassNotFoundException {
+            throws ClassNotFoundException {
 
-        Class clazz = null;                
-                                           
+        Class clazz = null;
+
         // (0) Check our previously loaded class cache
-        clazz = findLoadedClass(name);     
-        if (clazz != null) {               
-            if (resolve)                   
-                resolveClass(clazz);       
-            return (clazz);        
-        }                          
-                          
+        clazz = findLoadedClass(name);
+        if (clazz != null) {
+            if (resolve)
+                resolveClass(clazz);
+            return (clazz);
+        }
+
         // (.5) Permission to access this class when using a SecurityManager
-        if (securityManager != null) {     
+        if (securityManager != null) {
             int dot = name.lastIndexOf('.');
-            if (dot >= 0) {                
-                try {        
+            if (dot >= 0) {
+                try {
                     // Do not call the security manager since by default, we grant that package.
-                    if (!"org.apache.struts2.jasper.runtime".equalsIgnoreCase(name.substring(0,dot))){
-                        securityManager.checkPackageAccess(name.substring(0,dot));
+                    if (!"org.apache.struts2.jasper.runtime".equalsIgnoreCase(name.substring(0, dot))) {
+                        securityManager.checkPackageAccess(name.substring(0, dot));
                     }
                 } catch (SecurityException se) {
                     String error = "Security Violation, attempt to use " +
-                        "Restricted Class: " + name;
+                            "Restricted Class: " + name;
                     se.printStackTrace();
                     throw new ClassNotFoundException(error);
-                }                          
-            }                              
+                }
+            }
         }
 
-	if( !name.startsWith(Constants.JSP_PACKAGE_NAME) ) {
+        if (!name.startsWith(Constants.JSP_PACKAGE_NAME)) {
             // Class is not in org.apache.jsp, therefore, have our
             // parent load it
-            clazz = parent.loadClass(name);            
-	    if( resolve )
-		resolveClass(clazz);
-	    return clazz;
-	}
+            clazz = parent.loadClass(name);
+            if (resolve)
+                resolveClass(clazz);
+            return clazz;
+        }
 
-	return findClass(name);
+        return findClass(name);
     }
 
-    
+
     /**
      * Delegate to parent
-     * 
+     *
      * @see java.lang.ClassLoader#getResourceAsStream(java.lang.String)
      */
     public InputStream getResourceAsStream(String name) {
@@ -151,11 +149,11 @@
         }
         return is;
     }
-    
-    
+
+
     /**
      * Get the Permissions for a CodeSource.
-     *
+     * <p/>
      * Since this ClassLoader is only used for a JSP page in
      * a web application context, we just return our preset
      * PermissionCollection for the web app context.
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspCServletContext.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspCServletContext.java
index 1bb6ceb..d7b8552 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspCServletContext.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspCServletContext.java
@@ -19,6 +19,7 @@
 
 
 import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
+import com.opensymphony.xwork2.ActionContext;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
@@ -31,6 +32,8 @@
 import java.net.URL;
 import java.util.*;
 
+import org.apache.struts2.ServletActionContext;
+
 
 /**
  * Simple <code>ServletContext</code> implementation without
@@ -57,6 +60,7 @@
     protected PrintWriter myLogWriter;
 
     private ClassLoaderInterface classLoaderInterface;
+    private static final String WEB_XML = "/WEB-INF/web.xml";
 
 
     // ----------------------------------------------------------- Constructors
@@ -188,14 +192,14 @@
     public String getRealPath(String path) {
         try {
             return
-                (getResource(path).getFile().replace('/', File.separatorChar));
+                    (getResource(path).getFile().replace('/', File.separatorChar));
         } catch (Throwable t) {
             return (null);
         }
 
     }
-            
-            
+
+
     /**
      * Return a request dispatcher for the specified context-relative path.
      *
@@ -213,11 +217,18 @@
      * specified context-relative path.
      *
      * @param path Context-relative path of the desired resource
-     *
-     * @exception MalformedURLException if the resource path is
-     *  not properly formed
+     * @throws MalformedURLException if the resource path is
+     *                               not properly formed
      */
     public URL getResource(String path) throws MalformedURLException {
+        if (WEB_XML.equals(path)) {
+            if (ActionContext.getContext() != null) {
+                ServletContext context = ServletActionContext.getServletContext();
+                return context.getResource(path);
+            }
+
+            return null;
+        }
         return classLoaderInterface.getResource(path);
     }
 
@@ -283,7 +294,6 @@
      * Return a null reference for the specified servlet name.
      *
      * @param name Name of the requested servlet
-     *
      * @deprecated This method has been deprecated with no replacement
      */
     public Servlet getServlet(String name) throws ServletException {
@@ -343,8 +353,7 @@
      * Log the specified message and exception.
      *
      * @param exception The exception to be logged
-     * @param message The message to be logged
-     *
+     * @param message   The message to be logged
      * @deprecated Use log(String,Throwable) instead
      */
     public void log(Exception exception, String message) {
@@ -357,7 +366,7 @@
     /**
      * Log the specified message and exception.
      *
-     * @param message The message to be logged
+     * @param message   The message to be logged
      * @param exception The exception to be logged
      */
     public void log(String message, Throwable exception) {
@@ -383,7 +392,7 @@
     /**
      * Set or replace the specified context attribute.
      *
-     * @param name Name of the context attribute to set
+     * @param name  Name of the context attribute to set
      * @param value Corresponding attribute value
      */
     public void setAttribute(String name, Object value) {
@@ -393,5 +402,4 @@
     }
 
 
-
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServlet.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServlet.java
index 13ffd9f..dddec77 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServlet.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServlet.java
@@ -17,8 +17,8 @@
 
 package org.apache.struts2.jasper.servlet;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.Constants;
 import org.apache.struts2.jasper.EmbeddedServletOptions;
 import org.apache.struts2.jasper.Options;
@@ -37,7 +37,7 @@
 
 /**
  * The JSP engine (a.k.a Jasper).
- *
+ * <p/>
  * The servlet container is responsible for providing a
  * URLClassLoader for the web application context Jasper
  * is being used in. Jasper will try get the Tomcat
@@ -54,7 +54,7 @@
 public class JspServlet extends HttpServlet {
 
     // Logger
-    private Log log = LogFactory.getLog(JspServlet.class);
+    private Logger log = LoggerFactory.getLogger(JspServlet.class);
 
     private ServletContext context;
     private ServletConfig config;
@@ -66,24 +66,24 @@
      * Initializes this JspServlet.
      */
     public void init(ServletConfig config) throws ServletException {
-        
+
         super.init(config);
         this.config = config;
         this.context = config.getServletContext();
-        
+
         // Initialize the JSP Runtime Context
         // Check for a custom Options implementation
-        String engineOptionsName = 
-            config.getInitParameter("engineOptionsClass");
+        String engineOptionsName =
+                config.getInitParameter("engineOptionsClass");
         if (engineOptionsName != null) {
             // Instantiate the indicated Options implementation
             try {
                 ClassLoader loader = Thread.currentThread()
                         .getContextClassLoader();
                 Class engineOptionsClass = loader.loadClass(engineOptionsName);
-                Class[] ctorSig = { ServletConfig.class, ServletContext.class };
+                Class[] ctorSig = {ServletConfig.class, ServletContext.class};
                 Constructor ctor = engineOptionsClass.getConstructor(ctorSig);
-                Object[] args = { config, context };
+                Object[] args = {config, context};
                 options = (Options) ctor.newInstance(args);
             } catch (Throwable e) {
                 // Need to localize this.
@@ -96,7 +96,7 @@
             options = new EmbeddedServletOptions(config, context);
         }
         rctxt = new JspRuntimeContext(context, options);
-        
+
         if (log.isDebugEnabled()) {
             log.debug(Localizer.getMessage("jsp.message.scratch.dir.is",
                     options.getScratchDir().toString()));
@@ -109,11 +109,11 @@
      * Returns the number of JSPs for which JspServletWrappers exist, i.e.,
      * the number of JSPs that have been loaded into the webapp with which
      * this JspServlet is associated.
-     *
+     * <p/>
      * <p>This info may be used for monitoring purposes.
      *
      * @return The number of JSPs that have been loaded into the webapp with
-     * which this JspServlet is associated
+     *         which this JspServlet is associated
      */
     public int getJspCount() {
         return this.rctxt.getJspCount();
@@ -132,11 +132,11 @@
 
     /**
      * Gets the number of JSPs that have been reloaded.
-     *
+     * <p/>
      * <p>This info may be used for monitoring purposes.
      *
      * @return The number of JSPs (in the webapp with which this JspServlet is
-     * associated) that have been reloaded
+     *         associated) that have been reloaded
      */
     public int getJspReloadCount() {
         return this.rctxt.getJspReloadCount();
@@ -152,9 +152,8 @@
      * <code>request.setCharacterEncoding()</code> first.</p>
      *
      * @param request The servlet requset we are processing
-     *
-     * @exception ServletException if an invalid parameter value for the
-     *  <code>jsp_precompile</code> parameter name is specified
+     * @throws ServletException if an invalid parameter value for the
+     *                          <code>jsp_precompile</code> parameter name is specified
      */
     boolean preCompile(HttpServletRequest request) throws ServletException {
 
@@ -167,7 +166,7 @@
             return (false);
         }
         queryString =
-            queryString.substring(start + Constants.PRECOMPILE.length());
+                queryString.substring(start + Constants.PRECOMPILE.length());
         if (queryString.length() == 0) {
             return (true);             // ?jsp_precompile
         }
@@ -194,16 +193,16 @@
             return (true);             // ?jsp_precompile=false
         } else {
             throw new ServletException("Cannot have request parameter " +
-                                       Constants.PRECOMPILE + " set to " +
-                                       value);
+                    Constants.PRECOMPILE + " set to " +
+                    value);
         }
 
     }
-    
 
-    public void service (HttpServletRequest request, 
-                         HttpServletResponse response)
-                throws ServletException, IOException {
+
+    public void service(HttpServletRequest request,
+                        HttpServletResponse response)
+            throws ServletException, IOException {
 
         String jspUri = null;
 
@@ -224,7 +223,7 @@
                  * relevant javax.servlet.include.* request attributes
                  */
                 String pathInfo = (String) request.getAttribute(
-                                    "javax.servlet.include.path_info");
+                        "javax.servlet.include.path_info");
                 if (pathInfo != null) {
                     jspUri += pathInfo;
                 }
@@ -253,8 +252,8 @@
             Enumeration e = request.getParameterNames();
             while (e.hasMoreElements()) {
                 String name = (String) e.nextElement();
-                log.debug("\t\t " + name + " = " 
-                          + request.getParameter(name));
+                log.debug("\t\t " + name + " = "
+                        + request.getParameter(name));
             }
         }
 
@@ -287,39 +286,39 @@
     private void serviceJspFile(HttpServletRequest request,
                                 HttpServletResponse response, String jspUri,
                                 Throwable exception, boolean precompile)
-        throws ServletException, IOException {
+            throws ServletException, IOException {
 
         JspServletWrapper wrapper =
-            (JspServletWrapper) rctxt.getWrapper(jspUri);
+                (JspServletWrapper) rctxt.getWrapper(jspUri);
         if (wrapper == null) {
-            synchronized(this) {
+            synchronized (this) {
                 wrapper = (JspServletWrapper) rctxt.getWrapper(jspUri);
                 if (wrapper == null) {
                     // Check if the requested JSP page exists, to avoid
                     // creating unnecessary directories and files.
                     if (null == context.getResource(jspUri)) {
                         String includeRequestUri = (String)
-                        request.getAttribute("javax.servlet.include.request_uri");
+                                request.getAttribute("javax.servlet.include.request_uri");
                         if (includeRequestUri != null) {
                             // This file was included. Throw an exception as
                             // a response.sendError() will be ignored
                             throw new ServletException(Localizer.getMessage(
-                                    "jsp.error.file.not.found",jspUri));
+                                    "jsp.error.file.not.found", jspUri));
                         } else {
                             try {
                                 response.sendError(HttpServletResponse.SC_NOT_FOUND,
                                         request.getRequestURI());
-                        } catch (IllegalStateException ise) {
-                            log.error(Localizer.getMessage("jsp.error.file.not.found",
-                                   jspUri));
+                            } catch (IllegalStateException ise) {
+                                log.error(Localizer.getMessage("jsp.error.file.not.found",
+                                        jspUri));
+                            }
                         }
-                    }
                         return;
                     }
                     boolean isErrorPage = exception != null;
                     wrapper = new JspServletWrapper(config, options, jspUri,
-                                                    isErrorPage, rctxt);
-                    rctxt.addWrapper(jspUri,wrapper);
+                            isErrorPage, rctxt);
+                    rctxt.addWrapper(jspUri, wrapper);
                 }
             }
         }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServletWrapper.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServletWrapper.java
index 5f5c643..1a62e6f 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServletWrapper.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/JspServletWrapper.java
@@ -36,7 +36,7 @@
 
 /**
  * The JSP engine (a.k.a Jasper).
- *
+ * <p/>
  * The servlet container is responsible for providing a
  * URLClassLoader for the web application context Jasper
  * is being used in. Jasper will try get the Tomcat
@@ -77,34 +77,34 @@
                       boolean isErrorPage, JspRuntimeContext rctxt)
             throws JasperException {
 
-	this.isTagFile = false;
+        this.isTagFile = false;
         this.config = config;
         this.options = options;
         this.jspUri = jspUri;
         ctxt = new JspCompilationContext(jspUri, isErrorPage, options,
-					 config.getServletContext(),
-					 this, rctxt, null);
+                config.getServletContext(),
+                this, rctxt, null);
     }
 
     /*
      * JspServletWrapper for tag files.
      */
     public JspServletWrapper(ServletContext servletContext,
-			     Options options,
-			     String tagFilePath,
-			     TagInfo tagInfo,
-			     JspRuntimeContext rctxt,
-			     URL tagFileJarUrl)
-	    throws JasperException {
+                             Options options,
+                             String tagFilePath,
+                             TagInfo tagInfo,
+                             JspRuntimeContext rctxt,
+                             URL tagFileJarUrl)
+            throws JasperException {
 
-	this.isTagFile = true;
-        this.config = null;	// not used
+        this.isTagFile = true;
+        this.config = null;    // not used
         this.options = options;
-	this.jspUri = tagFilePath;
-	this.tripCount = 0;
+        this.jspUri = tagFilePath;
+        this.tripCount = 0;
         ctxt = new JspCompilationContext(jspUri, tagInfo, options,
-					 servletContext, this, rctxt,
-					 tagFileJarUrl);
+                servletContext, this, rctxt,
+                tagFileJarUrl);
     }
 
     public JspCompilationContext getJspEngineContext() {
@@ -116,8 +116,7 @@
     }
 
     public Servlet getServlet()
-        throws ServletException, IOException, FileNotFoundException
-    {
+            throws ServletException, IOException, FileNotFoundException {
         if (reload) {
             synchronized (this) {
                 // Synchronizing on jsw enables simultaneous loading
@@ -125,17 +124,17 @@
                 if (reload) {
                     // This is to maintain the original protocol.
                     destroy();
-                    
+
                     Servlet servlet = null;
                     try {
                         servletClass = ctxt.load();
                         servlet = (Servlet) servletClass.newInstance();
-                    } catch( IllegalAccessException ex1 ) {
-                        throw new JasperException( ex1 );
-                    } catch( InstantiationException ex ) {
-                        throw new JasperException( ex );
+                    } catch (IllegalAccessException ex1) {
+                        throw new JasperException(ex1);
+                    } catch (InstantiationException ex) {
+                        throw new JasperException(ex);
                     }
-                    
+
                     servlet.init(config);
 
                     if (!firstTime) {
@@ -145,7 +144,7 @@
                     theServlet = servlet;
                     reload = false;
                 }
-            }    
+            }
         }
         return theServlet;
     }
@@ -189,7 +188,7 @@
             if (ctxt.isRemoved()) {
                 throw new FileNotFoundException(jspUri);
             }
-            if (options.getDevelopment() || firstTime ) {
+            if (options.getDevelopment() || firstTime) {
                 synchronized (this) {
                     firstTime = false;
                     ctxt.compile();
@@ -206,9 +205,9 @@
             }
         } catch (FileNotFoundException ex) {
             throw new JasperException(ex);
-	}
+        }
 
-	return tagHandlerClass;
+        return tagHandlerClass;
     }
 
     /**
@@ -219,53 +218,53 @@
      */
     public Class loadTagFilePrototype() throws JasperException {
 
-	ctxt.setPrototypeMode(true);
-	try {
-	    return loadTagFile();
-	} finally {
-	    ctxt.setPrototypeMode(false);
-	}
+        ctxt.setPrototypeMode(true);
+        try {
+            return loadTagFile();
+        } finally {
+            ctxt.setPrototypeMode(false);
+        }
     }
 
     /**
      * Get a list of files that the current page has source dependency on.
      */
     public java.util.List getDependants() {
-	try {
-	    Object target;
-	    if (isTagFile) {
+        try {
+            Object target;
+            if (isTagFile) {
                 if (reload) {
                     tagHandlerClass = ctxt.load();
                     reload = false;
                 }
-		target = tagHandlerClass.newInstance();
-	    } else {
-		target = getServlet();
-	    }
-	    if (target != null && target instanceof JspSourceDependent) {
-            return ((java.util.List) ((JspSourceDependent) target).getDependants());
-	    }
-	} catch (Throwable ex) {
-	}
-	return null;
+                target = tagHandlerClass.newInstance();
+            } else {
+                target = getServlet();
+            }
+            if (target != null && target instanceof JspSourceDependent) {
+                return ((java.util.List) ((JspSourceDependent) target).getDependants());
+            }
+        } catch (Throwable ex) {
+        }
+        return null;
     }
 
     public boolean isTagFile() {
-	return this.isTagFile;
+        return this.isTagFile;
     }
 
     public int incTripCount() {
-	return tripCount++;
+        return tripCount++;
     }
 
     public int decTripCount() {
-	return tripCount--;
+        return tripCount--;
     }
 
-    public void service(HttpServletRequest request, 
+    public void service(HttpServletRequest request,
                         HttpServletResponse response,
                         boolean precompile)
-	    throws ServletException, IOException, FileNotFoundException {
+            throws ServletException, IOException, FileNotFoundException {
         try {
 
             if (ctxt.isRemoved()) {
@@ -276,8 +275,8 @@
                 if (available > System.currentTimeMillis()) {
                     response.setDateHeader("Retry-After", available);
                     response.sendError
-                        (HttpServletResponse.SC_SERVICE_UNAVAILABLE,
-                         Localizer.getMessage("jsp.error.unavailable"));
+                            (HttpServletResponse.SC_SERVICE_UNAVAILABLE,
+                                    Localizer.getMessage("jsp.error.unavailable"));
                     return;
                 } else {
                     // Wait period has expired. Reset.
@@ -288,7 +287,7 @@
             /*
              * (1) Compile
              */
-            if (options.getDevelopment() || firstTime ) {
+            if (options.getDevelopment() || firstTime) {
                 synchronized (this) {
                     firstTime = false;
 
@@ -316,10 +315,10 @@
              * (3) Service request
              */
             if (theServlet instanceof SingleThreadModel) {
-               // sync on the wrapper so that the freshness
-               // of the page is determined right before servicing
-               synchronized (this) {
-                   theServlet.service(request, response);
+                // sync on the wrapper so that the freshness
+                // of the page is determined right before servicing
+                synchronized (this) {
+                    theServlet.service(request, response);
                 }
             } else {
                 theServlet.service(request, response);
@@ -327,7 +326,7 @@
 
         } catch (UnavailableException ex) {
             String includeRequestUri = (String)
-                request.getAttribute("javax.servlet.include.request_uri");
+                    request.getAttribute("javax.servlet.include.request_uri");
             if (includeRequestUri != null) {
                 // This file was included. Throw an exception as
                 // a response.sendError() will be ignored by the
@@ -339,31 +338,31 @@
                     unavailableSeconds = 60;        // Arbitrary default
                 }
                 available = System.currentTimeMillis() +
-                    (unavailableSeconds * 1000L);
+                        (unavailableSeconds * 1000L);
                 response.sendError
-                    (HttpServletResponse.SC_SERVICE_UNAVAILABLE, 
-                     ex.getMessage());
+                        (HttpServletResponse.SC_SERVICE_UNAVAILABLE,
+                                ex.getMessage());
             }
         } catch (ServletException ex) {
-            if(options.getDevelopment()) {
+            if (options.getDevelopment()) {
                 throw handleJspException(ex);
             } else {
                 throw ex;
             }
         } catch (IOException ex) {
-            if(options.getDevelopment()) {
+            if (options.getDevelopment()) {
                 throw handleJspException(ex);
             } else {
                 throw ex;
             }
         } catch (IllegalStateException ex) {
-            if(options.getDevelopment()) {
+            if (options.getDevelopment()) {
                 throw handleJspException(ex);
             } else {
                 throw ex;
             }
         } catch (Exception ex) {
-            if(options.getDevelopment()) {
+            if (options.getDevelopment()) {
                 throw handleJspException(ex);
             } else {
                 throw new JasperException(ex);
@@ -383,6 +382,7 @@
     public long getLastModificationTest() {
         return lastModificationTest;
     }
+
     /**
      * @param lastModificationTest The lastModificationTest to set.
      */
@@ -398,7 +398,7 @@
      * information, and a snippet of the JSP to help debugging.
      * Please see http://issues.apache.org/bugzilla/show_bug.cgi?id=37062 and
      * http://www.tfenne.com/jasper/ for more details.
-     *</p>
+     * </p>
      *
      * @param ex the exception that was the cause of the problem.
      * @return a JasperException with more detailed information
@@ -414,8 +414,8 @@
             StackTraceElement[] frames = realException.getStackTrace();
             StackTraceElement jspFrame = null;
 
-            for (int i=0; i<frames.length; ++i) {
-                if ( frames[i].getClassName().equals(this.getServlet().getClass().getName()) ) {
+            for (int i = 0; i < frames.length; ++i) {
+                if (frames[i].getClassName().equals(this.getServlet().getClass().getName())) {
                     jspFrame = frames[i];
                     break;
                 }
@@ -425,8 +425,7 @@
                 // If we couldn't find a frame in the stack trace corresponding
                 // to the generated servlet class, we can't really add anything
                 return new JasperException(ex);
-            }
-            else {
+            } else {
                 int javaLineNumber = jspFrame.getLineNumber();
                 JavacErrorDetail detail = ErrorDispatcher.createJavacError(
                         jspFrame.getMethodName(),
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/mbeans-descriptors.xml b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/mbeans-descriptors.xml
index 69781ea..bd83ecb 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/mbeans-descriptors.xml
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/servlet/mbeans-descriptors.xml
@@ -17,20 +17,20 @@
 -->
 <mbeans-descriptors>
 
-  <mbean         name="JspMonitor"
-          description="JSP Monitoring"
-               domain="Catalina"
-                group="Monitoring"
-                 type="org.apache.struts2.jasper.servlet.JspServlet">
+    <mbean name="JspMonitor"
+           description="JSP Monitoring"
+           domain="Catalina"
+           group="Monitoring"
+           type="org.apache.struts2.jasper.servlet.JspServlet">
 
-    <attribute   name="jspCount"
-          description="The number of JSPs that have been loaded into a webapp"
-                 type="int"/>
+        <attribute name="jspCount"
+                   description="The number of JSPs that have been loaded into a webapp"
+                   type="int"/>
 
-    <attribute   name="jspReloadCount"
-          description="The number of JSPs that have been reloaded"
-                 type="int"/>
+        <attribute name="jspReloadCount"
+                   description="The number of JSPs that have been reloaded"
+                   type="int"/>
 
-  </mbean>
+    </mbean>
 
 </mbeans-descriptors>
\ No newline at end of file
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/Util.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/Util.java
index de914fe..70371b8 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/Util.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/Util.java
@@ -34,17 +34,17 @@
  */
 
 public class Util {
-    
-    public static final String VALID_SCHEME_CHAR = 
-        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-";
-    
-    public static final String DEFAULT_ENCODING = 
-        "ISO-8859-1";
-    
+
+    public static final String VALID_SCHEME_CHAR =
+            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-";
+
+    public static final String DEFAULT_ENCODING =
+            "ISO-8859-1";
+
     public static final int HIGHEST_SPECIAL = '>';
-    
+
     public static char[][] specialCharactersRepresentation = new char[HIGHEST_SPECIAL + 1][];
-    
+
     static {
         specialCharactersRepresentation['&'] = "&amp;".toCharArray();
         specialCharactersRepresentation['<'] = "&lt;".toCharArray();
@@ -52,58 +52,57 @@
         specialCharactersRepresentation['"'] = "&#034;".toCharArray();
         specialCharactersRepresentation['\''] = "&#039;".toCharArray();
     }
-    
+
     /**
      * Converts the given string description of a scope to the corresponding
      * PageContext constant.
-     *
+     * <p/>
      * The validity of the given scope has already been checked by the
      * appropriate TLV.
      *
      * @param scope String description of scope
-     *
      * @return PageContext constant corresponding to given scope description
-     * 
-     * taken from org.apache.taglibs.standard.tag.common.core.Util  
+     *         <p/>
+     *         taken from org.apache.taglibs.standard.tag.common.core.Util
      */
-    public static int getScope(String scope){
+    public static int getScope(String scope) {
         int ret = PageContext.PAGE_SCOPE;
-        
-        if("request".equalsIgnoreCase(scope)){
+
+        if ("request".equalsIgnoreCase(scope)) {
             ret = PageContext.REQUEST_SCOPE;
-        }else if("session".equalsIgnoreCase(scope)){
+        } else if ("session".equalsIgnoreCase(scope)) {
             ret = PageContext.SESSION_SCOPE;
-        }else if("application".equalsIgnoreCase(scope)){
+        } else if ("application".equalsIgnoreCase(scope)) {
             ret = PageContext.APPLICATION_SCOPE;
         }
-        
+
         return ret;
     }
-    
+
     /**
      * Returns <tt>true</tt> if our current URL is absolute,
      * <tt>false</tt> otherwise.
      * taken from org.apache.taglibs.standard.tag.common.core.ImportSupport
      */
-    public static boolean isAbsoluteUrl(String url){
-        if(url == null){
+    public static boolean isAbsoluteUrl(String url) {
+        if (url == null) {
             return false;
         }
-        
+
         int colonPos = url.indexOf(":");
-        if(colonPos == -1){
+        if (colonPos == -1) {
             return false;
         }
-        
-        for(int i=0;i<colonPos;i++){
-            if(VALID_SCHEME_CHAR.indexOf(url.charAt(i)) == -1){
+
+        for (int i = 0; i < colonPos; i++) {
+            if (VALID_SCHEME_CHAR.indexOf(url.charAt(i)) == -1) {
                 return false;
             }
         }
-        
+
         return true;
     }
-    
+
     /**
      * Get the value associated with a content-type attribute.
      * Syntax defined in RFC 2045, section 5.1.
@@ -119,7 +118,7 @@
         if (index == -1) return null;
         index += 1; // positioned after the '='
         input = input.substring(index).trim();
-        
+
         if (input.charAt(0) == '"') {
             // attribute value is a quoted string
             begin = 1;
@@ -133,13 +132,13 @@
         }
         return input.substring(begin, end).trim();
     }
-    
+
     /**
      * Strips a servlet session ID from <tt>url</tt>.  The session ID
      * is encoded as a URL "path parameter" beginning with "jsessionid=".
      * We thus remove anything we find between ";jsessionid=" (inclusive)
      * and either EOS or a subsequent ';' (exclusive).
-     * 
+     * <p/>
      * taken from org.apache.taglibs.standard.tag.common.core.ImportSupport
      */
     public static String stripSession(String url) {
@@ -149,26 +148,26 @@
             int sessionEnd = u.toString().indexOf(";", sessionStart + 1);
             if (sessionEnd == -1)
                 sessionEnd = u.toString().indexOf("?", sessionStart + 1);
-            if (sessionEnd == -1) 				// still
+            if (sessionEnd == -1)                 // still
                 sessionEnd = u.length();
             u.delete(sessionStart, sessionEnd);
         }
         return u.toString();
     }
-    
-    
+
+
     /**
      * Performs the following substring replacements
      * (to facilitate output to XML/HTML pages):
-     *
-     *    & -> &amp;
-     *    < -> &lt;
-     *    > -> &gt;
-     *    " -> &#034;
-     *    ' -> &#039;
-     *
+     * <p/>
+     * & -> &amp;
+     * < -> &lt;
+     * > -> &gt;
+     * " -> &#034;
+     * ' -> &#039;
+     * <p/>
      * See also OutSupport.writeEscapedXml().
-     * 
+     * <p/>
      * taken from org.apache.taglibs.standard.tag.common.core.Util
      */
     public static String escapeXml(String buffer) {
@@ -176,7 +175,7 @@
         int length = buffer.length();
         char[] arrayBuffer = buffer.toCharArray();
         StringBuffer escapedBuffer = null;
-        
+
         for (int i = 0; i < length; i++) {
             char c = arrayBuffer[i];
             if (c <= HIGHEST_SPECIAL) {
@@ -188,7 +187,7 @@
                     }
                     // add unescaped portion
                     if (start < i) {
-                        escapedBuffer.append(arrayBuffer,start,i-start);
+                        escapedBuffer.append(arrayBuffer, start, i - start);
                     }
                     start = i + 1;
                     // add escaped xml
@@ -202,24 +201,25 @@
         }
         // add rest of unescaped portion
         if (start < length) {
-            escapedBuffer.append(arrayBuffer,start,length-start);
+            escapedBuffer.append(arrayBuffer, start, length - start);
         }
         return escapedBuffer.toString();
     }
-    
-    /** Utility methods
+
+    /**
+     * Utility methods
      * taken from org.apache.taglibs.standard.tag.common.core.UrlSupport
      */
     public static String resolveUrl(
             String url, String context, PageContext pageContext)
-    throws JspException {
+            throws JspException {
         // don't touch absolute URLs
         if (isAbsoluteUrl(url))
             return url;
-        
+
         // normalize relative URLs against a context root
         HttpServletRequest request =
-            (HttpServletRequest) pageContext.getRequest();
+                (HttpServletRequest) pageContext.getRequest();
         if (context == null) {
             if (url.startsWith("/"))
                 return (request.getContextPath() + url);
@@ -228,7 +228,7 @@
         } else {
             if (!context.startsWith("/") || !url.startsWith("/")) {
                 throw new JspTagException(
-                "In URL tags, when the \"context\" attribute is specified, values of both \"context\" and \"url\" must start with \"/\".");
+                        "In URL tags, when the \"context\" attribute is specified, values of both \"context\" and \"url\" must start with \"/\".");
             }
             if (context.equals("/")) {
                 // Don't produce string starting with '//', many
@@ -240,12 +240,13 @@
             }
         }
     }
-    
-    /** Wraps responses to allow us to retrieve results as Strings. 
-     * mainly taken from org.apache.taglibs.standard.tag.common.core.importSupport 
+
+    /**
+     * Wraps responses to allow us to retrieve results as Strings.
+     * mainly taken from org.apache.taglibs.standard.tag.common.core.importSupport
      */
-    public static class ImportResponseWrapper extends HttpServletResponseWrapper{
-        
+    public static class ImportResponseWrapper extends HttpServletResponseWrapper {
+
         private StringWriter sw = new StringWriter();
         private ByteArrayOutputStream bos = new ByteArrayOutputStream();
         private ServletOutputStream sos = new ServletOutputStream() {
@@ -257,54 +258,58 @@
         private boolean isStreamUsed;
         private int status = 200;
         private String charEncoding;
-        
+
         public ImportResponseWrapper(HttpServletResponse arg0) {
             super(arg0);
             // TODO Auto-generated constructor stub
         }
-        
+
         public PrintWriter getWriter() {
             if (isStreamUsed)
                 throw new IllegalStateException("Unexpected internal error during &lt;import&gt: " +
-                "Target servlet called getWriter(), then getOutputStream()");
+                        "Target servlet called getWriter(), then getOutputStream()");
             isWriterUsed = true;
             return new PrintWriter(sw);
         }
-        
+
         public ServletOutputStream getOutputStream() {
             if (isWriterUsed)
                 throw new IllegalStateException("Unexpected internal error during &lt;import&gt: " +
-                "Target servlet called getOutputStream(), then getWriter()");
+                        "Target servlet called getOutputStream(), then getWriter()");
             isStreamUsed = true;
             return sos;
         }
-        
-        /** Has no effect. */
+
+        /**
+         * Has no effect.
+         */
         public void setContentType(String x) {
             // ignore
         }
-        
-        /** Has no effect. */
+
+        /**
+         * Has no effect.
+         */
         public void setLocale(Locale x) {
             // ignore
         }
-        
+
         public void setStatus(int status) {
             this.status = status;
         }
-        
+
         public int getStatus() {
             return status;
         }
-        
-        public String getCharEncoding(){
+
+        public String getCharEncoding() {
             return this.charEncoding;
         }
-        
-        public void setCharEncoding(String ce){
+
+        public void setCharEncoding(String ce) {
             this.charEncoding = ce;
         }
-        
+
         public String getString() throws UnsupportedEncodingException {
             if (isWriterUsed)
                 return sw.toString();
@@ -314,8 +319,8 @@
                 else
                     return bos.toString("ISO-8859-1");
             } else
-                return "";		// target didn't write anything
+                return "";        // target didn't write anything
         }
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Catch.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Catch.java
index e99b213..4932143 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Catch.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Catch.java
@@ -22,51 +22,51 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public class Catch implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         //flag for the existence of the var attribute
         boolean hasVar = ctxt.isAttributeSpecified("var");
-        
+
         //temp name for exception and caught
         String exceptionName = ctxt.getTemporaryVariableName();
         String caughtName = ctxt.getTemporaryVariableName();
-        
+
         //main part to generate code
         ctxt.generateJavaSource("boolean " + caughtName + " = false;");
         ctxt.generateJavaSource("try{");
         ctxt.generateBody();
         ctxt.generateJavaSource("}");
-        
+
         //do catch
         ctxt.generateJavaSource("catch(Throwable " + exceptionName + "){");
-        
+
         //if the var specified, the exception object should 
         //be set to the attribute "var" defines in page scope 
-        if(hasVar){
+        if (hasVar) {
             String strVar = ctxt.getConstantAttribute("var");
-            ctxt.generateJavaSource("    pageContext.setAttribute(\"" + strVar + "\", " 
+            ctxt.generateJavaSource("    pageContext.setAttribute(\"" + strVar + "\", "
                     + exceptionName + ", PageContext.PAGE_SCOPE);");
         }
-        
+
         //whenever there's exception caught, 
         //the flag caught should be set true;
         ctxt.generateJavaSource("    " + caughtName + " = true;");
         ctxt.generateJavaSource("}");
-        
+
         //do finally
         ctxt.generateJavaSource("finally{");
-        
+
         //if var specified, the attribute it defines 
         //in page scope should be removed
-        if(hasVar){
+        if (hasVar) {
             String strVar = ctxt.getConstantAttribute("var");
             ctxt.generateJavaSource("    if(!" + caughtName + "){");
             ctxt.generateJavaSource("        pageContext.removeAttribute(\"" + strVar + "\", PageContext.PAGE_SCOPE);");
             ctxt.generateJavaSource("    }");
         }
-        
+
         ctxt.generateJavaSource("}");
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Choose.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Choose.java
index 786edd1..223afa6 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Choose.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Choose.java
@@ -22,12 +22,12 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public final class Choose implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         // Not much to do here, much of the work will be done in the
         // containing tags, <c:when> and <c:otherwise>.
-        
+
         ctxt.generateBody();
         // See comments in When.java for the reason "}" is generated here.
         ctxt.generateJavaSource("}");
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForEach.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForEach.java
index e03a68e..613dfc7 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForEach.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForEach.java
@@ -22,30 +22,30 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public final class ForEach implements TagPlugin {
-    
+
     private boolean hasVar, hasBegin, hasEnd, hasStep;
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         String index = null;
-        
+
         boolean hasVarStatus = ctxt.isAttributeSpecified("varStatus");
         if (hasVarStatus) {
             ctxt.dontUseTagPlugin();
             return;
         }
-        
+
         hasVar = ctxt.isAttributeSpecified("var");
         hasBegin = ctxt.isAttributeSpecified("begin");
         hasEnd = ctxt.isAttributeSpecified("end");
         hasStep = ctxt.isAttributeSpecified("step");
-        
+
         boolean hasItems = ctxt.isAttributeSpecified("items");
         if (hasItems) {
             doCollection(ctxt);
             return;
         }
-        
+
         // We must have a begin and end attributes
         index = ctxt.getTemporaryVariableName();
         ctxt.generateJavaSource("for (int " + index + " = ");
@@ -56,11 +56,10 @@
             ctxt.generateJavaSource("; " + index + "+=");
             ctxt.generateAttribute("step");
             ctxt.generateJavaSource(") {");
-        }
-        else {
+        } else {
             ctxt.generateJavaSource("; " + index + "++) {");
         }
-        
+
         // If var is specified and the body contains an EL, then sycn
         // the var attribute
         if (hasVar /* && ctxt.hasEL() */) {
@@ -71,22 +70,22 @@
         ctxt.generateBody();
         ctxt.generateJavaSource("}");
     }
-    
+
     /**
      * Generate codes for Collections
      * The pseudo code is:
      */
     private void doCollection(TagPluginContext ctxt) {
-        
+
         ctxt.generateImport("java.util.*");
         generateIterators(ctxt);
-        
+
         String itemsV = ctxt.getTemporaryVariableName();
         ctxt.generateJavaSource("Object " + itemsV + "= ");
         ctxt.generateAttribute("items");
         ctxt.generateJavaSource(";");
-        
-        String indexV=null, beginV=null, endV=null, stepV=null;
+
+        String indexV = null, beginV = null, endV = null, stepV = null;
         if (hasBegin) {
             beginV = ctxt.getTemporaryVariableName();
             ctxt.generateJavaSource("int " + beginV + " = ");
@@ -107,7 +106,7 @@
             ctxt.generateAttribute("step");
             ctxt.generateJavaSource(";");
         }
-        
+
         String iterV = ctxt.getTemporaryVariableName();
         ctxt.generateJavaSource("Iterator " + iterV + " = null;");
         // Object[]
@@ -137,23 +136,23 @@
         // double[]
         ctxt.generateJavaSource("else if (" + itemsV + " instanceof double[])");
         ctxt.generateJavaSource(iterV + "=toIterator((double[])" + itemsV + ");");
-        
+
         // Collection
         ctxt.generateJavaSource("else if (" + itemsV + " instanceof Collection)");
         ctxt.generateJavaSource(iterV + "=((Collection)" + itemsV + ").iterator();");
-        
+
         // Iterator
         ctxt.generateJavaSource("else if (" + itemsV + " instanceof Iterator)");
         ctxt.generateJavaSource(iterV + "=(Iterator)" + itemsV + ";");
-        
+
         // Enumeration
         ctxt.generateJavaSource("else if (" + itemsV + " instanceof Enumeration)");
         ctxt.generateJavaSource(iterV + "=toIterator((Enumeration)" + itemsV + ");");
-        
+
         // Map
         ctxt.generateJavaSource("else if (" + itemsV + " instanceof Map)");
         ctxt.generateJavaSource(iterV + "=((Map)" + itemsV + ").entrySet().iterator();");
-        
+
         if (hasBegin) {
             String tV = ctxt.getTemporaryVariableName();
             ctxt.generateJavaSource("for (int " + tV + "=" + beginV + ";" +
@@ -161,16 +160,16 @@
                     tV + "--)");
             ctxt.generateJavaSource(iterV + ".next();");
         }
-        
+
         ctxt.generateJavaSource("while (" + iterV + ".hasNext()){");
         if (hasVar) {
             ctxt.generateJavaSource("_jspx_page_context.setAttribute(");
             ctxt.generateAttribute("var");
             ctxt.generateJavaSource(", " + iterV + ".next());");
         }
-        
+
         ctxt.generateBody();
-        
+
         if (hasStep) {
             String tV = ctxt.getTemporaryVariableName();
             ctxt.generateJavaSource("for (int " + tV + "=" + stepV + "-1;" +
@@ -181,165 +180,163 @@
         if (hasEnd) {
             if (hasStep) {
                 ctxt.generateJavaSource(indexV + "+=" + stepV + ";");
-            }
-            else {
+            } else {
                 ctxt.generateJavaSource(indexV + "++;");
             }
             if (hasBegin) {
                 ctxt.generateJavaSource("if(" + beginV + "+" + indexV +
-                        ">"+ endV + ")");
-            }
-            else {
+                        ">" + endV + ")");
+            } else {
                 ctxt.generateJavaSource("if(" + indexV + ">" + endV + ")");
             }
             ctxt.generateJavaSource("break;");
         }
-        ctxt.generateJavaSource("}");	// while
+        ctxt.generateJavaSource("}");    // while
     }
-    
+
     /**
      * Generate iterators for data types supported in items
      */
     private void generateIterators(TagPluginContext ctxt) {
-        
+
         // Object[]
-        ctxt.generateDeclaration("ObjectArrayIterator", 
+        ctxt.generateDeclaration("ObjectArrayIterator",
                 "private Iterator toIterator(final Object[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return a[index++];}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return a[index++];}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // boolean[]
-        ctxt.generateDeclaration("booleanArrayIterator", 
+        ctxt.generateDeclaration("booleanArrayIterator",
                 "private Iterator toIterator(final boolean[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Boolean(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Boolean(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // byte[]
-        ctxt.generateDeclaration("byteArrayIterator", 
+        ctxt.generateDeclaration("byteArrayIterator",
                 "private Iterator toIterator(final byte[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Byte(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Byte(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // char[]
-        ctxt.generateDeclaration("charArrayIterator", 
+        ctxt.generateDeclaration("charArrayIterator",
                 "private Iterator toIterator(final char[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Character(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Character(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // short[]
-        ctxt.generateDeclaration("shortArrayIterator", 
+        ctxt.generateDeclaration("shortArrayIterator",
                 "private Iterator toIterator(final short[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Short(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Short(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // int[]
-        ctxt.generateDeclaration("intArrayIterator", 
+        ctxt.generateDeclaration("intArrayIterator",
                 "private Iterator toIterator(final int[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Integer(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Integer(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // long[]
-        ctxt.generateDeclaration("longArrayIterator", 
+        ctxt.generateDeclaration("longArrayIterator",
                 "private Iterator toIterator(final long[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Long(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Long(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // float[]
         ctxt.generateDeclaration("floatArrayIterator",
                 "private Iterator toIterator(final float[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Float(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Float(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // double[]
         ctxt.generateDeclaration("doubleArrayIterator",
                 "private Iterator toIterator(final double[] a){\n" +
-                "  return (new Iterator() {\n" +
-                "    int index=0;\n" +
-                "    public boolean hasNext() {\n" +
-                "      return index < a.length;}\n" +
-                "    public Object next() {\n" +
-                "      return new Double(a[index++]);}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    int index=0;\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return index < a.length;}\n" +
+                        "    public Object next() {\n" +
+                        "      return new Double(a[index++]);}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
         // Enumeration
         ctxt.generateDeclaration("enumIterator",
                 "private Iterator toIterator(final Enumeration e){\n" +
-                "  return (new Iterator() {\n" +
-                "    public boolean hasNext() {\n" +
-                "      return e.hasMoreElements();}\n" +
-                "    public Object next() {\n" +
-                "      return e.nextElement();}\n" +
-                "    public void remove() {}\n" +
-                "  });\n" +
-                "}"
+                        "  return (new Iterator() {\n" +
+                        "    public boolean hasNext() {\n" +
+                        "      return e.hasMoreElements();}\n" +
+                        "    public Object next() {\n" +
+                        "      return e.nextElement();}\n" +
+                        "    public void remove() {}\n" +
+                        "  });\n" +
+                        "}"
         );
-        
+
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForTokens.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForTokens.java
index fc0ba94..ced5920 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForTokens.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/ForTokens.java
@@ -22,64 +22,64 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public class ForTokens implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
         boolean hasVar, hasVarStatus, hasBegin, hasEnd, hasStep;
-        
+
         //init the flags
         hasVar = ctxt.isAttributeSpecified("var");
         hasVarStatus = ctxt.isAttributeSpecified("varStatus");
         hasBegin = ctxt.isAttributeSpecified("begin");
         hasEnd = ctxt.isAttributeSpecified("end");
         hasStep = ctxt.isAttributeSpecified("step");
-        
-        if(hasVarStatus){
+
+        if (hasVarStatus) {
             ctxt.dontUseTagPlugin();
             return;
         }
-        
+
         //define all the temp variables' names
         String itemsName = ctxt.getTemporaryVariableName();
         String delimsName = ctxt.getTemporaryVariableName();
         String stName = ctxt.getTemporaryVariableName();
         String beginName = ctxt.getTemporaryVariableName();
-        String endName  = ctxt.getTemporaryVariableName();
+        String endName = ctxt.getTemporaryVariableName();
         String stepName = ctxt.getTemporaryVariableName();
         String index = ctxt.getTemporaryVariableName();
-        String temp  = ctxt.getTemporaryVariableName();
+        String temp = ctxt.getTemporaryVariableName();
         String tokensCountName = ctxt.getTemporaryVariableName();
-        
+
         //get the value of the "items" attribute 
         ctxt.generateJavaSource("String " + itemsName + " = (String)");
         ctxt.generateAttribute("items");
         ctxt.generateJavaSource(";");
-        
+
         //get the value of the "delim" attribute
         ctxt.generateJavaSource("String " + delimsName + " = (String)");
         ctxt.generateAttribute("delims");
         ctxt.generateJavaSource(";");
-        
+
         //new a StringTokenizer Object according to the "items" and the "delim"
         ctxt.generateJavaSource("java.util.StringTokenizer " + stName + " = " +
                 "new java.util.StringTokenizer(" + itemsName + ", " + delimsName + ");");
-        
+
         //if "begin" specified, move the token to the "begin" place
         //and record the begin index. default begin place is 0.
         ctxt.generateJavaSource("int " + tokensCountName + " = " + stName + ".countTokens();");
-        if(hasBegin){
-            ctxt.generateJavaSource("int " + beginName + " = "  );
+        if (hasBegin) {
+            ctxt.generateJavaSource("int " + beginName + " = ");
             ctxt.generateAttribute("begin");
             ctxt.generateJavaSource(";");
             ctxt.generateJavaSource("for(int " + index + " = 0; " + index + " < " + beginName + " && " + stName + ".hasMoreTokens(); " + index + "++, " + stName + ".nextToken()){}");
-        }else{
+        } else {
             ctxt.generateJavaSource("int " + beginName + " = 0;");
         }
-        
+
         //when "end" is specified, if the "end" is more than the last index,
         //record the end place as the last index, otherwise, record it as "end";
         //default end place is the last index 
-        if(hasEnd){
-            ctxt.generateJavaSource("int " + endName + " = 0;"  );
+        if (hasEnd) {
+            ctxt.generateJavaSource("int " + endName + " = 0;");
             ctxt.generateJavaSource("if((" + tokensCountName + " - 1) < ");
             ctxt.generateAttribute("end");
             ctxt.generateJavaSource("){");
@@ -88,26 +88,26 @@
             ctxt.generateJavaSource("    " + endName + " = ");
             ctxt.generateAttribute("end");
             ctxt.generateJavaSource(";}");
-        }else{
+        } else {
             ctxt.generateJavaSource("int " + endName + " = " + tokensCountName + " - 1;");
         }
-        
+
         //get the step value from "step" if specified.
         //default step value is 1.
-        if(hasStep){
-            ctxt.generateJavaSource("int " + stepName + " = "  );
+        if (hasStep) {
+            ctxt.generateJavaSource("int " + stepName + " = ");
             ctxt.generateAttribute("step");
             ctxt.generateJavaSource(";");
-        }else{
+        } else {
             ctxt.generateJavaSource("int " + stepName + " = 1;");
         }
-        
+
         //the loop
         ctxt.generateJavaSource("for(int " + index + " = " + beginName + "; " + index + " <= " + endName + "; " + index + "++){");
         ctxt.generateJavaSource("    String " + temp + " = " + stName + ".nextToken();");
         ctxt.generateJavaSource("    if(((" + index + " - " + beginName + ") % " + stepName + ") == 0){");
         //if var specified, put the current token into the attribute "var" defines.
-        if(hasVar){
+        if (hasVar) {
             String strVar = ctxt.getConstantAttribute("var");
             ctxt.generateJavaSource("        pageContext.setAttribute(\"" + strVar + "\", " + temp + ");");
         }
@@ -115,5 +115,5 @@
         ctxt.generateJavaSource("    }");
         ctxt.generateJavaSource("}");
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/If.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/If.java
index 3955775..e84ee6b 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/If.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/If.java
@@ -22,7 +22,7 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public final class If implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
         String condV = ctxt.getTemporaryVariableName();
         ctxt.generateJavaSource("boolean " + condV + "=");
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Import.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Import.java
index 9499b03..ce5492a 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Import.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Import.java
@@ -23,24 +23,24 @@
 import org.apache.struts2.jasper.tagplugins.jstl.Util;
 
 public class Import implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
         boolean hasContext, hasVar, hasScope, hasVarReader, hasCharEncoding;
-        
+
         //flags
-        hasContext  = ctxt.isAttributeSpecified("context");
+        hasContext = ctxt.isAttributeSpecified("context");
         hasVar = ctxt.isAttributeSpecified("var");
         hasScope = ctxt.isAttributeSpecified("scope");
         hasVarReader = ctxt.isAttributeSpecified("varReader");
         hasCharEncoding = ctxt.isAttributeSpecified("charEncoding");
-        
+
         //variables' names
-        String urlName = ctxt.getTemporaryVariableName();           
-        String contextName = ctxt.getTemporaryVariableName();       
+        String urlName = ctxt.getTemporaryVariableName();
+        String contextName = ctxt.getTemporaryVariableName();
         String iauName = ctxt.getTemporaryVariableName();           // is absolute url
         String urlObjName = ctxt.getTemporaryVariableName();        //URL object
         String ucName = ctxt.getTemporaryVariableName();            //URLConnection
-        String inputStreamName = ctxt.getTemporaryVariableName();   
+        String inputStreamName = ctxt.getTemporaryVariableName();
         String tempReaderName = ctxt.getTemporaryVariableName();
         String tempReaderName2 = ctxt.getTemporaryVariableName();
         String charSetName = ctxt.getTemporaryVariableName();
@@ -54,115 +54,115 @@
         String brName = ctxt.getTemporaryVariableName();            //BufferedReader name
         String sbName = ctxt.getTemporaryVariableName();            //StringBuffer name
         String tempStringName = ctxt.getTemporaryVariableName();
-        
+
         //is absolute url
         ctxt.generateJavaSource("boolean " + iauName + ";");
-        
+
         //get the url value
         ctxt.generateJavaSource("String " + urlName + " = ");
         ctxt.generateAttribute("url");
         ctxt.generateJavaSource(";");
-        
+
         //validate the url
         ctxt.generateJavaSource("if(" + urlName + " == null || " + urlName + ".equals(\"\")){");
         ctxt.generateJavaSource("    throw new JspTagException(\"The \\\"url\\\" attribute " +
-        "illegally evaluated to \\\"null\\\" or \\\"\\\" in &lt;import&gt;\");");
+                "illegally evaluated to \\\"null\\\" or \\\"\\\" in &lt;import&gt;\");");
         ctxt.generateJavaSource("}");
-        
+
         //initialize the is_absolute_url
         ctxt.generateJavaSource(iauName + " = " +
                 "org.apache.struts2.jasper.tagplugins.jstl.Util.isAbsoluteUrl(" + urlName + ");");
-        
+
         //validate the context
-        if(hasContext){
-            
+        if (hasContext) {
+
             ctxt.generateJavaSource("String " + contextName + " = ");
             ctxt.generateAttribute("context");
             ctxt.generateJavaSource(";");
-            
+
             ctxt.generateJavaSource("if((!" + contextName + ".startsWith(\"/\")) " +
                     "|| (!" + urlName + ".startsWith(\"/\"))){");
             ctxt.generateJavaSource("    throw new JspTagException" +
                     "(\"In URL tags, when the \\\"context\\\" attribute is specified, " +
-            "values of both \\\"context\\\" and \\\"url\\\" must start with \\\"/\\\".\");");
+                    "values of both \\\"context\\\" and \\\"url\\\" must start with \\\"/\\\".\");");
             ctxt.generateJavaSource("}");
-            
+
         }
-        
+
         //define charset
         ctxt.generateJavaSource("String " + charSetName + " = null;");
-        
+
         //if the charEncoding attribute is specified
-        if(hasCharEncoding){
-            
+        if (hasCharEncoding) {
+
             //initialize the charEncoding
             ctxt.generateJavaSource("String " + charEncodingName + " = ");
             ctxt.generateAttribute("charEncoding");
             ctxt.generateJavaSource(";");
-            
+
             //assign appropriate value tp the charset
             ctxt.generateJavaSource("if(null != " + charEncodingName + " " +
                     "&& !" + charEncodingName + ".equals(\"\")){");
-            ctxt.generateJavaSource("    " + charSetName + " = " 
+            ctxt.generateJavaSource("    " + charSetName + " = "
                     + charEncodingName + ";");
             ctxt.generateJavaSource("}");
         }
-        
+
         //reshape the url string
-        ctxt.generateJavaSource("if(!"+iauName+"){");
+        ctxt.generateJavaSource("if(!" + iauName + "){");
         ctxt.generateJavaSource("    if(!" + urlName + ".startsWith(\"/\")){");
         ctxt.generateJavaSource("        String " + servletPathName + " = " +
-        "((HttpServletRequest)pageContext.getRequest()).getServletPath();");
-        ctxt.generateJavaSource("        " + urlName + " = " 
+                "((HttpServletRequest)pageContext.getRequest()).getServletPath();");
+        ctxt.generateJavaSource("        " + urlName + " = "
                 + servletPathName + ".substring(0," + servletPathName + ".lastIndexOf('/')) + '/' + " + urlName + ";");
         ctxt.generateJavaSource("    }");
         ctxt.generateJavaSource("}");
-        
+
         //if the varReader attribute specified
-        if(hasVarReader){
-            
+        if (hasVarReader) {
+
             //get the String value of varReader
             ctxt.generateJavaSource("String " + varReaderName + " = ");
             ctxt.generateAttribute("varReader");
             ctxt.generateJavaSource(";");
-            
+
             //if the url is absolute url
             ctxt.generateJavaSource("if(" + iauName + "){");
-            
+
             //get the content of the target
             ctxt.generateJavaSource("    java.net.URL " + urlObjName + " = new java.net.URL(" + urlName + ");");
-            ctxt.generateJavaSource("    java.net.URLConnection " + ucName + " = " 
+            ctxt.generateJavaSource("    java.net.URLConnection " + ucName + " = "
                     + urlObjName + ".openConnection();");
-            ctxt.generateJavaSource("    java.io.InputStream " + inputStreamName + " = " 
+            ctxt.generateJavaSource("    java.io.InputStream " + inputStreamName + " = "
                     + ucName + ".getInputStream();");
-            
+
             ctxt.generateJavaSource("    if(" + charSetName + " == null){");
-            ctxt.generateJavaSource("        String " + contentTypeName + " = " 
+            ctxt.generateJavaSource("        String " + contentTypeName + " = "
                     + ucName + ".getContentType();");
             ctxt.generateJavaSource("        if(null != " + contentTypeName + "){");
             ctxt.generateJavaSource("            " + charSetName + " = " +
                     "org.apache.struts2.jasper.tagplugins.jstl.Util.getContentTypeAttribute(" + contentTypeName + ", \"charset\");");
-            ctxt.generateJavaSource("            if(" + charSetName + " == null) " 
+            ctxt.generateJavaSource("            if(" + charSetName + " == null) "
                     + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
             ctxt.generateJavaSource("        }else{");
             ctxt.generateJavaSource("            " + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
             ctxt.generateJavaSource("        }");
             ctxt.generateJavaSource("    }");
-            
-            if(!hasCharEncoding){
+
+            if (!hasCharEncoding) {
                 ctxt.generateJavaSource("    String " + contentTypeName + " = " + ucName + ".getContentType();");
             }
-            
+
             //define the Reader
             ctxt.generateJavaSource("    java.io.Reader " + tempReaderName + " = null;");
-            
+
             //initialize the Reader object
             ctxt.generateJavaSource("    try{");
             ctxt.generateJavaSource("        " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + ", " + charSetName + ");");
             ctxt.generateJavaSource("    }catch(Exception ex){");
             ctxt.generateJavaSource("        " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + ", org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING);");
             ctxt.generateJavaSource("    }");
-            
+
             //validate the response
             ctxt.generateJavaSource("    if(" + ucName + " instanceof java.net.HttpURLConnection){");
             ctxt.generateJavaSource("        int status = ((java.net.HttpURLConnection) " + ucName + ").getResponseCode();");
@@ -170,44 +170,44 @@
             ctxt.generateJavaSource("            throw new JspTagException(status + \" \" + " + urlName + ");");
             ctxt.generateJavaSource("        }");
             ctxt.generateJavaSource("    }");
-            
+
             //set attribute in the page context scope
             ctxt.generateJavaSource("    pageContext.setAttribute(" + varReaderName + ", " + tempReaderName + ");");
-            
+
             //if the url is relative
             ctxt.generateJavaSource("}else{");
-            
+
             //if the url is relative, http request is needed
             ctxt.generateJavaSource("    if (!(pageContext.getRequest() instanceof HttpServletRequest  " +
-            "&& pageContext.getResponse() instanceof HttpServletResponse)){");
+                    "&& pageContext.getResponse() instanceof HttpServletResponse)){");
             ctxt.generateJavaSource("        throw new JspTagException(\"Relative &lt;import&gt; from non-HTTP request not allowed\");");
             ctxt.generateJavaSource("    }");
-            
+
             //get the servlet context of the context defined in the context attribute
             ctxt.generateJavaSource("    ServletContext " + servletContextName + " = null;");
-            if(hasContext){
+            if (hasContext) {
                 ctxt.generateJavaSource("    if(null != " + contextName + "){");
-                ctxt.generateJavaSource("        " + servletContextName + " = pageContext.getServletContext().getContext(" + contextName + ");" );
+                ctxt.generateJavaSource("        " + servletContextName + " = pageContext.getServletContext().getContext(" + contextName + ");");
                 ctxt.generateJavaSource("    }else{");
                 ctxt.generateJavaSource("        " + servletContextName + " = pageContext.getServletContext();");
                 ctxt.generateJavaSource("    }");
-            }else{
+            } else {
                 ctxt.generateJavaSource("    " + servletContextName + " = pageContext.getServletContext();");
             }
-            
+
             //
             ctxt.generateJavaSource("    if(" + servletContextName + " == null){");
-            if(hasContext){
+            if (hasContext) {
                 ctxt.generateJavaSource("        throw new JspTagException(\"Unable to get RequestDispatcher for Context: \\\" \"+" + contextName + "+\" \\\" and URL: \\\" \" +" + urlName + "+ \" \\\". Verify values and/or enable cross context access.\");");
-            }else{
+            } else {
                 ctxt.generateJavaSource("        throw new JspTagException(\"Unable to get RequestDispatcher for  URL: \\\" \" +" + urlName + "+ \" \\\". Verify values and/or enable cross context access.\");");
             }
             ctxt.generateJavaSource("    }");
-            
+
             //get the request dispatcher
-            ctxt.generateJavaSource("    RequestDispatcher " + requestDispatcherName + " = " + servletContextName + ".getRequestDispatcher(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession("+urlName+"));");
-            ctxt.generateJavaSource("    if(" + requestDispatcherName + " == null) throw new JspTagException(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession("+urlName+"));");
-            
+            ctxt.generateJavaSource("    RequestDispatcher " + requestDispatcherName + " = " + servletContextName + ".getRequestDispatcher(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
+            ctxt.generateJavaSource("    if(" + requestDispatcherName + " == null) throw new JspTagException(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
+
             //initialize a ImportResponseWrapper to include the resource
             ctxt.generateJavaSource("    org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper " + irwName + " = new org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper((HttpServletResponse) pageContext.getResponse());");
             ctxt.generateJavaSource("    if(" + charSetName + " == null){");
@@ -227,70 +227,70 @@
             ctxt.generateJavaSource("        else");
             ctxt.generateJavaSource("            throw new JspException(rc);");
             ctxt.generateJavaSource("    }");
-            
+
             //validate the response status
             ctxt.generateJavaSource("    if(" + irwName + ".getStatus() < 200 || " + irwName + ".getStatus() > 299){");
             ctxt.generateJavaSource("        throw new JspTagException(" + irwName + ".getStatus()+\" \" + org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
             ctxt.generateJavaSource("    }");
-            
+
             //push in the page context
             ctxt.generateJavaSource("    java.io.Reader " + tempReaderName + " = new java.io.StringReader(" + irwName + ".getString());");
             ctxt.generateJavaSource("    pageContext.setAttribute(" + varReaderName + ", " + tempReaderName + ");");
-            
+
             ctxt.generateJavaSource("}");
-            
+
             //execute the body action
             ctxt.generateBody();
-            
+
             //close the reader
             ctxt.generateJavaSource("java.io.Reader " + tempReaderName2 + " = (java.io.Reader)pageContext.getAttribute(" + varReaderName + ");");
             ctxt.generateJavaSource("if(" + tempReaderName2 + " != null) " + tempReaderName2 + ".close();");
             ctxt.generateJavaSource("pageContext.removeAttribute(" + varReaderName + ",1);");
         }
-        
+
         //if the varReader is not specified 
-        else{
-            
+        else {
+
             ctxt.generateJavaSource("pageContext.setAttribute(\"url_without_param\"," + urlName + ");");
             ctxt.generateBody();
             ctxt.generateJavaSource(urlName + " = (String)pageContext.getAttribute(\"url_without_param\");");
             ctxt.generateJavaSource("pageContext.removeAttribute(\"url_without_param\");");
             String strScope = "page";
-            if(hasScope){
+            if (hasScope) {
                 strScope = ctxt.getConstantAttribute("scope");
             }
             int iScope = Util.getScope(strScope);
-            
+
             ctxt.generateJavaSource("String " + tempStringName + " = null;");
-            
+
             ctxt.generateJavaSource("if(" + iauName + "){");
-            
+
             //get the content of the target
             ctxt.generateJavaSource("    java.net.URL " + urlObjName + " = new java.net.URL(" + urlName + ");");
             ctxt.generateJavaSource("    java.net.URLConnection " + ucName + " = " + urlObjName + ".openConnection();");
             ctxt.generateJavaSource("    java.io.InputStream " + inputStreamName + " = " + ucName + ".getInputStream();");
             ctxt.generateJavaSource("    java.io.Reader " + tempReaderName + " = null;");
-            
+
             ctxt.generateJavaSource("    if(" + charSetName + " == null){");
-            ctxt.generateJavaSource("        String " + contentTypeName + " = " 
+            ctxt.generateJavaSource("        String " + contentTypeName + " = "
                     + ucName + ".getContentType();");
             ctxt.generateJavaSource("        if(null != " + contentTypeName + "){");
             ctxt.generateJavaSource("            " + charSetName + " = " +
                     "org.apache.struts2.jasper.tagplugins.jstl.Util.getContentTypeAttribute(" + contentTypeName + ", \"charset\");");
-            ctxt.generateJavaSource("            if(" + charSetName + " == null) " 
+            ctxt.generateJavaSource("            if(" + charSetName + " == null) "
                     + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
             ctxt.generateJavaSource("        }else{");
             ctxt.generateJavaSource("            " + charSetName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING;");
             ctxt.generateJavaSource("        }");
             ctxt.generateJavaSource("    }");
-            
+
             ctxt.generateJavaSource("    try{");
             ctxt.generateJavaSource("        " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + "," + charSetName + ");");
             ctxt.generateJavaSource("    }catch(Exception ex){");
             //ctxt.generateJavaSource("        throw new JspTagException(ex.toString());");
             ctxt.generateJavaSource("        " + tempReaderName + " = new java.io.InputStreamReader(" + inputStreamName + ",org.apache.struts2.jasper.tagplugins.jstl.Util.DEFAULT_ENCODING);");
             ctxt.generateJavaSource("    }");
-            
+
             //validate the response
             ctxt.generateJavaSource("    if(" + ucName + " instanceof java.net.HttpURLConnection){");
             ctxt.generateJavaSource("        int status = ((java.net.HttpURLConnection) " + ucName + ").getResponseCode();");
@@ -298,47 +298,47 @@
             ctxt.generateJavaSource("            throw new JspTagException(status + \" \" + " + urlName + ");");
             ctxt.generateJavaSource("        }");
             ctxt.generateJavaSource("    }");
-            
+
             ctxt.generateJavaSource("    java.io.BufferedReader " + brName + " =  new java.io.BufferedReader(" + tempReaderName + ");");
             ctxt.generateJavaSource("    StringBuffer " + sbName + " = new StringBuffer();");
             String index = ctxt.getTemporaryVariableName();
             ctxt.generateJavaSource("    int " + index + ";");
-            ctxt.generateJavaSource("    while(("+index+" = "+brName+".read()) != -1) "+sbName+".append((char)"+index+");");
-            ctxt.generateJavaSource("    " + tempStringName + " = " +sbName + ".toString();");
-            
+            ctxt.generateJavaSource("    while((" + index + " = " + brName + ".read()) != -1) " + sbName + ".append((char)" + index + ");");
+            ctxt.generateJavaSource("    " + tempStringName + " = " + sbName + ".toString();");
+
             ctxt.generateJavaSource("}else{");
-            
+
             //if the url is relative, http request is needed.
             ctxt.generateJavaSource("    if (!(pageContext.getRequest() instanceof HttpServletRequest  " +
-            "&& pageContext.getResponse() instanceof HttpServletResponse)){");
+                    "&& pageContext.getResponse() instanceof HttpServletResponse)){");
             ctxt.generateJavaSource("        throw new JspTagException(\"Relative &lt;import&gt; from non-HTTP request not allowed\");");
             ctxt.generateJavaSource("    }");
-            
+
             //get the servlet context of the context defined in the context attribute
             ctxt.generateJavaSource("    ServletContext " + servletContextName + " = null;");
-            if(hasContext){
+            if (hasContext) {
                 ctxt.generateJavaSource("    if(null != " + contextName + "){");
-                ctxt.generateJavaSource("        " + servletContextName + " = pageContext.getServletContext().getContext(" + contextName + ");" );
+                ctxt.generateJavaSource("        " + servletContextName + " = pageContext.getServletContext().getContext(" + contextName + ");");
                 ctxt.generateJavaSource("    }else{");
                 ctxt.generateJavaSource("        " + servletContextName + " = pageContext.getServletContext();");
                 ctxt.generateJavaSource("    }");
-            }else{
+            } else {
                 ctxt.generateJavaSource("    " + servletContextName + " = pageContext.getServletContext();");
             }
-            
+
             //
             ctxt.generateJavaSource("    if(" + servletContextName + " == null){");
-            if(hasContext){
+            if (hasContext) {
                 ctxt.generateJavaSource("        throw new JspTagException(\"Unable to get RequestDispatcher for Context: \\\" \" +" + contextName + "+ \" \\\" and URL: \\\" \" +" + urlName + "+ \" \\\". Verify values and/or enable cross context access.\");");
-            }else{
+            } else {
                 ctxt.generateJavaSource("        throw new JspTagException(\"Unable to get RequestDispatcher for URL: \\\" \" +" + urlName + "+ \" \\\". Verify values and/or enable cross context access.\");");
             }
             ctxt.generateJavaSource("    }");
-            
+
             //get the request dispatcher
-            ctxt.generateJavaSource("    RequestDispatcher " + requestDispatcherName + " = " + servletContextName + ".getRequestDispatcher(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession("+urlName+"));");
-            ctxt.generateJavaSource("    if(" + requestDispatcherName + " == null) throw new JspTagException(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession("+urlName+"));");
-            
+            ctxt.generateJavaSource("    RequestDispatcher " + requestDispatcherName + " = " + servletContextName + ".getRequestDispatcher(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
+            ctxt.generateJavaSource("    if(" + requestDispatcherName + " == null) throw new JspTagException(org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
+
             //initialize a ImportResponseWrapper to include the resource
             ctxt.generateJavaSource("    org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper " + irwName + " = new org.apache.struts2.jasper.tagplugins.jstl.Util.ImportResponseWrapper((HttpServletResponse) pageContext.getResponse());");
             ctxt.generateJavaSource("    if(" + charSetName + " == null){");
@@ -358,25 +358,24 @@
             ctxt.generateJavaSource("        else");
             ctxt.generateJavaSource("            throw new JspException(rc);");
             ctxt.generateJavaSource("    }");
-            
+
             //validate the response status
             ctxt.generateJavaSource("    if(" + irwName + ".getStatus() < 200 || " + irwName + ".getStatus() > 299){");
             ctxt.generateJavaSource("        throw new JspTagException(" + irwName + ".getStatus()+\" \" + org.apache.struts2.jasper.tagplugins.jstl.Util.stripSession(" + urlName + "));");
             ctxt.generateJavaSource("    }");
-            
+
             ctxt.generateJavaSource("    " + tempStringName + " = " + irwName + ".getString();");
-            
+
             ctxt.generateJavaSource("}");
-            
-            if(hasVar){
+
+            if (hasVar) {
                 String strVar = ctxt.getConstantAttribute("var");
-                ctxt.generateJavaSource("pageContext.setAttribute(\""+strVar+"\"," + tempStringName + "," + iScope + ");");
-            }else{
+                ctxt.generateJavaSource("pageContext.setAttribute(\"" + strVar + "\"," + tempStringName + "," + iScope + ");");
+            } else {
                 ctxt.generateJavaSource("pageContext.getOut().print(" + tempStringName + ");");
             }
         }
     }
-    
-    
-    
+
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Otherwise.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Otherwise.java
index 0d51e08..acf133e 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Otherwise.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Otherwise.java
@@ -22,9 +22,9 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public final class Otherwise implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         // See When.java for the reason whey "}" is need at the beginng and
         // not at the end.
         ctxt.generateJavaSource("} else {");
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Out.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Out.java
index 96e8259..4fe4429 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Out.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Out.java
@@ -23,21 +23,21 @@
 
 
 public final class Out implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         //these two data member are to indicate 
         //whether the corresponding attribute is specified
-        boolean hasDefault=false, hasEscapeXml=false;
+        boolean hasDefault = false, hasEscapeXml = false;
         hasDefault = ctxt.isAttributeSpecified("default");
         hasEscapeXml = ctxt.isAttributeSpecified("escapeXml");
-        
+
         //strValName, strEscapeXmlName & strDefName are two variables' name 
         //standing for value, escapeXml and default attribute
         String strValName = ctxt.getTemporaryVariableName();
         String strDefName = ctxt.getTemporaryVariableName();
         String strEscapeXmlName = ctxt.getTemporaryVariableName();
-        
+
         //according to the tag file, the value attribute is mandatory.
         ctxt.generateJavaSource("String " + strValName + " = null;");
         ctxt.generateJavaSource("if(");
@@ -47,11 +47,11 @@
         ctxt.generateAttribute("value");
         ctxt.generateJavaSource(").toString();");
         ctxt.generateJavaSource("}");
-        
+
         //initiate the strDefName with null.
         //if the default has been specified, then assign the value to it;
         ctxt.generateJavaSource("String " + strDefName + " = null;\n");
-        if(hasDefault){
+        if (hasDefault) {
             ctxt.generateJavaSource("if(");
             ctxt.generateAttribute("default");
             ctxt.generateJavaSource(" != null){");
@@ -60,18 +60,18 @@
             ctxt.generateJavaSource(").toString();");
             ctxt.generateJavaSource("}");
         }
-        
+
         //initiate the strEscapeXmlName with true;
         //if the escapeXml is specified, assign the value to it;
         ctxt.generateJavaSource("boolean " + strEscapeXmlName + " = true;");
-        if(hasEscapeXml){
+        if (hasEscapeXml) {
             ctxt.generateJavaSource(strEscapeXmlName + " = Boolean.parseBoolean((");
             ctxt.generateAttribute("default");
             ctxt.generateJavaSource(").toString());");
         }
-        
+
         //main part. 
-        ctxt.generateJavaSource("if(null != " + strValName +"){");
+        ctxt.generateJavaSource("if(null != " + strValName + "){");
         ctxt.generateJavaSource("    if(" + strEscapeXmlName + "){");
         ctxt.generateJavaSource("        " + strValName + " = org.apache.struts2.jasper.tagplugins.jstl.Util.escapeXml(" + strValName + ");");
         ctxt.generateJavaSource("    }");
@@ -85,6 +85,6 @@
         ctxt.generateJavaSource("    }else{");
         ctxt.generateBody();
         ctxt.generateJavaSource("    }");
-        ctxt.generateJavaSource("}");   
+        ctxt.generateJavaSource("}");
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Param.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Param.java
index 8cccd30..a7abc08 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Param.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Param.java
@@ -22,35 +22,35 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public class Param implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         //don't support the body content
-        
+
         //define names of all the temp variables
         String nameName = ctxt.getTemporaryVariableName();
         String valueName = ctxt.getTemporaryVariableName();
         String urlName = ctxt.getTemporaryVariableName();
         String encName = ctxt.getTemporaryVariableName();
         String index = ctxt.getTemporaryVariableName();
-        
+
         //if the param tag has no parents, throw a exception
         TagPluginContext parent = ctxt.getParentContext();
-        if(parent == null){
+        if (parent == null) {
             ctxt.generateJavaSource(" throw new JspTagExcption" +
-            "(\"&lt;param&gt; outside &lt;import&gt; or &lt;urlEncode&gt;\");");
+                    "(\"&lt;param&gt; outside &lt;import&gt; or &lt;urlEncode&gt;\");");
             return;
         }
-        
+
         //get the url string before adding this param
         ctxt.generateJavaSource("String " + urlName + " = " +
-        "(String)pageContext.getAttribute(\"url_without_param\");");
-        
+                "(String)pageContext.getAttribute(\"url_without_param\");");
+
         //get the value of "name"
         ctxt.generateJavaSource("String " + nameName + " = ");
         ctxt.generateAttribute("name");
         ctxt.generateJavaSource(";");
-        
+
         //if the "name" is null then do nothing.
         //else add such string "name=value" to the url.
         //and the url should be encoded
@@ -72,6 +72,6 @@
         ctxt.generateJavaSource("        " + urlName + " = " + urlName + " + \"&\" + " + nameName + " + \"=\" + " + valueName + ";");
         ctxt.generateJavaSource("    }");
         ctxt.generateJavaSource("    pageContext.setAttribute(\"url_without_param\"," + urlName + ");");
-        ctxt.generateJavaSource("}");	
+        ctxt.generateJavaSource("}");
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Redirect.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Redirect.java
index c9f9c30..24084c4 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Redirect.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Redirect.java
@@ -22,56 +22,56 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public class Redirect implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         //flag for the existence of the "context"
         boolean hasContext = ctxt.isAttributeSpecified("context");
-        
+
         //names of the temp variables
         String urlName = ctxt.getTemporaryVariableName();
         String contextName = ctxt.getTemporaryVariableName();
         String baseUrlName = ctxt.getTemporaryVariableName();
         String resultName = ctxt.getTemporaryVariableName();
         String responseName = ctxt.getTemporaryVariableName();
-        
+
         //get context
         ctxt.generateJavaSource("String " + contextName + " = null;");
-        if(hasContext){
+        if (hasContext) {
             ctxt.generateJavaSource(contextName + " = ");
             ctxt.generateAttribute("context");
             ctxt.generateJavaSource(";");
         }
-        
+
         //get the url
         ctxt.generateJavaSource("String " + urlName + " = ");
         ctxt.generateAttribute("url");
         ctxt.generateJavaSource(";");
-        
+
         //get the raw url according to "url" and "context"
         ctxt.generateJavaSource("String " + baseUrlName + " = " +
                 "org.apache.struts2.jasper.tagplugins.jstl.Util.resolveUrl(" + urlName + ", " + contextName + ", pageContext);");
         ctxt.generateJavaSource("pageContext.setAttribute" +
                 "(\"url_without_param\", " + baseUrlName + ");");
-        
+
         //add params
         ctxt.generateBody();
-        
+
         ctxt.generateJavaSource("String " + resultName + " = " +
-        "(String)pageContext.getAttribute(\"url_without_param\");");
+                "(String)pageContext.getAttribute(\"url_without_param\");");
         ctxt.generateJavaSource("pageContext.removeAttribute" +
-        "(\"url_without_param\");");
-        
+                "(\"url_without_param\");");
+
         //get the response object
         ctxt.generateJavaSource("HttpServletResponse " + responseName + " = " +
-        "((HttpServletResponse) pageContext.getResponse());");
-        
+                "((HttpServletResponse) pageContext.getResponse());");
+
         //if the url is relative, encode it
         ctxt.generateJavaSource("if(!org.apache.struts2.jasper.tagplugins.jstl.Util.isAbsoluteUrl(" + resultName + ")){");
         ctxt.generateJavaSource("    " + resultName + " = "
                 + responseName + ".encodeRedirectURL(" + resultName + ");");
         ctxt.generateJavaSource("}");
-        
+
         //do redirect
         ctxt.generateJavaSource("try{");
         ctxt.generateJavaSource("    " + responseName + ".sendRedirect(" + resultName + ");");
@@ -79,5 +79,5 @@
         ctxt.generateJavaSource("    throw new JspTagException(ex.toString(), ex);");
         ctxt.generateJavaSource("}");
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Remove.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Remove.java
index d40a0a7..f0cdec1 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Remove.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Remove.java
@@ -23,23 +23,23 @@
 import org.apache.struts2.jasper.tagplugins.jstl.Util;
 
 public class Remove implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         //scope flag
         boolean hasScope = ctxt.isAttributeSpecified("scope");
-        
+
         //the value of the "var"
         String strVar = ctxt.getConstantAttribute("var");
-        
+
         //remove attribute from certain scope.
         //default scope is "page".
-        if(hasScope){
+        if (hasScope) {
             int iScope = Util.getScope(ctxt.getConstantAttribute("scope"));
             ctxt.generateJavaSource("pageContext.removeAttribute(\"" + strVar + "\"," + iScope + ");");
-        }else{
+        } else {
             ctxt.generateJavaSource("pageContext.removeAttribute(\"" + strVar + "\");");
         }
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Set.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Set.java
index 980692f..2fe756b 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Set.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Set.java
@@ -23,72 +23,72 @@
 import org.apache.struts2.jasper.tagplugins.jstl.Util;
 
 public class Set implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         //the flags to indicate whether the attributes have been specified
-        boolean hasValue = false, hasVar = false, hasScope = false, 
-        hasTarget = false;
-        
+        boolean hasValue = false, hasVar = false, hasScope = false,
+                hasTarget = false;
+
         //the scope name
         String strScope;
         //the id of the scope
         int iScope;
-        
+
         //initialize the flags
         hasValue = ctxt.isAttributeSpecified("value");
         hasVar = ctxt.isAttributeSpecified("var");
         hasScope = ctxt.isAttributeSpecified("scope");
         hasTarget = ctxt.isAttributeSpecified("target");
-        
+
         //the temp variables name
         String resultName = ctxt.getTemporaryVariableName();
         String targetName = ctxt.getTemporaryVariableName();
         String propertyName = ctxt.getTemporaryVariableName();
-        
+
         //initialize the "result" which will be assigned to the var or target.property
         ctxt.generateJavaSource("Object " + resultName + " = null;");
-        if(hasValue){
+        if (hasValue) {
             ctxt.generateJavaSource(resultName + " = ");
             ctxt.generateAttribute("value");
             ctxt.generateJavaSource(";");
-        }else{
+        } else {
             ctxt.dontUseTagPlugin();
             return;
         }
-        
+
         //initialize the strScope
-        if(hasScope){
+        if (hasScope) {
             strScope = ctxt.getConstantAttribute("scope");
-        }else{
+        } else {
             strScope = "page";
         }
-        
+
         //get the iScope according to the strScope
         iScope = Util.getScope(strScope);
-        
+
         //if the attribute var has been specified then assign the result to the var;
-        if(hasVar){
+        if (hasVar) {
             String strVar = ctxt.getConstantAttribute("var");
             ctxt.generateJavaSource("if(null != " + resultName + "){");
             ctxt.generateJavaSource("    pageContext.setAttribute(\"" + strVar + "\"," + resultName + "," + iScope + ");");
             ctxt.generateJavaSource("} else {");
-            if(hasScope){
+            if (hasScope) {
                 ctxt.generateJavaSource("    pageContext.removeAttribute(\"" + strVar + "\"," + iScope + ");");
-            }else{
+            } else {
                 ctxt.generateJavaSource("    pageContext.removeAttribute(\"" + strVar + "\");");
             }
             ctxt.generateJavaSource("}");
-            
+
             //else assign the result to the target.property
-        }else if(hasTarget){
-            
+        } else if (hasTarget) {
+
             //generate the temp variable name
             String pdName = ctxt.getTemporaryVariableName();
             String successFlagName = ctxt.getTemporaryVariableName();
             String index = ctxt.getTemporaryVariableName();
             String methodName = ctxt.getTemporaryVariableName();
-            
+
             //initialize the property
             ctxt.generateJavaSource("String " + propertyName + " = null;");
             ctxt.generateJavaSource("if(");
@@ -98,15 +98,15 @@
             ctxt.generateAttribute("property");
             ctxt.generateJavaSource(").toString();");
             ctxt.generateJavaSource("}");
-            
+
             //initialize the target
             ctxt.generateJavaSource("Object " + targetName + " = ");
             ctxt.generateAttribute("target");
             ctxt.generateJavaSource(";");
-            
+
             //the target is ok
             ctxt.generateJavaSource("if(" + targetName + " != null){");
-            
+
             //if the target is a map, then put the result into the map with the key property
             ctxt.generateJavaSource("    if(" + targetName + " instanceof java.util.Map){");
             ctxt.generateJavaSource("        if(null != " + resultName + "){");
@@ -114,27 +114,27 @@
             ctxt.generateJavaSource("        }else{");
             ctxt.generateJavaSource("            ((java.util.Map) " + targetName + ").remove(" + propertyName + ");");
             ctxt.generateJavaSource("        }");
-            
+
             //else assign the result to the target.property
             ctxt.generateJavaSource("    }else{");
             ctxt.generateJavaSource("        try{");
-            
+
             //get all the property of the target
             ctxt.generateJavaSource("            java.beans.PropertyDescriptor " + pdName + "[] = java.beans.Introspector.getBeanInfo(" + targetName + ".getClass()).getPropertyDescriptors();");
-            
+
             //the success flag is to imply whether the assign is successful
             ctxt.generateJavaSource("            boolean " + successFlagName + " = false;");
-            
+
             //find the right property
             ctxt.generateJavaSource("            for(int " + index + "=0;" + index + "<" + pdName + ".length;" + index + "++){");
             ctxt.generateJavaSource("                if(" + pdName + "[" + index + "].getName().equals(" + propertyName + ")){");
-            
+
             //get the "set" method;
             ctxt.generateJavaSource("                    java.lang.reflect.Method " + methodName + " = " + pdName + "[" + index + "].getWriteMethod();");
             ctxt.generateJavaSource("                    if(null == " + methodName + "){");
             ctxt.generateJavaSource("                        throw new JspException(\"No setter method in &lt;set&gt; for property \"+" + propertyName + ");");
             ctxt.generateJavaSource("                    }");
-            
+
             //invoke the method through the reflection
             ctxt.generateJavaSource("                    if(" + resultName + " != null){");
             ctxt.generateJavaSource("                        " + methodName + ".invoke(" + targetName + ", new Object[]{(" + methodName + ".getParameterTypes()[0]).cast(" + resultName + ")});");
@@ -148,7 +148,7 @@
             ctxt.generateJavaSource("                throw new JspException(\"Invalid property in &lt;set&gt;:\"+" + propertyName + ");");
             ctxt.generateJavaSource("            }");
             ctxt.generateJavaSource("        }");
-            
+
             //catch the el exception and throw it as a JspException
             ctxt.generateJavaSource("        catch (IllegalAccessException ex) {");
             ctxt.generateJavaSource("            throw new JspException(ex);");
@@ -163,5 +163,5 @@
             ctxt.generateJavaSource("}");
         }
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Url.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Url.java
index f50fa49..5bc5efa 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Url.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/Url.java
@@ -23,73 +23,73 @@
 import org.apache.struts2.jasper.tagplugins.jstl.Util;
 
 public class Url implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
-        
+
         //flags
         boolean hasVar, hasContext, hasScope;
-        
+
         //init flags
         hasVar = ctxt.isAttributeSpecified("var");
         hasContext = ctxt.isAttributeSpecified("context");
         hasScope = ctxt.isAttributeSpecified("scope");
-        
+
         //define name of the temp variables
         String valueName = ctxt.getTemporaryVariableName();
         String contextName = ctxt.getTemporaryVariableName();
         String baseUrlName = ctxt.getTemporaryVariableName();
         String resultName = ctxt.getTemporaryVariableName();
         String responseName = ctxt.getTemporaryVariableName();
-        
+
         //get the scope
         String strScope = "page";
-        if(hasScope){
+        if (hasScope) {
             strScope = ctxt.getConstantAttribute("scope");
         }
         int iScope = Util.getScope(strScope);
-        
+
         //get the value
         ctxt.generateJavaSource("String " + valueName + " = ");
         ctxt.generateAttribute("value");
         ctxt.generateJavaSource(";");
-        
+
         //get the context
         ctxt.generateJavaSource("String " + contextName + " = null;");
-        if(hasContext){
+        if (hasContext) {
             ctxt.generateJavaSource(contextName + " = ");
             ctxt.generateAttribute("context");
             ctxt.generateJavaSource(";");
         }
-        
+
         //get the raw url
         ctxt.generateJavaSource("String " + baseUrlName + " = " +
                 "org.apache.struts2.jasper.tagplugins.jstl.Util.resolveUrl(" + valueName + ", " + contextName + ", pageContext);");
         ctxt.generateJavaSource("pageContext.setAttribute" +
                 "(\"url_without_param\", " + baseUrlName + ");");
-        
+
         //add params
         ctxt.generateBody();
-        
+
         ctxt.generateJavaSource("String " + resultName + " = " +
-        "(String)pageContext.getAttribute(\"url_without_param\");");
+                "(String)pageContext.getAttribute(\"url_without_param\");");
         ctxt.generateJavaSource("pageContext.removeAttribute(\"url_without_param\");");
-        
+
         //if the url is relative, encode it
         ctxt.generateJavaSource("if(!org.apache.struts2.jasper.tagplugins.jstl.Util.isAbsoluteUrl(" + resultName + ")){");
         ctxt.generateJavaSource("    HttpServletResponse " + responseName + " = " +
-        "((HttpServletResponse) pageContext.getResponse());");
+                "((HttpServletResponse) pageContext.getResponse());");
         ctxt.generateJavaSource("    " + resultName + " = "
                 + responseName + ".encodeURL(" + resultName + ");");
         ctxt.generateJavaSource("}");
-        
+
         //if "var" is specified, the url string store in the attribute var defines
-        if(hasVar){
+        if (hasVar) {
             String strVar = ctxt.getConstantAttribute("var");
             ctxt.generateJavaSource("pageContext.setAttribute" +
                     "(\"" + strVar + "\", " + resultName + ", " + iScope + ");");
-            
+
             //if var is not specified, just print out the url string
-        }else{
+        } else {
             ctxt.generateJavaSource("try{");
             ctxt.generateJavaSource("    pageContext.getOut().print(" + resultName + ");");
             ctxt.generateJavaSource("}catch(java.io.IOException ex){");
@@ -97,5 +97,5 @@
             ctxt.generateJavaSource("}");
         }
     }
-    
+
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/When.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/When.java
index d53703d..da60425 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/When.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/core/When.java
@@ -22,7 +22,7 @@
 import org.apache.struts2.jasper.compiler.tagplugin.TagPluginContext;
 
 public final class When implements TagPlugin {
-    
+
     public void doTag(TagPluginContext ctxt) {
         // Get the parent context to determine if this is the first <c:when>
         TagPluginContext parentContext = ctxt.getParentContext();
@@ -30,19 +30,18 @@
             ctxt.dontUseTagPlugin();
             return;
         }
-        
+
         if ("true".equals(parentContext.getPluginAttribute("hasBeenHere"))) {
             ctxt.generateJavaSource("} else if(");
             // See comment below for the reason we generate the extra "}" here.
-        }
-        else {
+        } else {
             ctxt.generateJavaSource("if(");
             parentContext.setPluginAttribute("hasBeenHere", "true");
         }
         ctxt.generateAttribute("test");
         ctxt.generateJavaSource("){");
         ctxt.generateBody();
-        
+
         // We don't generate the closing "}" for the "if" here because there
         // may be whitespaces in between <c:when>'s.  Instead we delay
         // generating it until the next <c:when> or <c:otherwise> or
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/tagPlugins.xml b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/tagPlugins.xml
index 0651aed..8729c47 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/tagPlugins.xml
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/tagplugins/jstl/tagPlugins.xml
@@ -16,48 +16,48 @@
   limitations under the License.
 -->
 <tag-plugins>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.If</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Choose</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.WhenTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.When</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Otherwise</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.ForEach</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-  	<tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class>
-  	<plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Out</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.SetTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Set</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.RemoveTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Remove</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Catch</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForTokensTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.ForTokens</plugin-class>
-  </tag-plugin>
-  <tag-plugin>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ImportTag</tag-class>
-    <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Import</plugin-class>
-  </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.If</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Choose</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.rt.core.WhenTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.When</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Otherwise</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.ForEach</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Out</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.rt.core.SetTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Set</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.RemoveTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Remove</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Catch</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.rt.core.ForTokensTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.ForTokens</plugin-class>
+    </tag-plugin>
+    <tag-plugin>
+        <tag-class>org.apache.taglibs.standard.tag.rt.core.ImportTag</tag-class>
+        <plugin-class>org.apache.struts2.jasper.tagplugins.jstl.core.Import</plugin-class>
+    </tag-plugin>
 </tag-plugins>
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/FastDateFormat.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/FastDateFormat.java
index 27b9c4b..7398470 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/FastDateFormat.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/FastDateFormat.java
@@ -39,13 +39,13 @@
     private long lastSec = -1;
     private StringBuffer sb = new StringBuffer();
     private FieldPosition fp = new FieldPosition(DateFormat.MILLISECOND_FIELD);
-    
+
     public FastDateFormat(DateFormat df) {
         this.df = df;
     }
 
     public Date parse(String text, ParsePosition pos) {
-	return df.parse(text, pos);
+        return df.parse(text, pos);
     }
 
     /**
@@ -54,7 +54,7 @@
      * instead if you want a msec field.
      */
     public StringBuffer format(Date date, StringBuffer toAppendTo,
-			       FieldPosition fieldPosition) {
+                               FieldPosition fieldPosition) {
         long dt = date.getTime();
         long ds = dt / 1000;
         if (ds != lastSec) {
@@ -62,52 +62,52 @@
             df.format(date, sb, fp);
             lastSec = ds;
         } else {
-	    // munge current msec into existing string
-            int ms = (int)(dt % 1000);
+            // munge current msec into existing string
+            int ms = (int) (dt % 1000);
             int pos = fp.getEndIndex();
-	    int begin = fp.getBeginIndex();
-	    if (pos > 0) {
-		if (pos > begin)
-		    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
-		ms /= 10;
-		if (pos > begin)
-		    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
-		ms /= 10;
-		if (pos > begin)
-		    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
-	    }
+            int begin = fp.getBeginIndex();
+            if (pos > 0) {
+                if (pos > begin)
+                    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
+                ms /= 10;
+                if (pos > begin)
+                    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
+                ms /= 10;
+                if (pos > begin)
+                    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
+            }
         }
-	toAppendTo.append(sb.toString());
-	return toAppendTo;
+        toAppendTo.append(sb.toString());
+        return toAppendTo;
     }
 
     public static void main(String[] args) {
-	String format = "yyyy-MM-dd HH:mm:ss.SSS";
-	if (args.length > 0)
-	    format = args[0];
+        String format = "yyyy-MM-dd HH:mm:ss.SSS";
+        if (args.length > 0)
+            format = args[0];
         SimpleDateFormat sdf = new SimpleDateFormat(format);
         FastDateFormat fdf = new FastDateFormat(sdf);
         Date d = new Date();
 
-	d.setTime(1);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(20);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(500);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(543);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(999);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(1050);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(2543);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(12345);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	d.setTime(12340);
-	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
-	
+        d.setTime(1);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(20);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(500);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(543);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(999);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(1050);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(2543);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(12345);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+        d.setTime(12340);
+        System.out.println(fdf.format(d) + "\t" + sdf.format(d));
+
         final int reps = 100000;
         {
             long start = System.currentTimeMillis();
@@ -117,7 +117,7 @@
             }
             long elap = System.currentTimeMillis() - start;
             System.out.println("fast: " + elap + " elapsed");
-	    System.out.println(fdf.format(d));
+            System.out.println(fdf.format(d));
         }
         {
             long start = System.currentTimeMillis();
@@ -125,9 +125,9 @@
                 d.setTime(System.currentTimeMillis());
                 sdf.format(d);
             }
-            long elap = System.currentTimeMillis() - start;	    
+            long elap = System.currentTimeMillis() - start;
             System.out.println("slow: " + elap + " elapsed");
-	    System.out.println(sdf.format(d));
+            System.out.println(sdf.format(d));
         }
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/Queue.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/Queue.java
index bcc3852..9c40597 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/Queue.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/Queue.java
@@ -29,61 +29,61 @@
 public class Queue {
     private Vector vector = new Vector();
 
-    /** 
+    /**
      * Put the object into the queue.
-     * 
-     * @param	object		the object to be appended to the
-     * 				queue. 
+     *
+     * @param object the object to be appended to the
+     *               queue.
      */
     public synchronized void put(Object object) {
-	vector.addElement(object);
-	notify();
+        vector.addElement(object);
+        notify();
     }
-    
+
     /**
      * Pull the first object out of the queue. Wait if the queue is
      * empty.
      */
     public synchronized Object pull() {
-	while (isEmpty())
-	    try {
-		wait();
-	    } catch (InterruptedException ex) {
-	    }
-	return get();
+        while (isEmpty())
+            try {
+                wait();
+            } catch (InterruptedException ex) {
+            }
+        return get();
     }
 
     /**
      * Get the first object out of the queue. Return null if the queue
-     * is empty. 
+     * is empty.
      */
     public synchronized Object get() {
-	Object object = peek();
-	if (object != null)
-	    vector.removeElementAt(0);
-	return object;
+        Object object = peek();
+        if (object != null)
+            vector.removeElementAt(0);
+        return object;
     }
 
     /**
      * Peek to see if something is available.
      */
     public Object peek() {
-	if (isEmpty())
-	    return null;
-	return vector.elementAt(0);
+        if (isEmpty())
+            return null;
+        return vector.elementAt(0);
     }
-    
+
     /**
      * Is the queue empty?
      */
     public boolean isEmpty() {
-	return vector.isEmpty();
+        return vector.isEmpty();
     }
 
     /**
      * How many elements are there in this queue?
      */
     public int size() {
-	return vector.size();
+        return vector.size();
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SimplePool.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SimplePool.java
index d0df772..3050287 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SimplePool.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SimplePool.java
@@ -19,15 +19,15 @@
 
 /**
  * Simple object pool. Based on ThreadPool and few other classes
- *
+ * <p/>
  * The pool will ignore overflow and return null if empty.
  *
  * @author Gal Shachor
  * @author Costin
  */
-public final class SimplePool  {
+public final class SimplePool {
 
-    private static final int DEFAULT_SIZE=16;
+    private static final int DEFAULT_SIZE = 16;
 
     /*
      * Where the threads are held.
@@ -35,52 +35,52 @@
     private Object pool[];
 
     private int max;
-    private int current=-1;
+    private int current = -1;
 
     private Object lock;
-    
+
     public SimplePool() {
-	this.max=DEFAULT_SIZE;
-	this.pool=new Object[max];
-	this.lock=new Object();
+        this.max = DEFAULT_SIZE;
+        this.pool = new Object[max];
+        this.lock = new Object();
     }
-    
+
     public SimplePool(int max) {
-	this.max=max;
-	this.pool=new Object[max];
-	this.lock=new Object();
+        this.max = max;
+        this.pool = new Object[max];
+        this.lock = new Object();
     }
 
     /**
      * Adds the given object to the pool, and does nothing if the pool is full
      */
     public void put(Object o) {
-	synchronized( lock ) {
-	    if( current < (max-1) ) {
-		current += 1;
-		pool[current] = o;
+        synchronized (lock) {
+            if (current < (max - 1)) {
+                current += 1;
+                pool[current] = o;
             }
-	}
+        }
     }
 
     /**
      * Get an object from the pool, null if the pool is empty.
      */
     public Object get() {
-	Object item = null;
-	synchronized( lock ) {
-	    if( current >= 0 ) {
-		item = pool[current];
-		current -= 1;
-	    }
-	}
-	return item;
+        Object item = null;
+        synchronized (lock) {
+            if (current >= 0) {
+                item = pool[current];
+                current -= 1;
+            }
+        }
+        return item;
     }
 
     /**
      * Return the size of the pool
      */
     public int getMax() {
-	return max;
+        return max;
     }
 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SystemLogHandler.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SystemLogHandler.java
index 670cbdf..d84846d 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SystemLogHandler.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/util/SystemLogHandler.java
@@ -23,9 +23,9 @@
 
 
 /**
- * This helper class may be used to do sophisticated redirection of 
+ * This helper class may be used to do sophisticated redirection of
  * System.out and System.err.
- * 
+ *
  * @author Remy Maucherat
  */
 public class SystemLogHandler extends PrintStream {
@@ -68,7 +68,7 @@
 
 
     public PrintStream getWrapped() {
-      return wrapped;
+        return wrapped;
     }
 
     /**
@@ -85,8 +85,8 @@
      * Stop capturing thread's output and return captured data as a String.
      */
     public static String unsetThread() {
-        ByteArrayOutputStream baos = 
-            (ByteArrayOutputStream) data.get();
+        ByteArrayOutputStream baos =
+                (ByteArrayOutputStream) data.get();
         if (baos == null) {
             return null;
         }
@@ -135,7 +135,7 @@
     }
 
     public void write(byte[] b)
-        throws IOException {
+            throws IOException {
         findStream().write(b);
     }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ASCIIReader.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ASCIIReader.java
index b7ffa06..3d2597f 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ASCIIReader.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ASCIIReader.java
@@ -28,35 +28,40 @@
  * byte streams that only contain 7-bit ASCII characters.
  *
  * @author Andy Clark, IBM
- *
  * @version $Id: ASCIIReader.java 466606 2006-10-21 23:07:12Z markt $
  */
 public class ASCIIReader
-    extends Reader {
+        extends Reader {
 
     //
     // Constants
     //
 
-    /** Default byte buffer size (2048). */
+    /**
+     * Default byte buffer size (2048).
+     */
     public static final int DEFAULT_BUFFER_SIZE = 2048;
 
     //
     // Data
     //
 
-    /** Input stream. */
+    /**
+     * Input stream.
+     */
     protected InputStream fInputStream;
 
-    /** Byte buffer. */
+    /**
+     * Byte buffer.
+     */
     protected byte[] fBuffer;
 
     //
     // Constructors
     //
 
-    /** 
-     * Constructs an ASCII reader from the specified input stream 
+    /**
+     * Constructs an ASCII reader from the specified input stream
      * and buffer size.
      *
      * @param inputStream The input stream.
@@ -74,21 +79,20 @@
     /**
      * Read a single character.  This method will block until a character is
      * available, an I/O error occurs, or the end of the stream is reached.
-     *
+     * <p/>
      * <p> Subclasses that intend to support efficient single-character input
      * should override this method.
      *
-     * @return     The character read, as an integer in the range 0 to 127
-     *             (<tt>0x00-0x7f</tt>), or -1 if the end of the stream has
-     *             been reached
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @return The character read, as an integer in the range 0 to 127
+     *         (<tt>0x00-0x7f</tt>), or -1 if the end of the stream has
+     *         been reached
+     * @throws IOException If an I/O error occurs
      */
     public int read() throws IOException {
         int b0 = fInputStream.read();
         if (b0 > 0x80) {
             throw new IOException(Localizer.getMessage("jsp.error.xml.invalidASCII",
-						       Integer.toString(b0)));
+                    Integer.toString(b0)));
         }
         return b0;
     } // read():int
@@ -98,14 +102,12 @@
      * until some input is available, an I/O error occurs, or the end of the
      * stream is reached.
      *
-     * @param      ch     Destination buffer
-     * @param      offset Offset at which to start storing characters
-     * @param      length Maximum number of characters to read
-     *
-     * @return     The number of characters read, or -1 if the end of the
-     *             stream has been reached
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @param ch     Destination buffer
+     * @param offset Offset at which to start storing characters
+     * @param length Maximum number of characters to read
+     * @return The number of characters read, or -1 if the end of the
+     *         stream has been reached
+     * @throws IOException If an I/O error occurs
      */
     public int read(char ch[], int offset, int length) throws IOException {
         if (length > fBuffer.length) {
@@ -116,9 +118,9 @@
             int b0 = fBuffer[i];
             if (b0 > 0x80) {
                 throw new IOException(Localizer.getMessage("jsp.error.xml.invalidASCII",
-							   Integer.toString(b0)));
+                        Integer.toString(b0)));
             }
-            ch[offset + i] = (char)b0;
+            ch[offset + i] = (char) b0;
         }
         return count;
     } // read(char[],int,int)
@@ -127,11 +129,9 @@
      * Skip characters.  This method will block until some characters are
      * available, an I/O error occurs, or the end of the stream is reached.
      *
-     * @param  n  The number of characters to skip
-     *
-     * @return    The number of characters actually skipped
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @param n The number of characters to skip
+     * @return The number of characters actually skipped
+     * @throws IOException If an I/O error occurs
      */
     public long skip(long n) throws IOException {
         return fInputStream.skip(n);
@@ -141,20 +141,19 @@
      * Tell whether this stream is ready to be read.
      *
      * @return True if the next read() is guaranteed not to block for input,
-     * false otherwise.  Note that returning false does not guarantee that the
-     * next read will block.
-     *
-     * @exception  IOException  If an I/O error occurs
+     *         false otherwise.  Note that returning false does not guarantee that the
+     *         next read will block.
+     * @throws IOException If an I/O error occurs
      */
     public boolean ready() throws IOException {
-	return false;
+        return false;
     } // ready()
 
     /**
      * Tell whether this stream supports the mark() operation.
      */
     public boolean markSupported() {
-	return fInputStream.markSupported();
+        return fInputStream.markSupported();
     } // markSupported()
 
     /**
@@ -162,16 +161,15 @@
      * will attempt to reposition the stream to this point.  Not all
      * character-input streams support the mark() operation.
      *
-     * @param  readAheadLimit  Limit on the number of characters that may be
-     *                         read while still preserving the mark.  After
-     *                         reading this many characters, attempting to
-     *                         reset the stream may fail.
-     *
-     * @exception  IOException  If the stream does not support mark(),
-     *                          or if some other I/O error occurs
+     * @param readAheadLimit Limit on the number of characters that may be
+     *                       read while still preserving the mark.  After
+     *                       reading this many characters, attempting to
+     *                       reset the stream may fail.
+     * @throws IOException If the stream does not support mark(),
+     *                     or if some other I/O error occurs
      */
     public void mark(int readAheadLimit) throws IOException {
-	fInputStream.mark(readAheadLimit);
+        fInputStream.mark(readAheadLimit);
     } // mark(int)
 
     /**
@@ -182,10 +180,10 @@
      * character-input streams support the reset() operation, and some support
      * reset() without supporting mark().
      *
-     * @exception  IOException  If the stream has not been marked,
-     *                          or if the mark has been invalidated,
-     *                          or if the stream does not support reset(),
-     *                          or if some other I/O error occurs
+     * @throws IOException If the stream has not been marked,
+     *                     or if the mark has been invalidated,
+     *                     or if the stream does not support reset(),
+     *                     or if some other I/O error occurs
      */
     public void reset() throws IOException {
         fInputStream.reset();
@@ -196,10 +194,10 @@
      * ready(), mark(), or reset() invocations will throw an IOException.
      * Closing a previously-closed stream, however, has no effect.
      *
-     * @exception  IOException  If an I/O error occurs
+     * @throws IOException If an I/O error occurs
      */
-     public void close() throws IOException {
-         fInputStream.close();
-     } // close()
+    public void close() throws IOException {
+        fInputStream.close();
+    } // close()
 
 } // class ASCIIReader
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java
index f603386..6a68f52 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java
@@ -28,452 +28,451 @@
 import java.util.Hashtable;
 
 /**
- * EncodingMap is a convenience class which handles conversions between 
+ * EncodingMap is a convenience class which handles conversions between
  * IANA encoding names and Java encoding names, and vice versa. The
  * encoding names used in XML instance documents <strong>must</strong>
  * be the IANA encoding names specified or one of the aliases for those names
  * which IANA defines.
- * <p>
+ * <p/>
  * <TABLE BORDER="0" WIDTH="100%">
- *  <TR>
- *      <TD WIDTH="33%">
- *          <P ALIGN="CENTER"><B>Common Name</B>
- *      </TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER"><B>Use this name in XML files</B>
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER"><B>Name Type</B>
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER"><B>Xerces converts to this Java Encoder Name</B>
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">8 bit Unicode</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">UTF-8
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">UTF8
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin 1</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-1
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-1
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin 2</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-2
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-2
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin 3</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-3
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-3
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin 4</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-4
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-4
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin Cyrillic</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-5
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-5
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin Arabic</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-6
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-6
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin Greek</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-7
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-7
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin Hebrew</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-8
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-8
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">ISO Latin 5</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ISO-8859-9
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">ISO-8859-9
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: US</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-us
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp037
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Canada</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-ca
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp037
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Netherlands</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-nl
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp037
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Denmark</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-dk
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp277
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Norway</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-no
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp277
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Finland</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-fi
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp278
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Sweden</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-se
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp278
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Italy</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-it
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp280
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Spain, Latin America</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-es
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp284
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Great Britain</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-gb
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp285
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: France</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-fr
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp297
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Arabic</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-ar1
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp420
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Hebrew</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-he
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp424
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Switzerland</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-ch
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp500
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Roece</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-roece
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp870
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Yugoslavia</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-yu
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp870
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Iceland</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-is
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp871
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">EBCDIC: Urdu</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">ebcdic-cp-ar2
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">IANA
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">cp918
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">Chinese for PRC, mixed 1/2 byte</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">gb2312
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">GB2312
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">Extended Unix Code, packed for Japanese</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">euc-jp
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">eucjis
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">Japanese: iso-2022-jp</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">iso-2020-jp
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">JIS
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">Japanese: Shift JIS</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">Shift_JIS
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">SJIS
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">Chinese: Big5</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">Big5
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">Big5
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">Extended Unix Code, packed for Korean</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">euc-kr
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">iso2022kr
- *      </TD>
- *  </TR>
- *  <TR>
- *      <TD WIDTH="33%">Cyrillic</TD>
- *      <TD WIDTH="15%">
- *          <P ALIGN="CENTER">koi8-r
- *      </TD>
- *      <TD WIDTH="12%">
- *          <P ALIGN="CENTER">MIME
- *      </TD>
- *      <TD WIDTH="31%">
- *          <P ALIGN="CENTER">koi8-r
- *      </TD>
- *  </TR>
+ * <TR>
+ * <TD WIDTH="33%">
+ * <P ALIGN="CENTER"><B>Common Name</B>
+ * </TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER"><B>Use this name in XML files</B>
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER"><B>Name Type</B>
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER"><B>Xerces converts to this Java Encoder Name</B>
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">8 bit Unicode</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">UTF-8
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">UTF8
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 1</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-1
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-1
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 2</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-2
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-2
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 3</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-3
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-3
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 4</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-4
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-4
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Cyrillic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-5
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-5
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Arabic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-6
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-6
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Greek</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-7
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-7
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Hebrew</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-8
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-8
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 5</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-9
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-9
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: US</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-us
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp037
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Canada</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ca
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp037
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Netherlands</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-nl
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp037
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Denmark</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-dk
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp277
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Norway</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-no
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp277
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Finland</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-fi
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp278
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Sweden</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-se
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp278
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Italy</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-it
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp280
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Spain, Latin America</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-es
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp284
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Great Britain</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-gb
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp285
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: France</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-fr
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp297
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Arabic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ar1
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp420
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Hebrew</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-he
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp424
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Switzerland</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ch
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp500
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Roece</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-roece
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp870
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Yugoslavia</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-yu
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp870
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Iceland</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-is
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp871
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Urdu</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ar2
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp918
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Chinese for PRC, mixed 1/2 byte</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">gb2312
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">GB2312
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Extended Unix Code, packed for Japanese</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">euc-jp
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">eucjis
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Japanese: iso-2022-jp</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">iso-2020-jp
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">JIS
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Japanese: Shift JIS</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">Shift_JIS
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">SJIS
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Chinese: Big5</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">Big5
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">Big5
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Extended Unix Code, packed for Korean</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">euc-kr
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">iso2022kr
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Cyrillic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">koi8-r
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">koi8-r
+ * </TD>
+ * </TR>
  * </TABLE>
- * 
+ *
  * @author TAMURA Kent, IBM
  * @author Andy Clark, IBM
- *
  * @version $Id: EncodingMap.java 466606 2006-10-21 23:07:12Z markt $
  */
 public class EncodingMap {
@@ -482,10 +481,14 @@
     // Data
     //
 
-    /** fIANA2JavaMap */
+    /**
+     * fIANA2JavaMap
+     */
     protected final static Hashtable fIANA2JavaMap = new Hashtable();
 
-    /** fJava2IANAMap */
+    /**
+     * fJava2IANAMap
+     */
     protected final static Hashtable fJava2IANAMap = new Hashtable();
 
     //
@@ -495,456 +498,456 @@
     static {
 
         // add IANA to Java encoding mappings.
-        fIANA2JavaMap.put("BIG5",            "Big5");
-        fIANA2JavaMap.put("CSBIG5",            "Big5");
-        fIANA2JavaMap.put("CP037",    "CP037");
-        fIANA2JavaMap.put("IBM037",    "CP037");
-        fIANA2JavaMap.put("CSIBM037",    "CP037");
-        fIANA2JavaMap.put("EBCDIC-CP-US",    "CP037");
-        fIANA2JavaMap.put("EBCDIC-CP-CA",    "CP037");
-        fIANA2JavaMap.put("EBCDIC-CP-NL",    "CP037");
-        fIANA2JavaMap.put("EBCDIC-CP-WT",    "CP037");
-        fIANA2JavaMap.put("IBM273",    "CP273");
-        fIANA2JavaMap.put("CP273",    "CP273");
-        fIANA2JavaMap.put("CSIBM273",    "CP273");
-        fIANA2JavaMap.put("IBM277",    "CP277");
-        fIANA2JavaMap.put("CP277",    "CP277");
-        fIANA2JavaMap.put("CSIBM277",    "CP277");
-        fIANA2JavaMap.put("EBCDIC-CP-DK",    "CP277");
-        fIANA2JavaMap.put("EBCDIC-CP-NO",    "CP277");
-        fIANA2JavaMap.put("IBM278",    "CP278");
-        fIANA2JavaMap.put("CP278",    "CP278");
-        fIANA2JavaMap.put("CSIBM278",    "CP278");
-        fIANA2JavaMap.put("EBCDIC-CP-FI",    "CP278");
-        fIANA2JavaMap.put("EBCDIC-CP-SE",    "CP278");
-        fIANA2JavaMap.put("IBM280",    "CP280");
-        fIANA2JavaMap.put("CP280",    "CP280");
-        fIANA2JavaMap.put("CSIBM280",    "CP280");
-        fIANA2JavaMap.put("EBCDIC-CP-IT",    "CP280");
-        fIANA2JavaMap.put("IBM284",    "CP284");
-        fIANA2JavaMap.put("CP284",    "CP284");
-        fIANA2JavaMap.put("CSIBM284",    "CP284");
-        fIANA2JavaMap.put("EBCDIC-CP-ES",    "CP284");
-        fIANA2JavaMap.put("EBCDIC-CP-GB",    "CP285");
-        fIANA2JavaMap.put("IBM285",    "CP285");
-        fIANA2JavaMap.put("CP285",    "CP285");
-        fIANA2JavaMap.put("CSIBM285",    "CP285");
-        fIANA2JavaMap.put("EBCDIC-JP-KANA",    "CP290");
-        fIANA2JavaMap.put("IBM290",    "CP290");
-        fIANA2JavaMap.put("CP290",    "CP290");
-        fIANA2JavaMap.put("CSIBM290",    "CP290");
-        fIANA2JavaMap.put("EBCDIC-CP-FR",    "CP297");
-        fIANA2JavaMap.put("IBM297",    "CP297");
-        fIANA2JavaMap.put("CP297",    "CP297");
-        fIANA2JavaMap.put("CSIBM297",    "CP297");
-        fIANA2JavaMap.put("EBCDIC-CP-AR1",   "CP420");
-        fIANA2JavaMap.put("IBM420",    "CP420");
-        fIANA2JavaMap.put("CP420",    "CP420");
-        fIANA2JavaMap.put("CSIBM420",    "CP420");
-        fIANA2JavaMap.put("EBCDIC-CP-HE",    "CP424");
-        fIANA2JavaMap.put("IBM424",    "CP424");
-        fIANA2JavaMap.put("CP424",    "CP424");
-        fIANA2JavaMap.put("CSIBM424",    "CP424");
-        fIANA2JavaMap.put("IBM437",    "CP437");
-        fIANA2JavaMap.put("437",    "CP437");
-        fIANA2JavaMap.put("CP437",    "CP437");
-        fIANA2JavaMap.put("CSPC8CODEPAGE437",    "CP437");
-        fIANA2JavaMap.put("EBCDIC-CP-CH",    "CP500");
-        fIANA2JavaMap.put("IBM500",    "CP500");
-        fIANA2JavaMap.put("CP500",    "CP500");
-        fIANA2JavaMap.put("CSIBM500",    "CP500");
-        fIANA2JavaMap.put("EBCDIC-CP-CH",    "CP500");
-        fIANA2JavaMap.put("EBCDIC-CP-BE",    "CP500"); 
-        fIANA2JavaMap.put("IBM775",    "CP775");
-        fIANA2JavaMap.put("CP775",    "CP775");
-        fIANA2JavaMap.put("CSPC775BALTIC",    "CP775");
-        fIANA2JavaMap.put("IBM850",    "CP850");
-        fIANA2JavaMap.put("850",    "CP850");
-        fIANA2JavaMap.put("CP850",    "CP850");
-        fIANA2JavaMap.put("CSPC850MULTILINGUAL",    "CP850");
-        fIANA2JavaMap.put("IBM852",    "CP852");
-        fIANA2JavaMap.put("852",    "CP852");
-        fIANA2JavaMap.put("CP852",    "CP852");
-        fIANA2JavaMap.put("CSPCP852",    "CP852");
-        fIANA2JavaMap.put("IBM855",    "CP855");
-        fIANA2JavaMap.put("855",    "CP855");
-        fIANA2JavaMap.put("CP855",    "CP855");
-        fIANA2JavaMap.put("CSIBM855",    "CP855");
-        fIANA2JavaMap.put("IBM857",    "CP857");
-        fIANA2JavaMap.put("857",    "CP857");
-        fIANA2JavaMap.put("CP857",    "CP857");
-        fIANA2JavaMap.put("CSIBM857",    "CP857");
-        fIANA2JavaMap.put("IBM00858",    "CP858");
-        fIANA2JavaMap.put("CP00858",    "CP858");
-        fIANA2JavaMap.put("CCSID00858",    "CP858");
-        fIANA2JavaMap.put("IBM860",    "CP860");
-        fIANA2JavaMap.put("860",    "CP860");
-        fIANA2JavaMap.put("CP860",    "CP860");
-        fIANA2JavaMap.put("CSIBM860",    "CP860");
-        fIANA2JavaMap.put("IBM861",    "CP861");
-        fIANA2JavaMap.put("861",    "CP861");
-        fIANA2JavaMap.put("CP861",    "CP861");
-        fIANA2JavaMap.put("CP-IS",    "CP861");
-        fIANA2JavaMap.put("CSIBM861",    "CP861");
-        fIANA2JavaMap.put("IBM862",    "CP862");
-        fIANA2JavaMap.put("862",    "CP862");
-        fIANA2JavaMap.put("CP862",    "CP862");
-        fIANA2JavaMap.put("CSPC862LATINHEBREW",    "CP862");
-        fIANA2JavaMap.put("IBM863",    "CP863");
-        fIANA2JavaMap.put("863",    "CP863");
-        fIANA2JavaMap.put("CP863",    "CP863");
-        fIANA2JavaMap.put("CSIBM863",    "CP863");
-        fIANA2JavaMap.put("IBM864",    "CP864");
-        fIANA2JavaMap.put("CP864",    "CP864");
-        fIANA2JavaMap.put("CSIBM864",    "CP864");
-        fIANA2JavaMap.put("IBM865",    "CP865");
-        fIANA2JavaMap.put("865",    "CP865");
-        fIANA2JavaMap.put("CP865",    "CP865");
-        fIANA2JavaMap.put("CSIBM865",    "CP865");
-        fIANA2JavaMap.put("IBM866",    "CP866");
-        fIANA2JavaMap.put("866",    "CP866");
-        fIANA2JavaMap.put("CP866",    "CP866");
-        fIANA2JavaMap.put("CSIBM866",    "CP866");
-        fIANA2JavaMap.put("IBM868",    "CP868");
-        fIANA2JavaMap.put("CP868",    "CP868");
-        fIANA2JavaMap.put("CSIBM868",    "CP868");
-        fIANA2JavaMap.put("CP-AR",        "CP868");
-        fIANA2JavaMap.put("IBM869",    "CP869");
-        fIANA2JavaMap.put("CP869",    "CP869");
-        fIANA2JavaMap.put("CSIBM869",    "CP869");
-        fIANA2JavaMap.put("CP-GR",        "CP869");
-        fIANA2JavaMap.put("IBM870",    "CP870");
-        fIANA2JavaMap.put("CP870",    "CP870");
-        fIANA2JavaMap.put("CSIBM870",    "CP870");
+        fIANA2JavaMap.put("BIG5", "Big5");
+        fIANA2JavaMap.put("CSBIG5", "Big5");
+        fIANA2JavaMap.put("CP037", "CP037");
+        fIANA2JavaMap.put("IBM037", "CP037");
+        fIANA2JavaMap.put("CSIBM037", "CP037");
+        fIANA2JavaMap.put("EBCDIC-CP-US", "CP037");
+        fIANA2JavaMap.put("EBCDIC-CP-CA", "CP037");
+        fIANA2JavaMap.put("EBCDIC-CP-NL", "CP037");
+        fIANA2JavaMap.put("EBCDIC-CP-WT", "CP037");
+        fIANA2JavaMap.put("IBM273", "CP273");
+        fIANA2JavaMap.put("CP273", "CP273");
+        fIANA2JavaMap.put("CSIBM273", "CP273");
+        fIANA2JavaMap.put("IBM277", "CP277");
+        fIANA2JavaMap.put("CP277", "CP277");
+        fIANA2JavaMap.put("CSIBM277", "CP277");
+        fIANA2JavaMap.put("EBCDIC-CP-DK", "CP277");
+        fIANA2JavaMap.put("EBCDIC-CP-NO", "CP277");
+        fIANA2JavaMap.put("IBM278", "CP278");
+        fIANA2JavaMap.put("CP278", "CP278");
+        fIANA2JavaMap.put("CSIBM278", "CP278");
+        fIANA2JavaMap.put("EBCDIC-CP-FI", "CP278");
+        fIANA2JavaMap.put("EBCDIC-CP-SE", "CP278");
+        fIANA2JavaMap.put("IBM280", "CP280");
+        fIANA2JavaMap.put("CP280", "CP280");
+        fIANA2JavaMap.put("CSIBM280", "CP280");
+        fIANA2JavaMap.put("EBCDIC-CP-IT", "CP280");
+        fIANA2JavaMap.put("IBM284", "CP284");
+        fIANA2JavaMap.put("CP284", "CP284");
+        fIANA2JavaMap.put("CSIBM284", "CP284");
+        fIANA2JavaMap.put("EBCDIC-CP-ES", "CP284");
+        fIANA2JavaMap.put("EBCDIC-CP-GB", "CP285");
+        fIANA2JavaMap.put("IBM285", "CP285");
+        fIANA2JavaMap.put("CP285", "CP285");
+        fIANA2JavaMap.put("CSIBM285", "CP285");
+        fIANA2JavaMap.put("EBCDIC-JP-KANA", "CP290");
+        fIANA2JavaMap.put("IBM290", "CP290");
+        fIANA2JavaMap.put("CP290", "CP290");
+        fIANA2JavaMap.put("CSIBM290", "CP290");
+        fIANA2JavaMap.put("EBCDIC-CP-FR", "CP297");
+        fIANA2JavaMap.put("IBM297", "CP297");
+        fIANA2JavaMap.put("CP297", "CP297");
+        fIANA2JavaMap.put("CSIBM297", "CP297");
+        fIANA2JavaMap.put("EBCDIC-CP-AR1", "CP420");
+        fIANA2JavaMap.put("IBM420", "CP420");
+        fIANA2JavaMap.put("CP420", "CP420");
+        fIANA2JavaMap.put("CSIBM420", "CP420");
+        fIANA2JavaMap.put("EBCDIC-CP-HE", "CP424");
+        fIANA2JavaMap.put("IBM424", "CP424");
+        fIANA2JavaMap.put("CP424", "CP424");
+        fIANA2JavaMap.put("CSIBM424", "CP424");
+        fIANA2JavaMap.put("IBM437", "CP437");
+        fIANA2JavaMap.put("437", "CP437");
+        fIANA2JavaMap.put("CP437", "CP437");
+        fIANA2JavaMap.put("CSPC8CODEPAGE437", "CP437");
+        fIANA2JavaMap.put("EBCDIC-CP-CH", "CP500");
+        fIANA2JavaMap.put("IBM500", "CP500");
+        fIANA2JavaMap.put("CP500", "CP500");
+        fIANA2JavaMap.put("CSIBM500", "CP500");
+        fIANA2JavaMap.put("EBCDIC-CP-CH", "CP500");
+        fIANA2JavaMap.put("EBCDIC-CP-BE", "CP500");
+        fIANA2JavaMap.put("IBM775", "CP775");
+        fIANA2JavaMap.put("CP775", "CP775");
+        fIANA2JavaMap.put("CSPC775BALTIC", "CP775");
+        fIANA2JavaMap.put("IBM850", "CP850");
+        fIANA2JavaMap.put("850", "CP850");
+        fIANA2JavaMap.put("CP850", "CP850");
+        fIANA2JavaMap.put("CSPC850MULTILINGUAL", "CP850");
+        fIANA2JavaMap.put("IBM852", "CP852");
+        fIANA2JavaMap.put("852", "CP852");
+        fIANA2JavaMap.put("CP852", "CP852");
+        fIANA2JavaMap.put("CSPCP852", "CP852");
+        fIANA2JavaMap.put("IBM855", "CP855");
+        fIANA2JavaMap.put("855", "CP855");
+        fIANA2JavaMap.put("CP855", "CP855");
+        fIANA2JavaMap.put("CSIBM855", "CP855");
+        fIANA2JavaMap.put("IBM857", "CP857");
+        fIANA2JavaMap.put("857", "CP857");
+        fIANA2JavaMap.put("CP857", "CP857");
+        fIANA2JavaMap.put("CSIBM857", "CP857");
+        fIANA2JavaMap.put("IBM00858", "CP858");
+        fIANA2JavaMap.put("CP00858", "CP858");
+        fIANA2JavaMap.put("CCSID00858", "CP858");
+        fIANA2JavaMap.put("IBM860", "CP860");
+        fIANA2JavaMap.put("860", "CP860");
+        fIANA2JavaMap.put("CP860", "CP860");
+        fIANA2JavaMap.put("CSIBM860", "CP860");
+        fIANA2JavaMap.put("IBM861", "CP861");
+        fIANA2JavaMap.put("861", "CP861");
+        fIANA2JavaMap.put("CP861", "CP861");
+        fIANA2JavaMap.put("CP-IS", "CP861");
+        fIANA2JavaMap.put("CSIBM861", "CP861");
+        fIANA2JavaMap.put("IBM862", "CP862");
+        fIANA2JavaMap.put("862", "CP862");
+        fIANA2JavaMap.put("CP862", "CP862");
+        fIANA2JavaMap.put("CSPC862LATINHEBREW", "CP862");
+        fIANA2JavaMap.put("IBM863", "CP863");
+        fIANA2JavaMap.put("863", "CP863");
+        fIANA2JavaMap.put("CP863", "CP863");
+        fIANA2JavaMap.put("CSIBM863", "CP863");
+        fIANA2JavaMap.put("IBM864", "CP864");
+        fIANA2JavaMap.put("CP864", "CP864");
+        fIANA2JavaMap.put("CSIBM864", "CP864");
+        fIANA2JavaMap.put("IBM865", "CP865");
+        fIANA2JavaMap.put("865", "CP865");
+        fIANA2JavaMap.put("CP865", "CP865");
+        fIANA2JavaMap.put("CSIBM865", "CP865");
+        fIANA2JavaMap.put("IBM866", "CP866");
+        fIANA2JavaMap.put("866", "CP866");
+        fIANA2JavaMap.put("CP866", "CP866");
+        fIANA2JavaMap.put("CSIBM866", "CP866");
+        fIANA2JavaMap.put("IBM868", "CP868");
+        fIANA2JavaMap.put("CP868", "CP868");
+        fIANA2JavaMap.put("CSIBM868", "CP868");
+        fIANA2JavaMap.put("CP-AR", "CP868");
+        fIANA2JavaMap.put("IBM869", "CP869");
+        fIANA2JavaMap.put("CP869", "CP869");
+        fIANA2JavaMap.put("CSIBM869", "CP869");
+        fIANA2JavaMap.put("CP-GR", "CP869");
+        fIANA2JavaMap.put("IBM870", "CP870");
+        fIANA2JavaMap.put("CP870", "CP870");
+        fIANA2JavaMap.put("CSIBM870", "CP870");
         fIANA2JavaMap.put("EBCDIC-CP-ROECE", "CP870");
-        fIANA2JavaMap.put("EBCDIC-CP-YU",    "CP870");
-        fIANA2JavaMap.put("IBM871",    "CP871");
-        fIANA2JavaMap.put("CP871",    "CP871");
-        fIANA2JavaMap.put("CSIBM871",    "CP871");
-        fIANA2JavaMap.put("EBCDIC-CP-IS",    "CP871");
-        fIANA2JavaMap.put("IBM918",    "CP918");
-        fIANA2JavaMap.put("CP918",    "CP918");
-        fIANA2JavaMap.put("CSIBM918",    "CP918");
-        fIANA2JavaMap.put("EBCDIC-CP-AR2",   "CP918");
-        fIANA2JavaMap.put("IBM00924",    "CP924");
-        fIANA2JavaMap.put("CP00924",    "CP924");
-        fIANA2JavaMap.put("CCSID00924",    "CP924");
+        fIANA2JavaMap.put("EBCDIC-CP-YU", "CP870");
+        fIANA2JavaMap.put("IBM871", "CP871");
+        fIANA2JavaMap.put("CP871", "CP871");
+        fIANA2JavaMap.put("CSIBM871", "CP871");
+        fIANA2JavaMap.put("EBCDIC-CP-IS", "CP871");
+        fIANA2JavaMap.put("IBM918", "CP918");
+        fIANA2JavaMap.put("CP918", "CP918");
+        fIANA2JavaMap.put("CSIBM918", "CP918");
+        fIANA2JavaMap.put("EBCDIC-CP-AR2", "CP918");
+        fIANA2JavaMap.put("IBM00924", "CP924");
+        fIANA2JavaMap.put("CP00924", "CP924");
+        fIANA2JavaMap.put("CCSID00924", "CP924");
         // is this an error???
-        fIANA2JavaMap.put("EBCDIC-LATIN9--EURO",    "CP924");
-        fIANA2JavaMap.put("IBM1026",    "CP1026");
-        fIANA2JavaMap.put("CP1026",    "CP1026");
-        fIANA2JavaMap.put("CSIBM1026",    "CP1026");
-        fIANA2JavaMap.put("IBM01140",    "Cp1140");
-        fIANA2JavaMap.put("CP01140",    "Cp1140");
-        fIANA2JavaMap.put("CCSID01140",    "Cp1140");
-        fIANA2JavaMap.put("IBM01141",    "Cp1141");
-        fIANA2JavaMap.put("CP01141",    "Cp1141");
-        fIANA2JavaMap.put("CCSID01141",    "Cp1141");
-        fIANA2JavaMap.put("IBM01142",    "Cp1142");
-        fIANA2JavaMap.put("CP01142",    "Cp1142");
-        fIANA2JavaMap.put("CCSID01142",    "Cp1142");
-        fIANA2JavaMap.put("IBM01143",    "Cp1143");
-        fIANA2JavaMap.put("CP01143",    "Cp1143");
-        fIANA2JavaMap.put("CCSID01143",    "Cp1143");
-        fIANA2JavaMap.put("IBM01144",    "Cp1144");
-        fIANA2JavaMap.put("CP01144",    "Cp1144");
-        fIANA2JavaMap.put("CCSID01144",    "Cp1144");
-        fIANA2JavaMap.put("IBM01145",    "Cp1145");
-        fIANA2JavaMap.put("CP01145",    "Cp1145");
-        fIANA2JavaMap.put("CCSID01145",    "Cp1145");
-        fIANA2JavaMap.put("IBM01146",    "Cp1146");
-        fIANA2JavaMap.put("CP01146",    "Cp1146");
-        fIANA2JavaMap.put("CCSID01146",    "Cp1146");
-        fIANA2JavaMap.put("IBM01147",    "Cp1147");
-        fIANA2JavaMap.put("CP01147",    "Cp1147");
-        fIANA2JavaMap.put("CCSID01147",    "Cp1147");
-        fIANA2JavaMap.put("IBM01148",    "Cp1148");
-        fIANA2JavaMap.put("CP01148",    "Cp1148");
-        fIANA2JavaMap.put("CCSID01148",    "Cp1148");
-        fIANA2JavaMap.put("IBM01149",    "Cp1149");
-        fIANA2JavaMap.put("CP01149",    "Cp1149");
-        fIANA2JavaMap.put("CCSID01149",    "Cp1149");
-        fIANA2JavaMap.put("EUC-JP",          "EUCJIS");
-        fIANA2JavaMap.put("CSEUCPKDFMTJAPANESE",          "EUCJIS");
-        fIANA2JavaMap.put("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE",          "EUCJIS");
-        fIANA2JavaMap.put("EUC-KR",          "KSC5601");
-        fIANA2JavaMap.put("CSEUCKR",          "KSC5601");
-        fIANA2JavaMap.put("KS_C_5601-1987",          "KS_C_5601-1987");
-        fIANA2JavaMap.put("ISO-IR-149",          "KS_C_5601-1987");
-        fIANA2JavaMap.put("KS_C_5601-1989",          "KS_C_5601-1987");
-        fIANA2JavaMap.put("KSC_5601",          "KS_C_5601-1987");
-        fIANA2JavaMap.put("KOREAN",          "KS_C_5601-1987");
-        fIANA2JavaMap.put("CSKSC56011987",          "KS_C_5601-1987");
-        fIANA2JavaMap.put("GB2312",          "GB2312");
-        fIANA2JavaMap.put("CSGB2312",          "GB2312");
-        fIANA2JavaMap.put("ISO-2022-JP",     "JIS");
-        fIANA2JavaMap.put("CSISO2022JP",     "JIS");
-        fIANA2JavaMap.put("ISO-2022-KR",     "ISO2022KR");
-        fIANA2JavaMap.put("CSISO2022KR",     "ISO2022KR");
-        fIANA2JavaMap.put("ISO-2022-CN",     "ISO2022CN");
+        fIANA2JavaMap.put("EBCDIC-LATIN9--EURO", "CP924");
+        fIANA2JavaMap.put("IBM1026", "CP1026");
+        fIANA2JavaMap.put("CP1026", "CP1026");
+        fIANA2JavaMap.put("CSIBM1026", "CP1026");
+        fIANA2JavaMap.put("IBM01140", "Cp1140");
+        fIANA2JavaMap.put("CP01140", "Cp1140");
+        fIANA2JavaMap.put("CCSID01140", "Cp1140");
+        fIANA2JavaMap.put("IBM01141", "Cp1141");
+        fIANA2JavaMap.put("CP01141", "Cp1141");
+        fIANA2JavaMap.put("CCSID01141", "Cp1141");
+        fIANA2JavaMap.put("IBM01142", "Cp1142");
+        fIANA2JavaMap.put("CP01142", "Cp1142");
+        fIANA2JavaMap.put("CCSID01142", "Cp1142");
+        fIANA2JavaMap.put("IBM01143", "Cp1143");
+        fIANA2JavaMap.put("CP01143", "Cp1143");
+        fIANA2JavaMap.put("CCSID01143", "Cp1143");
+        fIANA2JavaMap.put("IBM01144", "Cp1144");
+        fIANA2JavaMap.put("CP01144", "Cp1144");
+        fIANA2JavaMap.put("CCSID01144", "Cp1144");
+        fIANA2JavaMap.put("IBM01145", "Cp1145");
+        fIANA2JavaMap.put("CP01145", "Cp1145");
+        fIANA2JavaMap.put("CCSID01145", "Cp1145");
+        fIANA2JavaMap.put("IBM01146", "Cp1146");
+        fIANA2JavaMap.put("CP01146", "Cp1146");
+        fIANA2JavaMap.put("CCSID01146", "Cp1146");
+        fIANA2JavaMap.put("IBM01147", "Cp1147");
+        fIANA2JavaMap.put("CP01147", "Cp1147");
+        fIANA2JavaMap.put("CCSID01147", "Cp1147");
+        fIANA2JavaMap.put("IBM01148", "Cp1148");
+        fIANA2JavaMap.put("CP01148", "Cp1148");
+        fIANA2JavaMap.put("CCSID01148", "Cp1148");
+        fIANA2JavaMap.put("IBM01149", "Cp1149");
+        fIANA2JavaMap.put("CP01149", "Cp1149");
+        fIANA2JavaMap.put("CCSID01149", "Cp1149");
+        fIANA2JavaMap.put("EUC-JP", "EUCJIS");
+        fIANA2JavaMap.put("CSEUCPKDFMTJAPANESE", "EUCJIS");
+        fIANA2JavaMap.put("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", "EUCJIS");
+        fIANA2JavaMap.put("EUC-KR", "KSC5601");
+        fIANA2JavaMap.put("CSEUCKR", "KSC5601");
+        fIANA2JavaMap.put("KS_C_5601-1987", "KS_C_5601-1987");
+        fIANA2JavaMap.put("ISO-IR-149", "KS_C_5601-1987");
+        fIANA2JavaMap.put("KS_C_5601-1989", "KS_C_5601-1987");
+        fIANA2JavaMap.put("KSC_5601", "KS_C_5601-1987");
+        fIANA2JavaMap.put("KOREAN", "KS_C_5601-1987");
+        fIANA2JavaMap.put("CSKSC56011987", "KS_C_5601-1987");
+        fIANA2JavaMap.put("GB2312", "GB2312");
+        fIANA2JavaMap.put("CSGB2312", "GB2312");
+        fIANA2JavaMap.put("ISO-2022-JP", "JIS");
+        fIANA2JavaMap.put("CSISO2022JP", "JIS");
+        fIANA2JavaMap.put("ISO-2022-KR", "ISO2022KR");
+        fIANA2JavaMap.put("CSISO2022KR", "ISO2022KR");
+        fIANA2JavaMap.put("ISO-2022-CN", "ISO2022CN");
 
-        fIANA2JavaMap.put("X0201",  "JIS0201");
+        fIANA2JavaMap.put("X0201", "JIS0201");
         fIANA2JavaMap.put("CSISO13JISC6220JP", "JIS0201");
-        fIANA2JavaMap.put("X0208",  "JIS0208");
-        fIANA2JavaMap.put("ISO-IR-87",  "JIS0208");
-        fIANA2JavaMap.put("X0208dbiJIS_X0208-1983",  "JIS0208");
-        fIANA2JavaMap.put("CSISO87JISX0208",  "JIS0208");
-        fIANA2JavaMap.put("X0212",  "JIS0212");
-        fIANA2JavaMap.put("ISO-IR-159",  "JIS0212");
-        fIANA2JavaMap.put("CSISO159JISX02121990",  "JIS0212");
-        fIANA2JavaMap.put("GB18030",       "GB18030");
-        fIANA2JavaMap.put("GBK",       "GBK");
-        fIANA2JavaMap.put("CP936",       "GBK");
-        fIANA2JavaMap.put("MS936",       "GBK");
-        fIANA2JavaMap.put("WINDOWS-936",       "GBK");
-        fIANA2JavaMap.put("SHIFT_JIS",       "SJIS");
-        fIANA2JavaMap.put("CSSHIFTJIS",       "SJIS");
-        fIANA2JavaMap.put("MS_KANJI",       "SJIS");
-        fIANA2JavaMap.put("WINDOWS-31J",       "MS932");
-        fIANA2JavaMap.put("CSWINDOWS31J",       "MS932");
+        fIANA2JavaMap.put("X0208", "JIS0208");
+        fIANA2JavaMap.put("ISO-IR-87", "JIS0208");
+        fIANA2JavaMap.put("X0208dbiJIS_X0208-1983", "JIS0208");
+        fIANA2JavaMap.put("CSISO87JISX0208", "JIS0208");
+        fIANA2JavaMap.put("X0212", "JIS0212");
+        fIANA2JavaMap.put("ISO-IR-159", "JIS0212");
+        fIANA2JavaMap.put("CSISO159JISX02121990", "JIS0212");
+        fIANA2JavaMap.put("GB18030", "GB18030");
+        fIANA2JavaMap.put("GBK", "GBK");
+        fIANA2JavaMap.put("CP936", "GBK");
+        fIANA2JavaMap.put("MS936", "GBK");
+        fIANA2JavaMap.put("WINDOWS-936", "GBK");
+        fIANA2JavaMap.put("SHIFT_JIS", "SJIS");
+        fIANA2JavaMap.put("CSSHIFTJIS", "SJIS");
+        fIANA2JavaMap.put("MS_KANJI", "SJIS");
+        fIANA2JavaMap.put("WINDOWS-31J", "MS932");
+        fIANA2JavaMap.put("CSWINDOWS31J", "MS932");
 
-	    // Add support for Cp1252 and its friends
-        fIANA2JavaMap.put("WINDOWS-1250",   "Cp1250");
-        fIANA2JavaMap.put("WINDOWS-1251",   "Cp1251");
-        fIANA2JavaMap.put("WINDOWS-1252",   "Cp1252");
-        fIANA2JavaMap.put("WINDOWS-1253",   "Cp1253");
-        fIANA2JavaMap.put("WINDOWS-1254",   "Cp1254");
-        fIANA2JavaMap.put("WINDOWS-1255",   "Cp1255");
-        fIANA2JavaMap.put("WINDOWS-1256",   "Cp1256");
-        fIANA2JavaMap.put("WINDOWS-1257",   "Cp1257");
-        fIANA2JavaMap.put("WINDOWS-1258",   "Cp1258");
-        fIANA2JavaMap.put("TIS-620",   "TIS620");
+        // Add support for Cp1252 and its friends
+        fIANA2JavaMap.put("WINDOWS-1250", "Cp1250");
+        fIANA2JavaMap.put("WINDOWS-1251", "Cp1251");
+        fIANA2JavaMap.put("WINDOWS-1252", "Cp1252");
+        fIANA2JavaMap.put("WINDOWS-1253", "Cp1253");
+        fIANA2JavaMap.put("WINDOWS-1254", "Cp1254");
+        fIANA2JavaMap.put("WINDOWS-1255", "Cp1255");
+        fIANA2JavaMap.put("WINDOWS-1256", "Cp1256");
+        fIANA2JavaMap.put("WINDOWS-1257", "Cp1257");
+        fIANA2JavaMap.put("WINDOWS-1258", "Cp1258");
+        fIANA2JavaMap.put("TIS-620", "TIS620");
 
-        fIANA2JavaMap.put("ISO-8859-1",      "ISO8859_1"); 
-        fIANA2JavaMap.put("ISO-IR-100",      "ISO8859_1");
-        fIANA2JavaMap.put("ISO_8859-1",      "ISO8859_1");
-        fIANA2JavaMap.put("LATIN1",      "ISO8859_1");
-        fIANA2JavaMap.put("CSISOLATIN1",      "ISO8859_1");
-        fIANA2JavaMap.put("L1",      "ISO8859_1");
-        fIANA2JavaMap.put("IBM819",      "ISO8859_1");
-        fIANA2JavaMap.put("CP819",      "ISO8859_1");
+        fIANA2JavaMap.put("ISO-8859-1", "ISO8859_1");
+        fIANA2JavaMap.put("ISO-IR-100", "ISO8859_1");
+        fIANA2JavaMap.put("ISO_8859-1", "ISO8859_1");
+        fIANA2JavaMap.put("LATIN1", "ISO8859_1");
+        fIANA2JavaMap.put("CSISOLATIN1", "ISO8859_1");
+        fIANA2JavaMap.put("L1", "ISO8859_1");
+        fIANA2JavaMap.put("IBM819", "ISO8859_1");
+        fIANA2JavaMap.put("CP819", "ISO8859_1");
 
-        fIANA2JavaMap.put("ISO-8859-2",      "ISO8859_2"); 
-        fIANA2JavaMap.put("ISO-IR-101",      "ISO8859_2");
-        fIANA2JavaMap.put("ISO_8859-2",      "ISO8859_2");
-        fIANA2JavaMap.put("LATIN2",      "ISO8859_2");
-        fIANA2JavaMap.put("CSISOLATIN2",      "ISO8859_2");
-        fIANA2JavaMap.put("L2",      "ISO8859_2");
+        fIANA2JavaMap.put("ISO-8859-2", "ISO8859_2");
+        fIANA2JavaMap.put("ISO-IR-101", "ISO8859_2");
+        fIANA2JavaMap.put("ISO_8859-2", "ISO8859_2");
+        fIANA2JavaMap.put("LATIN2", "ISO8859_2");
+        fIANA2JavaMap.put("CSISOLATIN2", "ISO8859_2");
+        fIANA2JavaMap.put("L2", "ISO8859_2");
 
-        fIANA2JavaMap.put("ISO-8859-3",      "ISO8859_3"); 
-        fIANA2JavaMap.put("ISO-IR-109",      "ISO8859_3");
-        fIANA2JavaMap.put("ISO_8859-3",      "ISO8859_3");
-        fIANA2JavaMap.put("LATIN3",      "ISO8859_3");
-        fIANA2JavaMap.put("CSISOLATIN3",      "ISO8859_3");
-        fIANA2JavaMap.put("L3",      "ISO8859_3");
+        fIANA2JavaMap.put("ISO-8859-3", "ISO8859_3");
+        fIANA2JavaMap.put("ISO-IR-109", "ISO8859_3");
+        fIANA2JavaMap.put("ISO_8859-3", "ISO8859_3");
+        fIANA2JavaMap.put("LATIN3", "ISO8859_3");
+        fIANA2JavaMap.put("CSISOLATIN3", "ISO8859_3");
+        fIANA2JavaMap.put("L3", "ISO8859_3");
 
-        fIANA2JavaMap.put("ISO-8859-4",      "ISO8859_4"); 
-        fIANA2JavaMap.put("ISO-IR-110",      "ISO8859_4");
-        fIANA2JavaMap.put("ISO_8859-4",      "ISO8859_4");
-        fIANA2JavaMap.put("LATIN4",      "ISO8859_4");
-        fIANA2JavaMap.put("CSISOLATIN4",      "ISO8859_4");
-        fIANA2JavaMap.put("L4",      "ISO8859_4");
+        fIANA2JavaMap.put("ISO-8859-4", "ISO8859_4");
+        fIANA2JavaMap.put("ISO-IR-110", "ISO8859_4");
+        fIANA2JavaMap.put("ISO_8859-4", "ISO8859_4");
+        fIANA2JavaMap.put("LATIN4", "ISO8859_4");
+        fIANA2JavaMap.put("CSISOLATIN4", "ISO8859_4");
+        fIANA2JavaMap.put("L4", "ISO8859_4");
 
-        fIANA2JavaMap.put("ISO-8859-5",      "ISO8859_5"); 
-        fIANA2JavaMap.put("ISO-IR-144",      "ISO8859_5");
-        fIANA2JavaMap.put("ISO_8859-5",      "ISO8859_5");
-        fIANA2JavaMap.put("CYRILLIC",      "ISO8859_5");
-        fIANA2JavaMap.put("CSISOLATINCYRILLIC",      "ISO8859_5");
+        fIANA2JavaMap.put("ISO-8859-5", "ISO8859_5");
+        fIANA2JavaMap.put("ISO-IR-144", "ISO8859_5");
+        fIANA2JavaMap.put("ISO_8859-5", "ISO8859_5");
+        fIANA2JavaMap.put("CYRILLIC", "ISO8859_5");
+        fIANA2JavaMap.put("CSISOLATINCYRILLIC", "ISO8859_5");
 
-        fIANA2JavaMap.put("ISO-8859-6",      "ISO8859_6"); 
-        fIANA2JavaMap.put("ISO-IR-127",      "ISO8859_6");
-        fIANA2JavaMap.put("ISO_8859-6",      "ISO8859_6");
-        fIANA2JavaMap.put("ECMA-114",      "ISO8859_6");
-        fIANA2JavaMap.put("ASMO-708",      "ISO8859_6");
-        fIANA2JavaMap.put("ARABIC",      "ISO8859_6");
-        fIANA2JavaMap.put("CSISOLATINARABIC",      "ISO8859_6");
+        fIANA2JavaMap.put("ISO-8859-6", "ISO8859_6");
+        fIANA2JavaMap.put("ISO-IR-127", "ISO8859_6");
+        fIANA2JavaMap.put("ISO_8859-6", "ISO8859_6");
+        fIANA2JavaMap.put("ECMA-114", "ISO8859_6");
+        fIANA2JavaMap.put("ASMO-708", "ISO8859_6");
+        fIANA2JavaMap.put("ARABIC", "ISO8859_6");
+        fIANA2JavaMap.put("CSISOLATINARABIC", "ISO8859_6");
 
-        fIANA2JavaMap.put("ISO-8859-7",      "ISO8859_7"); 
-        fIANA2JavaMap.put("ISO-IR-126",      "ISO8859_7");
-        fIANA2JavaMap.put("ISO_8859-7",      "ISO8859_7");
-        fIANA2JavaMap.put("ELOT_928",      "ISO8859_7");
-        fIANA2JavaMap.put("ECMA-118",      "ISO8859_7");
-        fIANA2JavaMap.put("GREEK",      "ISO8859_7");
-        fIANA2JavaMap.put("CSISOLATINGREEK",      "ISO8859_7");
-        fIANA2JavaMap.put("GREEK8",      "ISO8859_7");
+        fIANA2JavaMap.put("ISO-8859-7", "ISO8859_7");
+        fIANA2JavaMap.put("ISO-IR-126", "ISO8859_7");
+        fIANA2JavaMap.put("ISO_8859-7", "ISO8859_7");
+        fIANA2JavaMap.put("ELOT_928", "ISO8859_7");
+        fIANA2JavaMap.put("ECMA-118", "ISO8859_7");
+        fIANA2JavaMap.put("GREEK", "ISO8859_7");
+        fIANA2JavaMap.put("CSISOLATINGREEK", "ISO8859_7");
+        fIANA2JavaMap.put("GREEK8", "ISO8859_7");
 
-        fIANA2JavaMap.put("ISO-8859-8",      "ISO8859_8"); 
-        fIANA2JavaMap.put("ISO-8859-8-I",      "ISO8859_8"); // added since this encoding only differs w.r.t. presentation 
-        fIANA2JavaMap.put("ISO-IR-138",      "ISO8859_8");
-        fIANA2JavaMap.put("ISO_8859-8",      "ISO8859_8");
-        fIANA2JavaMap.put("HEBREW",      "ISO8859_8");
-        fIANA2JavaMap.put("CSISOLATINHEBREW",      "ISO8859_8");
+        fIANA2JavaMap.put("ISO-8859-8", "ISO8859_8");
+        fIANA2JavaMap.put("ISO-8859-8-I", "ISO8859_8"); // added since this encoding only differs w.r.t. presentation
+        fIANA2JavaMap.put("ISO-IR-138", "ISO8859_8");
+        fIANA2JavaMap.put("ISO_8859-8", "ISO8859_8");
+        fIANA2JavaMap.put("HEBREW", "ISO8859_8");
+        fIANA2JavaMap.put("CSISOLATINHEBREW", "ISO8859_8");
 
-        fIANA2JavaMap.put("ISO-8859-9",      "ISO8859_9"); 
-        fIANA2JavaMap.put("ISO-IR-148",      "ISO8859_9");
-        fIANA2JavaMap.put("ISO_8859-9",      "ISO8859_9");
-        fIANA2JavaMap.put("LATIN5",      "ISO8859_9");
-        fIANA2JavaMap.put("CSISOLATIN5",      "ISO8859_9");
-        fIANA2JavaMap.put("L5",      "ISO8859_9");
+        fIANA2JavaMap.put("ISO-8859-9", "ISO8859_9");
+        fIANA2JavaMap.put("ISO-IR-148", "ISO8859_9");
+        fIANA2JavaMap.put("ISO_8859-9", "ISO8859_9");
+        fIANA2JavaMap.put("LATIN5", "ISO8859_9");
+        fIANA2JavaMap.put("CSISOLATIN5", "ISO8859_9");
+        fIANA2JavaMap.put("L5", "ISO8859_9");
 
-        fIANA2JavaMap.put("ISO-8859-13",      "ISO8859_13"); 
-        
-        fIANA2JavaMap.put("ISO-8859-15",      "ISO8859_15_FDIS"); 
-        fIANA2JavaMap.put("ISO_8859-15",      "ISO8859_15_FDIS");
-        fIANA2JavaMap.put("LATIN-9",          "ISO8859_15_FDIS"); 
+        fIANA2JavaMap.put("ISO-8859-13", "ISO8859_13");
 
-        fIANA2JavaMap.put("KOI8-R",          "KOI8_R");
-        fIANA2JavaMap.put("CSKOI8R",          "KOI8_R");
-        fIANA2JavaMap.put("US-ASCII",        "ASCII"); 
-        fIANA2JavaMap.put("ISO-IR-6",        "ASCII");
-        fIANA2JavaMap.put("ANSI_X3.4-1968",        "ASCII");
-        fIANA2JavaMap.put("ANSI_X3.4-1986",        "ASCII");
-        fIANA2JavaMap.put("ISO_646.IRV:1991",        "ASCII");
-        fIANA2JavaMap.put("ASCII",        "ASCII");
-        fIANA2JavaMap.put("CSASCII",        "ASCII");
-        fIANA2JavaMap.put("ISO646-US",        "ASCII");
-        fIANA2JavaMap.put("US",        "ASCII");
-        fIANA2JavaMap.put("IBM367",        "ASCII");
-        fIANA2JavaMap.put("CP367",        "ASCII");
-        fIANA2JavaMap.put("UTF-8",           "UTF8");
-        fIANA2JavaMap.put("UTF-16",           "UTF-16");
-        fIANA2JavaMap.put("UTF-16BE",           "UnicodeBig");
-        fIANA2JavaMap.put("UTF-16LE",           "UnicodeLittle");
+        fIANA2JavaMap.put("ISO-8859-15", "ISO8859_15_FDIS");
+        fIANA2JavaMap.put("ISO_8859-15", "ISO8859_15_FDIS");
+        fIANA2JavaMap.put("LATIN-9", "ISO8859_15_FDIS");
+
+        fIANA2JavaMap.put("KOI8-R", "KOI8_R");
+        fIANA2JavaMap.put("CSKOI8R", "KOI8_R");
+        fIANA2JavaMap.put("US-ASCII", "ASCII");
+        fIANA2JavaMap.put("ISO-IR-6", "ASCII");
+        fIANA2JavaMap.put("ANSI_X3.4-1968", "ASCII");
+        fIANA2JavaMap.put("ANSI_X3.4-1986", "ASCII");
+        fIANA2JavaMap.put("ISO_646.IRV:1991", "ASCII");
+        fIANA2JavaMap.put("ASCII", "ASCII");
+        fIANA2JavaMap.put("CSASCII", "ASCII");
+        fIANA2JavaMap.put("ISO646-US", "ASCII");
+        fIANA2JavaMap.put("US", "ASCII");
+        fIANA2JavaMap.put("IBM367", "ASCII");
+        fIANA2JavaMap.put("CP367", "ASCII");
+        fIANA2JavaMap.put("UTF-8", "UTF8");
+        fIANA2JavaMap.put("UTF-16", "UTF-16");
+        fIANA2JavaMap.put("UTF-16BE", "UnicodeBig");
+        fIANA2JavaMap.put("UTF-16LE", "UnicodeLittle");
 
         // support for 1047, as proposed to be added to the 
         // IANA registry in 
         // http://lists.w3.org/Archives/Public/ietf-charset/2002JulSep/0049.html
-        fIANA2JavaMap.put("IBM-1047",    "Cp1047");
-        fIANA2JavaMap.put("IBM1047",    "Cp1047");
-        fIANA2JavaMap.put("CP1047",    "Cp1047");
+        fIANA2JavaMap.put("IBM-1047", "Cp1047");
+        fIANA2JavaMap.put("IBM1047", "Cp1047");
+        fIANA2JavaMap.put("CP1047", "Cp1047");
 
         // Adding new aliases as proposed in
         // http://lists.w3.org/Archives/Public/ietf-charset/2002JulSep/0058.html
-        fIANA2JavaMap.put("IBM-37",    "CP037");
-        fIANA2JavaMap.put("IBM-273",    "CP273");
-        fIANA2JavaMap.put("IBM-277",    "CP277");
-        fIANA2JavaMap.put("IBM-278",    "CP278");
-        fIANA2JavaMap.put("IBM-280",    "CP280");
-        fIANA2JavaMap.put("IBM-284",    "CP284");
-        fIANA2JavaMap.put("IBM-285",    "CP285");
-        fIANA2JavaMap.put("IBM-290",    "CP290");
-        fIANA2JavaMap.put("IBM-297",    "CP297");
-        fIANA2JavaMap.put("IBM-420",    "CP420");
-        fIANA2JavaMap.put("IBM-424",    "CP424");
-        fIANA2JavaMap.put("IBM-437",    "CP437");
-        fIANA2JavaMap.put("IBM-500",    "CP500");
-        fIANA2JavaMap.put("IBM-775",    "CP775");
-        fIANA2JavaMap.put("IBM-850",    "CP850");
-        fIANA2JavaMap.put("IBM-852",    "CP852");
-        fIANA2JavaMap.put("IBM-855",    "CP855");
-        fIANA2JavaMap.put("IBM-857",    "CP857");
-        fIANA2JavaMap.put("IBM-858",    "CP858");
-        fIANA2JavaMap.put("IBM-860",    "CP860");
-        fIANA2JavaMap.put("IBM-861",    "CP861");
-        fIANA2JavaMap.put("IBM-862",    "CP862");
-        fIANA2JavaMap.put("IBM-863",    "CP863");
-        fIANA2JavaMap.put("IBM-864",    "CP864");
-        fIANA2JavaMap.put("IBM-865",    "CP865");
-        fIANA2JavaMap.put("IBM-866",    "CP866");
-        fIANA2JavaMap.put("IBM-868",    "CP868");
-        fIANA2JavaMap.put("IBM-869",    "CP869");
-        fIANA2JavaMap.put("IBM-870",    "CP870");
-        fIANA2JavaMap.put("IBM-871",    "CP871");
-        fIANA2JavaMap.put("IBM-918",    "CP918");
-        fIANA2JavaMap.put("IBM-924",    "CP924");
-        fIANA2JavaMap.put("IBM-1026",    "CP1026");
-        fIANA2JavaMap.put("IBM-1140",    "Cp1140");
-        fIANA2JavaMap.put("IBM-1141",    "Cp1141");
-        fIANA2JavaMap.put("IBM-1142",    "Cp1142");
-        fIANA2JavaMap.put("IBM-1143",    "Cp1143");
-        fIANA2JavaMap.put("IBM-1144",    "Cp1144");
-        fIANA2JavaMap.put("IBM-1145",    "Cp1145");
-        fIANA2JavaMap.put("IBM-1146",    "Cp1146");
-        fIANA2JavaMap.put("IBM-1147",    "Cp1147");
-        fIANA2JavaMap.put("IBM-1148",    "Cp1148");
-        fIANA2JavaMap.put("IBM-1149",    "Cp1149");
-        fIANA2JavaMap.put("IBM-819",      "ISO8859_1");
-        fIANA2JavaMap.put("IBM-367",        "ASCII");
+        fIANA2JavaMap.put("IBM-37", "CP037");
+        fIANA2JavaMap.put("IBM-273", "CP273");
+        fIANA2JavaMap.put("IBM-277", "CP277");
+        fIANA2JavaMap.put("IBM-278", "CP278");
+        fIANA2JavaMap.put("IBM-280", "CP280");
+        fIANA2JavaMap.put("IBM-284", "CP284");
+        fIANA2JavaMap.put("IBM-285", "CP285");
+        fIANA2JavaMap.put("IBM-290", "CP290");
+        fIANA2JavaMap.put("IBM-297", "CP297");
+        fIANA2JavaMap.put("IBM-420", "CP420");
+        fIANA2JavaMap.put("IBM-424", "CP424");
+        fIANA2JavaMap.put("IBM-437", "CP437");
+        fIANA2JavaMap.put("IBM-500", "CP500");
+        fIANA2JavaMap.put("IBM-775", "CP775");
+        fIANA2JavaMap.put("IBM-850", "CP850");
+        fIANA2JavaMap.put("IBM-852", "CP852");
+        fIANA2JavaMap.put("IBM-855", "CP855");
+        fIANA2JavaMap.put("IBM-857", "CP857");
+        fIANA2JavaMap.put("IBM-858", "CP858");
+        fIANA2JavaMap.put("IBM-860", "CP860");
+        fIANA2JavaMap.put("IBM-861", "CP861");
+        fIANA2JavaMap.put("IBM-862", "CP862");
+        fIANA2JavaMap.put("IBM-863", "CP863");
+        fIANA2JavaMap.put("IBM-864", "CP864");
+        fIANA2JavaMap.put("IBM-865", "CP865");
+        fIANA2JavaMap.put("IBM-866", "CP866");
+        fIANA2JavaMap.put("IBM-868", "CP868");
+        fIANA2JavaMap.put("IBM-869", "CP869");
+        fIANA2JavaMap.put("IBM-870", "CP870");
+        fIANA2JavaMap.put("IBM-871", "CP871");
+        fIANA2JavaMap.put("IBM-918", "CP918");
+        fIANA2JavaMap.put("IBM-924", "CP924");
+        fIANA2JavaMap.put("IBM-1026", "CP1026");
+        fIANA2JavaMap.put("IBM-1140", "Cp1140");
+        fIANA2JavaMap.put("IBM-1141", "Cp1141");
+        fIANA2JavaMap.put("IBM-1142", "Cp1142");
+        fIANA2JavaMap.put("IBM-1143", "Cp1143");
+        fIANA2JavaMap.put("IBM-1144", "Cp1144");
+        fIANA2JavaMap.put("IBM-1145", "Cp1145");
+        fIANA2JavaMap.put("IBM-1146", "Cp1146");
+        fIANA2JavaMap.put("IBM-1147", "Cp1147");
+        fIANA2JavaMap.put("IBM-1148", "Cp1148");
+        fIANA2JavaMap.put("IBM-1149", "Cp1149");
+        fIANA2JavaMap.put("IBM-819", "ISO8859_1");
+        fIANA2JavaMap.put("IBM-367", "ASCII");
 
         // REVISIT:
         //   j:CNS11643 -> EUC-TW?
         //   ISO-2022-CN? ISO-2022-CN-EXT?
-                                                
+
         // add Java to IANA encoding mappings
         //fJava2IANAMap.put("8859_1",    "US-ASCII"); // ?
-        fJava2IANAMap.put("ISO8859_1",    "ISO-8859-1");
-        fJava2IANAMap.put("ISO8859_2",    "ISO-8859-2");
-        fJava2IANAMap.put("ISO8859_3",    "ISO-8859-3");
-        fJava2IANAMap.put("ISO8859_4",    "ISO-8859-4");
-        fJava2IANAMap.put("ISO8859_5",    "ISO-8859-5");
-        fJava2IANAMap.put("ISO8859_6",    "ISO-8859-6");
-        fJava2IANAMap.put("ISO8859_7",    "ISO-8859-7");
-        fJava2IANAMap.put("ISO8859_8",    "ISO-8859-8");
-        fJava2IANAMap.put("ISO8859_9",    "ISO-8859-9");
-        fJava2IANAMap.put("ISO8859_13",    "ISO-8859-13");
-        fJava2IANAMap.put("ISO8859_15",    "ISO-8859-15");
-        fJava2IANAMap.put("ISO8859_15_FDIS",    "ISO-8859-15");
-        fJava2IANAMap.put("Big5",      "BIG5");
-        fJava2IANAMap.put("CP037",     "EBCDIC-CP-US");
-        fJava2IANAMap.put("CP273",     "IBM273");
-        fJava2IANAMap.put("CP277",     "EBCDIC-CP-DK");
-        fJava2IANAMap.put("CP278",     "EBCDIC-CP-FI");
-        fJava2IANAMap.put("CP280",     "EBCDIC-CP-IT");
-        fJava2IANAMap.put("CP284",     "EBCDIC-CP-ES");
-        fJava2IANAMap.put("CP285",     "EBCDIC-CP-GB");
-        fJava2IANAMap.put("CP290",     "EBCDIC-JP-KANA");
-        fJava2IANAMap.put("CP297",     "EBCDIC-CP-FR");
-        fJava2IANAMap.put("CP420",     "EBCDIC-CP-AR1");
-        fJava2IANAMap.put("CP424",     "EBCDIC-CP-HE");
-        fJava2IANAMap.put("CP437",     "IBM437");
-        fJava2IANAMap.put("CP500",     "EBCDIC-CP-CH");
-        fJava2IANAMap.put("CP775",     "IBM775");
-        fJava2IANAMap.put("CP850",     "IBM850");
-        fJava2IANAMap.put("CP852",     "IBM852");
-        fJava2IANAMap.put("CP855",     "IBM855");
-        fJava2IANAMap.put("CP857",     "IBM857");
-        fJava2IANAMap.put("CP858",     "IBM00858");
-        fJava2IANAMap.put("CP860",     "IBM860");
-        fJava2IANAMap.put("CP861",     "IBM861");
-        fJava2IANAMap.put("CP862",     "IBM862");
-        fJava2IANAMap.put("CP863",     "IBM863");
-        fJava2IANAMap.put("CP864",     "IBM864");
-        fJava2IANAMap.put("CP865",     "IBM865");
-        fJava2IANAMap.put("CP866",     "IBM866");
-        fJava2IANAMap.put("CP868",     "IBM868");
-        fJava2IANAMap.put("CP869",     "IBM869");
-        fJava2IANAMap.put("CP870",     "EBCDIC-CP-ROECE");
-        fJava2IANAMap.put("CP871",     "EBCDIC-CP-IS");
-        fJava2IANAMap.put("CP918",     "EBCDIC-CP-AR2");
-        fJava2IANAMap.put("CP924",     "IBM00924");
-        fJava2IANAMap.put("CP1026",     "IBM1026");
-        fJava2IANAMap.put("Cp01140",     "IBM01140");
-        fJava2IANAMap.put("Cp01141",     "IBM01141");
-        fJava2IANAMap.put("Cp01142",     "IBM01142");
-        fJava2IANAMap.put("Cp01143",     "IBM01143");
-        fJava2IANAMap.put("Cp01144",     "IBM01144");
-        fJava2IANAMap.put("Cp01145",     "IBM01145");
-        fJava2IANAMap.put("Cp01146",     "IBM01146");
-        fJava2IANAMap.put("Cp01147",     "IBM01147");
-        fJava2IANAMap.put("Cp01148",     "IBM01148");
-        fJava2IANAMap.put("Cp01149",     "IBM01149");
-        fJava2IANAMap.put("EUCJIS",    "EUC-JP");
-        fJava2IANAMap.put("KS_C_5601-1987",          "KS_C_5601-1987");
-        fJava2IANAMap.put("GB2312",    "GB2312");
+        fJava2IANAMap.put("ISO8859_1", "ISO-8859-1");
+        fJava2IANAMap.put("ISO8859_2", "ISO-8859-2");
+        fJava2IANAMap.put("ISO8859_3", "ISO-8859-3");
+        fJava2IANAMap.put("ISO8859_4", "ISO-8859-4");
+        fJava2IANAMap.put("ISO8859_5", "ISO-8859-5");
+        fJava2IANAMap.put("ISO8859_6", "ISO-8859-6");
+        fJava2IANAMap.put("ISO8859_7", "ISO-8859-7");
+        fJava2IANAMap.put("ISO8859_8", "ISO-8859-8");
+        fJava2IANAMap.put("ISO8859_9", "ISO-8859-9");
+        fJava2IANAMap.put("ISO8859_13", "ISO-8859-13");
+        fJava2IANAMap.put("ISO8859_15", "ISO-8859-15");
+        fJava2IANAMap.put("ISO8859_15_FDIS", "ISO-8859-15");
+        fJava2IANAMap.put("Big5", "BIG5");
+        fJava2IANAMap.put("CP037", "EBCDIC-CP-US");
+        fJava2IANAMap.put("CP273", "IBM273");
+        fJava2IANAMap.put("CP277", "EBCDIC-CP-DK");
+        fJava2IANAMap.put("CP278", "EBCDIC-CP-FI");
+        fJava2IANAMap.put("CP280", "EBCDIC-CP-IT");
+        fJava2IANAMap.put("CP284", "EBCDIC-CP-ES");
+        fJava2IANAMap.put("CP285", "EBCDIC-CP-GB");
+        fJava2IANAMap.put("CP290", "EBCDIC-JP-KANA");
+        fJava2IANAMap.put("CP297", "EBCDIC-CP-FR");
+        fJava2IANAMap.put("CP420", "EBCDIC-CP-AR1");
+        fJava2IANAMap.put("CP424", "EBCDIC-CP-HE");
+        fJava2IANAMap.put("CP437", "IBM437");
+        fJava2IANAMap.put("CP500", "EBCDIC-CP-CH");
+        fJava2IANAMap.put("CP775", "IBM775");
+        fJava2IANAMap.put("CP850", "IBM850");
+        fJava2IANAMap.put("CP852", "IBM852");
+        fJava2IANAMap.put("CP855", "IBM855");
+        fJava2IANAMap.put("CP857", "IBM857");
+        fJava2IANAMap.put("CP858", "IBM00858");
+        fJava2IANAMap.put("CP860", "IBM860");
+        fJava2IANAMap.put("CP861", "IBM861");
+        fJava2IANAMap.put("CP862", "IBM862");
+        fJava2IANAMap.put("CP863", "IBM863");
+        fJava2IANAMap.put("CP864", "IBM864");
+        fJava2IANAMap.put("CP865", "IBM865");
+        fJava2IANAMap.put("CP866", "IBM866");
+        fJava2IANAMap.put("CP868", "IBM868");
+        fJava2IANAMap.put("CP869", "IBM869");
+        fJava2IANAMap.put("CP870", "EBCDIC-CP-ROECE");
+        fJava2IANAMap.put("CP871", "EBCDIC-CP-IS");
+        fJava2IANAMap.put("CP918", "EBCDIC-CP-AR2");
+        fJava2IANAMap.put("CP924", "IBM00924");
+        fJava2IANAMap.put("CP1026", "IBM1026");
+        fJava2IANAMap.put("Cp01140", "IBM01140");
+        fJava2IANAMap.put("Cp01141", "IBM01141");
+        fJava2IANAMap.put("Cp01142", "IBM01142");
+        fJava2IANAMap.put("Cp01143", "IBM01143");
+        fJava2IANAMap.put("Cp01144", "IBM01144");
+        fJava2IANAMap.put("Cp01145", "IBM01145");
+        fJava2IANAMap.put("Cp01146", "IBM01146");
+        fJava2IANAMap.put("Cp01147", "IBM01147");
+        fJava2IANAMap.put("Cp01148", "IBM01148");
+        fJava2IANAMap.put("Cp01149", "IBM01149");
+        fJava2IANAMap.put("EUCJIS", "EUC-JP");
+        fJava2IANAMap.put("KS_C_5601-1987", "KS_C_5601-1987");
+        fJava2IANAMap.put("GB2312", "GB2312");
         fJava2IANAMap.put("ISO2022KR", "ISO-2022-KR");
         fJava2IANAMap.put("ISO2022CN", "ISO-2022-CN");
-        fJava2IANAMap.put("JIS",       "ISO-2022-JP");
-        fJava2IANAMap.put("KOI8_R",    "KOI8-R");
-        fJava2IANAMap.put("KSC5601",   "EUC-KR");
-        fJava2IANAMap.put("GB18030",      "GB18030");
-        fJava2IANAMap.put("GBK",       "GBK");
-        fJava2IANAMap.put("SJIS",      "SHIFT_JIS");
-        fJava2IANAMap.put("MS932",      "WINDOWS-31J");
-        fJava2IANAMap.put("UTF8",      "UTF-8");
-        fJava2IANAMap.put("Unicode",   "UTF-16");
-        fJava2IANAMap.put("UnicodeBig",   "UTF-16BE");
-        fJava2IANAMap.put("UnicodeLittle",   "UTF-16LE");
-        fJava2IANAMap.put("JIS0201",  "X0201");
-        fJava2IANAMap.put("JIS0208",  "X0208");
-        fJava2IANAMap.put("JIS0212",  "ISO-IR-159");
+        fJava2IANAMap.put("JIS", "ISO-2022-JP");
+        fJava2IANAMap.put("KOI8_R", "KOI8-R");
+        fJava2IANAMap.put("KSC5601", "EUC-KR");
+        fJava2IANAMap.put("GB18030", "GB18030");
+        fJava2IANAMap.put("GBK", "GBK");
+        fJava2IANAMap.put("SJIS", "SHIFT_JIS");
+        fJava2IANAMap.put("MS932", "WINDOWS-31J");
+        fJava2IANAMap.put("UTF8", "UTF-8");
+        fJava2IANAMap.put("Unicode", "UTF-16");
+        fJava2IANAMap.put("UnicodeBig", "UTF-16BE");
+        fJava2IANAMap.put("UnicodeLittle", "UTF-16LE");
+        fJava2IANAMap.put("JIS0201", "X0201");
+        fJava2IANAMap.put("JIS0208", "X0208");
+        fJava2IANAMap.put("JIS0212", "ISO-IR-159");
 
         // proposed addition (see above for details):
-        fJava2IANAMap.put("CP1047",    "IBM1047");
+        fJava2IANAMap.put("CP1047", "IBM1047");
 
     } // <clinit>()
 
@@ -952,8 +955,11 @@
     // Constructors
     //
 
-    /** Default constructor. */
-    public EncodingMap() {}
+    /**
+     * Default constructor.
+     */
+    public EncodingMap() {
+    }
 
     //
     // Public static methods
@@ -961,60 +967,60 @@
 
     /**
      * Adds an IANA to Java encoding name mapping.
-     * 
+     *
      * @param ianaEncoding The IANA encoding name.
      * @param javaEncoding The Java encoding name.
      */
-    public static void putIANA2JavaMapping(String ianaEncoding, 
+    public static void putIANA2JavaMapping(String ianaEncoding,
                                            String javaEncoding) {
         fIANA2JavaMap.put(ianaEncoding, javaEncoding);
     } // putIANA2JavaMapping(String,String)
 
     /**
      * Returns the Java encoding name for the specified IANA encoding name.
-     * 
+     *
      * @param ianaEncoding The IANA encoding name.
      */
     public static String getIANA2JavaMapping(String ianaEncoding) {
-        return (String)fIANA2JavaMap.get(ianaEncoding);
+        return (String) fIANA2JavaMap.get(ianaEncoding);
     } // getIANA2JavaMapping(String):String
 
     /**
      * Removes an IANA to Java encoding name mapping.
-     * 
+     *
      * @param ianaEncoding The IANA encoding name.
      */
     public static String removeIANA2JavaMapping(String ianaEncoding) {
-        return (String)fIANA2JavaMap.remove(ianaEncoding);
+        return (String) fIANA2JavaMap.remove(ianaEncoding);
     } // removeIANA2JavaMapping(String):String
 
     /**
      * Adds a Java to IANA encoding name mapping.
-     * 
+     *
      * @param javaEncoding The Java encoding name.
      * @param ianaEncoding The IANA encoding name.
      */
-    public static void putJava2IANAMapping(String javaEncoding, 
+    public static void putJava2IANAMapping(String javaEncoding,
                                            String ianaEncoding) {
         fJava2IANAMap.put(javaEncoding, ianaEncoding);
     } // putJava2IANAMapping(String,String)
 
     /**
      * Returns the IANA encoding name for the specified Java encoding name.
-     * 
+     *
      * @param javaEncoding The Java encoding name.
      */
     public static String getJava2IANAMapping(String javaEncoding) {
-        return (String)fJava2IANAMap.get(javaEncoding);
+        return (String) fJava2IANAMap.get(javaEncoding);
     } // getJava2IANAMapping(String):String
 
     /**
      * Removes a Java to IANA encoding name mapping.
-     * 
+     *
      * @param javaEncoding The Java encoding name.
      */
     public static String removeJava2IANAMapping(String javaEncoding) {
-        return (String)fJava2IANAMap.remove(javaEncoding);
+        return (String) fJava2IANAMap.remove(javaEncoding);
     } // removeJava2IANAMapping
 
 } // class EncodingMap
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java
index 81ac42f..e60e814 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java
@@ -17,8 +17,7 @@
 
 package org.apache.struts2.jasper.xmlparser;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.Constants;
 import org.apache.struts2.jasper.JasperException;
 import org.apache.struts2.jasper.compiler.Localizer;
@@ -64,43 +63,42 @@
      * that corresponds to the root node of the document tree.
      *
      * @param uri URI of the XML document being parsed
-     * @param is Input source containing the deployment descriptor
-     *
-     * @exception JasperException if an input/output error occurs
-     * @exception JasperException if a parsing error occurs
+     * @param is  Input source containing the deployment descriptor
+     * @throws JasperException if an input/output error occurs
+     * @throws JasperException if a parsing error occurs
      */
     public TreeNode parseXMLDocument(String uri, InputSource is)
-        throws JasperException {
+            throws JasperException {
 
         Document document = null;
 
         // Perform an XML parse of this document, via JAXP
         try {
             DocumentBuilderFactory factory =
-                DocumentBuilderFactory.newInstance();
+                    DocumentBuilderFactory.newInstance();
             factory.setNamespaceAware(true);
             factory.setValidating(validating);
             DocumentBuilder builder = factory.newDocumentBuilder();
             builder.setEntityResolver(entityResolver);
             builder.setErrorHandler(errorHandler);
             document = builder.parse(is);
-	} catch (ParserConfigurationException ex) {
+        } catch (ParserConfigurationException ex) {
             throw new JasperException
-                (Localizer.getMessage("jsp.error.parse.xml", uri), ex);
-	} catch (SAXParseException ex) {
+                    (Localizer.getMessage("jsp.error.parse.xml", uri), ex);
+        } catch (SAXParseException ex) {
             throw new JasperException
-                (Localizer.getMessage("jsp.error.parse.xml.line",
-				      uri,
-				      Integer.toString(ex.getLineNumber()),
-				      Integer.toString(ex.getColumnNumber())),
-		 ex);
-	} catch (SAXException sx) {
+                    (Localizer.getMessage("jsp.error.parse.xml.line",
+                            uri,
+                            Integer.toString(ex.getLineNumber()),
+                            Integer.toString(ex.getColumnNumber())),
+                            ex);
+        } catch (SAXException sx) {
             throw new JasperException
-                (Localizer.getMessage("jsp.error.parse.xml", uri), sx);
+                    (Localizer.getMessage("jsp.error.parse.xml", uri), sx);
         } catch (IOException io) {
             throw new JasperException
-                (Localizer.getMessage("jsp.error.parse.xml", uri), io);
-	}
+                    (Localizer.getMessage("jsp.error.parse.xml", uri), io);
+        }
 
         // Convert the resulting document to a graph of TreeNodes
         return (convert(null, document.getDocumentElement()));
@@ -112,10 +110,9 @@
      * that corresponds to the root node of the document tree.
      *
      * @param uri URI of the XML document being parsed
-     * @param is Input stream containing the deployment descriptor
-     *
-     * @exception JasperException if an input/output error occurs
-     * @exception JasperException if a parsing error occurs
+     * @param is  Input stream containing the deployment descriptor
+     * @throws JasperException if an input/output error occurs
+     * @throws JasperException if a parsing error occurs
      */
     public TreeNode parseXMLDocument(String uri, InputStream is)
             throws JasperException {
@@ -132,7 +129,7 @@
      * including processing all of the attributes and children nodes.
      *
      * @param parent The parent TreeNode (if any) for the new TreeNode
-     * @param node The XML document Node to be converted
+     * @param node   The XML document Node to be converted
      */
     protected TreeNode convert(TreeNode parent, Node node) {
 
@@ -146,7 +143,7 @@
             for (int i = 0; i < n; i++) {
                 Node attribute = attributes.item(i);
                 treeNode.addAttribute(attribute.getNodeName(),
-                                      attribute.getNodeValue());
+                        attribute.getNodeValue());
             }
         }
 
@@ -170,7 +167,7 @@
                 }
             }
         }
-        
+
         // Return the completed TreeNode graph
         return (treeNode);
     }
@@ -197,7 +194,7 @@
                 return isrc;
             }
         }
-        Log log = LogFactory.getLog(MyEntityResolver.class);
+        com.opensymphony.xwork2.util.logging.Logger log = LoggerFactory.getLogger(MyEntityResolver.class);
         if (log.isDebugEnabled())
             log.debug("Resolve entity failed" + publicId + " " + systemId);
         log.error(Localizer.getMessage("jsp.error.parse.xml.invalidPublicId",
@@ -209,7 +206,7 @@
 class MyErrorHandler implements ErrorHandler {
 
     public void warning(SAXParseException ex) throws SAXException {
-        Log log = LogFactory.getLog(MyErrorHandler.class);
+        com.opensymphony.xwork2.util.logging.Logger log = LoggerFactory.getLogger(MyErrorHandler.class);
         if (log.isDebugEnabled())
             log.debug("ParserUtils: warning ", ex);
         // We ignore warnings
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java
index 8a8cd2f..920d9f5 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java
@@ -30,22 +30,22 @@
  * strings used as identifiers are unique references. Multiple calls
  * to <code>addSymbol</code> will always return the same string
  * reference.
- * <p>
+ * <p/>
  * The symbol table performs the same task as <code>String.intern()</code>
  * with the following differences:
  * <ul>
- *  <li>
- *   A new string object does not need to be created in order to
- *   retrieve a unique reference. Symbols can be added by using
- *   a series of characters in a character array.
- *  </li>
- *  <li>
- *   Users of the symbol table can provide their own symbol hashing
- *   implementation. For example, a simple string hashing algorithm
- *   may fail to produce a balanced set of hashcodes for symbols
- *   that are <em>mostly</em> unique. Strings with similar leading
- *   characters are especially prone to this poor hashing behavior.
- *  </li>
+ * <li>
+ * A new string object does not need to be created in order to
+ * retrieve a unique reference. Symbols can be added by using
+ * a series of characters in a character array.
+ * </li>
+ * <li>
+ * Users of the symbol table can provide their own symbol hashing
+ * implementation. For example, a simple string hashing algorithm
+ * may fail to produce a balanced set of hashcodes for symbols
+ * that are <em>mostly</em> unique. Strings with similar leading
+ * characters are especially prone to this poor hashing behavior.
+ * </li>
  * </ul>
  *
  * @author Andy Clark
@@ -57,14 +57,18 @@
     // Constants
     //
 
-    /** Default table size. */
+    /**
+     * Default table size.
+     */
     protected static final int TABLE_SIZE = 101;
 
     //
     // Data
     //
 
-    /** Buckets. */
+    /**
+     * Buckets.
+     */
     protected Entry[] fBuckets = null;
 
     // actual table size
@@ -74,12 +78,16 @@
     // Constructors
     //
 
-    /** Constructs a symbol table with a default number of buckets. */
+    /**
+     * Constructs a symbol table with a default number of buckets.
+     */
     public SymbolTable() {
         this(TABLE_SIZE);
     }
 
-    /** Constructs a symbol table with a specified number of buckets. */
+    /**
+     * Constructs a symbol table with a specified number of buckets.
+     */
     public SymbolTable(int tableSize) {
         fTableSize = tableSize;
         fBuckets = new Entry[fTableSize];
@@ -102,7 +110,8 @@
         // search for identical symbol
         int bucket = hash(symbol) % fTableSize;
         int length = symbol.length();
-        OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+        OUTER:
+        for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
             if (length == entry.characters.length) {
                 for (int i = 0; i < length; i++) {
                     if (symbol.charAt(i) != entry.characters[i]) {
@@ -134,7 +143,8 @@
 
         // search for identical symbol
         int bucket = hash(buffer, offset, length) % fTableSize;
-        OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+        OUTER:
+        for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
             if (length == entry.characters.length) {
                 for (int i = 0; i < length; i++) {
                     if (buffer[offset + i] != entry.characters[i]) {
@@ -203,7 +213,8 @@
         // search for identical symbol
         int bucket = hash(symbol) % fTableSize;
         int length = symbol.length();
-        OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+        OUTER:
+        for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
             if (length == entry.characters.length) {
                 for (int i = 0; i < length; i++) {
                     if (symbol.charAt(i) != entry.characters[i]) {
@@ -230,7 +241,8 @@
 
         // search for identical symbol
         int bucket = hash(buffer, offset, length) % fTableSize;
-        OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+        OUTER:
+        for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
             if (length == entry.characters.length) {
                 for (int i = 0; i < length; i++) {
                     if (buffer[offset + i] != entry.characters[i]) {
@@ -259,7 +271,9 @@
         // Data
         //
 
-        /** Symbol. */
+        /**
+         * Symbol.
+         */
         public String symbol;
 
         /**
@@ -268,7 +282,9 @@
          */
         public char[] characters;
 
-        /** The next entry. */
+        /**
+         * The next entry.
+         */
         public Entry next;
 
         //
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java
index 72262ab..6e82536 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java
@@ -28,7 +28,7 @@
  * parse of an XML document.  This class is used to represent a DOM tree
  * so that the XML parser's implementation of <code>org.w3c.dom</code> need
  * not be visible to the remainder of Jasper.
- * <p>
+ * <p/>
  * <strong>WARNING</strong> - Construction of a new tree, or modifications
  * to an existing one, are not thread-safe and such accesses must be
  * synchronized.
@@ -58,7 +58,7 @@
     /**
      * Construct a new node with the specified parent.
      *
-     * @param name The name of this node
+     * @param name   The name of this node
      * @param parent The node that is the parent of this node
      */
     public TreeNode(String name, TreeNode parent) {
@@ -113,7 +113,7 @@
      * Add an attribute to this node, replacing any existing attribute
      * with the same name.
      *
-     * @param name The attribute name to add
+     * @param name  The attribute name to add
      * @param value The new attribute value
      */
     public void addAttribute(String name, String value) {
@@ -305,9 +305,9 @@
      * Append to the specified StringBuffer a character representation of
      * this node, with the specified amount of indentation.
      *
-     * @param sb The StringBuffer to append to
+     * @param sb     The StringBuffer to append to
      * @param indent Number of characters of indentation
-     * @param node The TreeNode to be printed
+     * @param node   The TreeNode to be printed
      */
     protected void toString(StringBuffer sb, int indent,
                             TreeNode node) {
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java
index 5f8408d..058efbd 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java
@@ -17,30 +17,32 @@
 
 package org.apache.struts2.jasper.xmlparser;
 
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 
-/** 
+/**
  * Reader for UCS-2 and UCS-4 encodings.
  * (i.e., encodings from ISO-10646-UCS-(2|4)).
  *
  * @author Neil Graham, IBM
- *
  * @version $Id: UCSReader.java 466606 2006-10-21 23:07:12Z markt $
  */
 public class UCSReader extends Reader {
 
-    private org.apache.commons.logging.Log log=
-        org.apache.commons.logging.LogFactory.getLog( UCSReader.class );
-    
+    private Logger log = LoggerFactory.getLogger(UCSReader.class);
+
     //
     // Constants
     //
 
-    /** Default byte buffer size (8192, larger than that of ASCIIReader
+    /**
+     * Default byte buffer size (8192, larger than that of ASCIIReader
      * since it's reasonable to surmise that the average UCS-4-encoded
-     * file should be 4 times as large as the average ASCII-encoded file). 
+     * file should be 4 times as large as the average ASCII-encoded file).
      */
     public static final int DEFAULT_BUFFER_SIZE = 8192;
 
@@ -53,10 +55,14 @@
     // Data
     //
 
-    /** Input stream. */
+    /**
+     * Input stream.
+     */
     protected InputStream fInputStream;
 
-    /** Byte buffer. */
+    /**
+     * Byte buffer.
+     */
     protected byte[] fBuffer;
 
     // what kind of data we're dealing with
@@ -66,26 +72,26 @@
     // Constructors
     //
 
-    /** 
-     * Constructs an ASCII reader from the specified input stream 
+    /**
+     * Constructs an ASCII reader from the specified input stream
      * using the default buffer size.  The Endian-ness and whether this is
      * UCS-2 or UCS-4 needs also to be known in advance.
      *
      * @param inputStream The input stream.
-     * @param encoding One of UCS2LE, UCS2BE, UCS4LE or UCS4BE.
+     * @param encoding    One of UCS2LE, UCS2BE, UCS4LE or UCS4BE.
      */
     public UCSReader(InputStream inputStream, short encoding) {
         this(inputStream, DEFAULT_BUFFER_SIZE, encoding);
     } // <init>(InputStream, short)
 
-    /** 
-     * Constructs an ASCII reader from the specified input stream 
+    /**
+     * Constructs an ASCII reader from the specified input stream
      * and buffer size.  The Endian-ness and whether this is
      * UCS-2 or UCS-4 needs also to be known in advance.
      *
      * @param inputStream The input stream.
      * @param size        The initial buffer size.
-     * @param encoding One of UCS2LE, UCS2BE, UCS4LE or UCS4BE.
+     * @param encoding    One of UCS2LE, UCS2BE, UCS4LE or UCS4BE.
      */
     public UCSReader(InputStream inputStream, int size, short encoding) {
         fInputStream = inputStream;
@@ -100,24 +106,23 @@
     /**
      * Read a single character.  This method will block until a character is
      * available, an I/O error occurs, or the end of the stream is reached.
-     *
+     * <p/>
      * <p> Subclasses that intend to support efficient single-character input
      * should override this method.
      *
-     * @return     The character read, as an integer in the range 0 to 127
-     *             (<tt>0x00-0x7f</tt>), or -1 if the end of the stream has
-     *             been reached
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @return The character read, as an integer in the range 0 to 127
+     *         (<tt>0x00-0x7f</tt>), or -1 if the end of the stream has
+     *         been reached
+     * @throws IOException If an I/O error occurs
      */
-    public int read() throws IOException { 
+    public int read() throws IOException {
         int b0 = fInputStream.read() & 0xff;
         if (b0 == 0xff)
             return -1;
         int b1 = fInputStream.read() & 0xff;
         if (b1 == 0xff)
             return -1;
-        if(fEncoding >=4) {
+        if (fEncoding >= 4) {
             int b2 = fInputStream.read() & 0xff;
             if (b2 == 0xff)
                 return -1;
@@ -127,14 +132,14 @@
             if (log.isDebugEnabled())
                 log.debug("b0 is " + (b0 & 0xff) + " b1 " + (b1 & 0xff) + " b2 " + (b2 & 0xff) + " b3 " + (b3 & 0xff));
             if (fEncoding == UCS4BE)
-                return (b0<<24)+(b1<<16)+(b2<<8)+b3;
+                return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
             else
-                return (b3<<24)+(b2<<16)+(b1<<8)+b0;
+                return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0;
         } else { // UCS-2
             if (fEncoding == UCS2BE)
-                return (b0<<8)+b1;
+                return (b0 << 8) + b1;
             else
-                return (b1<<8)+b0;
+                return (b1 << 8) + b0;
         }
     } // read():int
 
@@ -143,68 +148,66 @@
      * until some input is available, an I/O error occurs, or the end of the
      * stream is reached.
      *
-     * @param      ch     Destination buffer
-     * @param      offset Offset at which to start storing characters
-     * @param      length Maximum number of characters to read
-     *
-     * @return     The number of characters read, or -1 if the end of the
-     *             stream has been reached
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @param ch     Destination buffer
+     * @param offset Offset at which to start storing characters
+     * @param length Maximum number of characters to read
+     * @return The number of characters read, or -1 if the end of the
+     *         stream has been reached
+     * @throws IOException If an I/O error occurs
      */
     public int read(char ch[], int offset, int length) throws IOException {
-        int byteLength = length << ((fEncoding >= 4)?2:1);
+        int byteLength = length << ((fEncoding >= 4) ? 2 : 1);
         if (byteLength > fBuffer.length) {
             byteLength = fBuffer.length;
         }
         int count = fInputStream.read(fBuffer, 0, byteLength);
-        if(count == -1) return -1;
+        if (count == -1) return -1;
         // try and make count be a multiple of the number of bytes we're looking for
-        if(fEncoding >= 4) { // BigEndian
+        if (fEncoding >= 4) { // BigEndian
             // this looks ugly, but it avoids an if at any rate...
             int numToRead = (4 - (count & 3) & 3);
-            for(int i=0; i<numToRead; i++) {
+            for (int i = 0; i < numToRead; i++) {
                 int charRead = fInputStream.read();
-                if(charRead == -1) { // end of input; something likely went wrong!A  Pad buffer with nulls.
-                    for (int j = i;j<numToRead; j++)
-                        fBuffer[count+j] = 0;
+                if (charRead == -1) { // end of input; something likely went wrong!A  Pad buffer with nulls.
+                    for (int j = i; j < numToRead; j++)
+                        fBuffer[count + j] = 0;
                     break;
                 } else {
-                    fBuffer[count+i] = (byte)charRead; 
+                    fBuffer[count + i] = (byte) charRead;
                 }
             }
             count += numToRead;
         } else {
             int numToRead = count & 1;
-            if(numToRead != 0) {
+            if (numToRead != 0) {
                 count++;
                 int charRead = fInputStream.read();
-                if(charRead == -1) { // end of input; something likely went wrong!A  Pad buffer with nulls.
+                if (charRead == -1) { // end of input; something likely went wrong!A  Pad buffer with nulls.
                     fBuffer[count] = 0;
                 } else {
-                    fBuffer[count] = (byte)charRead;
+                    fBuffer[count] = (byte) charRead;
                 }
             }
         }
 
         // now count is a multiple of the right number of bytes
-        int numChars = count >> ((fEncoding >= 4)?2:1);
+        int numChars = count >> ((fEncoding >= 4) ? 2 : 1);
         int curPos = 0;
         for (int i = 0; i < numChars; i++) {
             int b0 = fBuffer[curPos++] & 0xff;
             int b1 = fBuffer[curPos++] & 0xff;
-            if(fEncoding >=4) {
+            if (fEncoding >= 4) {
                 int b2 = fBuffer[curPos++] & 0xff;
                 int b3 = fBuffer[curPos++] & 0xff;
                 if (fEncoding == UCS4BE)
-                    ch[offset+i] = (char)((b0<<24)+(b1<<16)+(b2<<8)+b3);
+                    ch[offset + i] = (char) ((b0 << 24) + (b1 << 16) + (b2 << 8) + b3);
                 else
-                    ch[offset+i] = (char)((b3<<24)+(b2<<16)+(b1<<8)+b0);
+                    ch[offset + i] = (char) ((b3 << 24) + (b2 << 16) + (b1 << 8) + b0);
             } else { // UCS-2
                 if (fEncoding == UCS2BE)
-                    ch[offset+i] = (char)((b0<<8)+b1);
+                    ch[offset + i] = (char) ((b0 << 8) + b1);
                 else
-                    ch[offset+i] = (char)((b1<<8)+b0);
+                    ch[offset + i] = (char) ((b1 << 8) + b0);
             }
         }
         return numChars;
@@ -214,11 +217,9 @@
      * Skip characters.  This method will block until some characters are
      * available, an I/O error occurs, or the end of the stream is reached.
      *
-     * @param  n  The number of characters to skip
-     *
-     * @return    The number of characters actually skipped
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @param n The number of characters to skip
+     * @return The number of characters actually skipped
+     * @throws IOException If an I/O error occurs
      */
     public long skip(long n) throws IOException {
         // charWidth will represent the number of bits to move
@@ -227,9 +228,9 @@
         // The trick with &'ing, as with elsewhere in this dcode, is
         // intended to avoid an expensive use of / that might not be optimized
         // away.
-        int charWidth = (fEncoding >=4)?2:1;
-        long bytesSkipped = fInputStream.skip(n<<charWidth);
-        if((bytesSkipped & (charWidth | 1)) == 0) return bytesSkipped >> charWidth;
+        int charWidth = (fEncoding >= 4) ? 2 : 1;
+        long bytesSkipped = fInputStream.skip(n << charWidth);
+        if ((bytesSkipped & (charWidth | 1)) == 0) return bytesSkipped >> charWidth;
         return (bytesSkipped >> charWidth) + 1;
     } // skip(long):long
 
@@ -237,20 +238,19 @@
      * Tell whether this stream is ready to be read.
      *
      * @return True if the next read() is guaranteed not to block for input,
-     * false otherwise.  Note that returning false does not guarantee that the
-     * next read will block.
-     *
-     * @exception  IOException  If an I/O error occurs
+     *         false otherwise.  Note that returning false does not guarantee that the
+     *         next read will block.
+     * @throws IOException If an I/O error occurs
      */
     public boolean ready() throws IOException {
-	return false;
+        return false;
     } // ready()
 
     /**
      * Tell whether this stream supports the mark() operation.
      */
     public boolean markSupported() {
-	return fInputStream.markSupported();
+        return fInputStream.markSupported();
     } // markSupported()
 
     /**
@@ -258,16 +258,15 @@
      * will attempt to reposition the stream to this point.  Not all
      * character-input streams support the mark() operation.
      *
-     * @param  readAheadLimit  Limit on the number of characters that may be
-     *                         read while still preserving the mark.  After
-     *                         reading this many characters, attempting to
-     *                         reset the stream may fail.
-     *
-     * @exception  IOException  If the stream does not support mark(),
-     *                          or if some other I/O error occurs
+     * @param readAheadLimit Limit on the number of characters that may be
+     *                       read while still preserving the mark.  After
+     *                       reading this many characters, attempting to
+     *                       reset the stream may fail.
+     * @throws IOException If the stream does not support mark(),
+     *                     or if some other I/O error occurs
      */
     public void mark(int readAheadLimit) throws IOException {
-	fInputStream.mark(readAheadLimit);
+        fInputStream.mark(readAheadLimit);
     } // mark(int)
 
     /**
@@ -278,10 +277,10 @@
      * character-input streams support the reset() operation, and some support
      * reset() without supporting mark().
      *
-     * @exception  IOException  If the stream has not been marked,
-     *                          or if the mark has been invalidated,
-     *                          or if the stream does not support reset(),
-     *                          or if some other I/O error occurs
+     * @throws IOException If the stream has not been marked,
+     *                     or if the mark has been invalidated,
+     *                     or if the stream does not support reset(),
+     *                     or if some other I/O error occurs
      */
     public void reset() throws IOException {
         fInputStream.reset();
@@ -292,10 +291,10 @@
      * ready(), mark(), or reset() invocations will throw an IOException.
      * Closing a previously-closed stream, however, has no effect.
      *
-     * @exception  IOException  If an I/O error occurs
+     * @throws IOException If an I/O error occurs
      */
-     public void close() throws IOException {
-         fInputStream.close();
-     } // close()
+    public void close() throws IOException {
+        fInputStream.close();
+    } // close()
 
 } // class UCSReader
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UTF8Reader.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UTF8Reader.java
index 361e99a..78ab1b8 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UTF8Reader.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/UTF8Reader.java
@@ -17,6 +17,8 @@
 
 package org.apache.struts2.jasper.xmlparser;
 
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.jasper.compiler.Localizer;
 
 import java.io.IOException;
@@ -26,49 +28,59 @@
 
 /**
  * @author Andy Clark, IBM
- *
  * @version $Id: UTF8Reader.java 466606 2006-10-21 23:07:12Z markt $
  */
 public class UTF8Reader
-    extends Reader {
+        extends Reader {
 
-    private org.apache.commons.logging.Log log=
-        org.apache.commons.logging.LogFactory.getLog( UTF8Reader.class );
-    
+    private Logger log = LoggerFactory.getLogger(UTF8Reader.class);
+
     //
     // Constants
     //
 
-    /** Default byte buffer size (2048). */
+    /**
+     * Default byte buffer size (2048).
+     */
     public static final int DEFAULT_BUFFER_SIZE = 2048;
 
     // debugging
 
-    /** Debug read. */
+    /**
+     * Debug read.
+     */
     private static final boolean DEBUG_READ = false;
 
     //
     // Data
     //
 
-    /** Input stream. */
+    /**
+     * Input stream.
+     */
     protected InputStream fInputStream;
 
-    /** Byte buffer. */
+    /**
+     * Byte buffer.
+     */
     protected byte[] fBuffer;
 
-    /** Offset into buffer. */
+    /**
+     * Offset into buffer.
+     */
     protected int fOffset;
 
-    /** Surrogate character. */
+    /**
+     * Surrogate character.
+     */
     private int fSurrogate = -1;
 
     //
     // Constructors
     //
 
-    /** 
-     * Constructs a UTF-8 reader from the specified input stream, 
+    /**
+     * Constructs a UTF-8 reader from the specified input stream,
      * buffer size and MessageFormatter.
      *
      * @param inputStream The input stream.
@@ -86,15 +98,14 @@
     /**
      * Read a single character.  This method will block until a character is
      * available, an I/O error occurs, or the end of the stream is reached.
-     *
+     * <p/>
      * <p> Subclasses that intend to support efficient single-character input
      * should override this method.
      *
-     * @return     The character read, as an integer in the range 0 to 16383
-     *             (<tt>0x00-0xffff</tt>), or -1 if the end of the stream has
-     *             been reached
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @return The character read, as an integer in the range 0 to 16383
+     *         (<tt>0x00-0xffff</tt>), or -1 if the end of the stream has
+     *         been reached
+     * @throws IOException If an I/O error occurs
      */
     public int read() throws IOException {
 
@@ -106,8 +117,8 @@
             int index = 0;
 
             // get first byte
-            int b0 = index == fOffset 
-                   ? fInputStream.read() : fBuffer[index++] & 0x00FF;
+            int b0 = index == fOffset
+                    ? fInputStream.read() : fBuffer[index++] & 0x00FF;
             if (b0 == -1) {
                 return -1;
             }
@@ -115,14 +126,14 @@
             // UTF-8:   [0xxx xxxx]
             // Unicode: [0000 0000] [0xxx xxxx]
             if (b0 < 0x80) {
-                c = (char)b0;
+                c = (char) b0;
             }
 
             // UTF-8:   [110y yyyy] [10xx xxxx]
             // Unicode: [0000 0yyy] [yyxx xxxx]
             else if ((b0 & 0xE0) == 0xC0) {
-                int b1 = index == fOffset 
-                       ? fInputStream.read() : fBuffer[index++] & 0x00FF;
+                int b1 = index == fOffset
+                        ? fInputStream.read() : fBuffer[index++] & 0x00FF;
                 if (b1 == -1) {
                     expectedByte(2, 2);
                 }
@@ -136,15 +147,15 @@
             // Unicode: [zzzz yyyy] [yyxx xxxx]
             else if ((b0 & 0xF0) == 0xE0) {
                 int b1 = index == fOffset
-                       ? fInputStream.read() : fBuffer[index++] & 0x00FF;
+                        ? fInputStream.read() : fBuffer[index++] & 0x00FF;
                 if (b1 == -1) {
                     expectedByte(2, 3);
                 }
                 if ((b1 & 0xC0) != 0x80) {
                     invalidByte(2, 3, b1);
                 }
-                int b2 = index == fOffset 
-                       ? fInputStream.read() : fBuffer[index++] & 0x00FF;
+                int b2 = index == fOffset
+                        ? fInputStream.read() : fBuffer[index++] & 0x00FF;
                 if (b2 == -1) {
                     expectedByte(3, 3);
                 }
@@ -152,7 +163,7 @@
                     invalidByte(3, 3, b2);
                 }
                 c = ((b0 << 12) & 0xF000) | ((b1 << 6) & 0x0FC0) |
-                    (b2 & 0x003F);
+                        (b2 & 0x003F);
             }
 
             // UTF-8:   [1111 0uuu] [10uu zzzz] [10yy yyyy] [10xx xxxx]*
@@ -160,24 +171,24 @@
             //          [1101 11yy] [yyxx xxxx] (low surrogate)
             //          * uuuuu = wwww + 1
             else if ((b0 & 0xF8) == 0xF0) {
-                int b1 = index == fOffset 
-                       ? fInputStream.read() : fBuffer[index++] & 0x00FF;
+                int b1 = index == fOffset
+                        ? fInputStream.read() : fBuffer[index++] & 0x00FF;
                 if (b1 == -1) {
                     expectedByte(2, 4);
                 }
                 if ((b1 & 0xC0) != 0x80) {
                     invalidByte(2, 3, b1);
                 }
-                int b2 = index == fOffset 
-                       ? fInputStream.read() : fBuffer[index++] & 0x00FF;
+                int b2 = index == fOffset
+                        ? fInputStream.read() : fBuffer[index++] & 0x00FF;
                 if (b2 == -1) {
                     expectedByte(3, 4);
                 }
                 if ((b2 & 0xC0) != 0x80) {
                     invalidByte(3, 3, b2);
                 }
-                int b3 = index == fOffset 
-                       ? fInputStream.read() : fBuffer[index++] & 0x00FF;
+                int b3 = index == fOffset
+                        ? fInputStream.read() : fBuffer[index++] & 0x00FF;
                 if (b3 == -1) {
                     expectedByte(4, 4);
                 }
@@ -189,9 +200,9 @@
                     invalidSurrogate(uuuuu);
                 }
                 int wwww = uuuuu - 1;
-                int hs = 0xD800 | 
-                         ((wwww << 6) & 0x03C0) | ((b1 << 2) & 0x003C) | 
-                         ((b2 >> 4) & 0x0003);
+                int hs = 0xD800 |
+                        ((wwww << 6) & 0x03C0) | ((b1 << 2) & 0x003C) |
+                        ((b2 >> 4) & 0x0003);
                 int ls = 0xDC00 | ((b2 << 6) & 0x03C0) | (b3 & 0x003F);
                 c = hs;
                 fSurrogate = ls;
@@ -211,7 +222,7 @@
         // return character
         if (DEBUG_READ) {
             if (log.isDebugEnabled())
-                log.debug("read(): 0x"+Integer.toHexString(c));
+                log.debug("read(): 0x" + Integer.toHexString(c));
         }
         return c;
 
@@ -222,21 +233,19 @@
      * until some input is available, an I/O error occurs, or the end of the
      * stream is reached.
      *
-     * @param      ch     Destination buffer
-     * @param      offset Offset at which to start storing characters
-     * @param      length Maximum number of characters to read
-     *
-     * @return     The number of characters read, or -1 if the end of the
-     *             stream has been reached
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @param ch     Destination buffer
+     * @param offset Offset at which to start storing characters
+     * @param length Maximum number of characters to read
+     * @return The number of characters read, or -1 if the end of the
+     *         stream has been reached
+     * @throws IOException If an I/O error occurs
      */
     public int read(char ch[], int offset, int length) throws IOException {
 
         // handle surrogate
         int out = offset;
         if (fSurrogate != -1) {
-            ch[offset + 1] = (char)fSurrogate;
+            ch[offset + 1] = (char) fSurrogate;
             fSurrogate = -1;
             length--;
             out++;
@@ -278,7 +287,7 @@
             // UTF-8:   [0xxx xxxx]
             // Unicode: [0000 0000] [0xxx xxxx]
             if (b0 < 0x80) {
-                ch[out++] = (char)b0;
+                ch[out++] = (char) b0;
                 continue;
             }
 
@@ -286,14 +295,13 @@
             // Unicode: [0000 0yyy] [yyxx xxxx]
             if ((b0 & 0xE0) == 0xC0) {
                 int b1 = -1;
-                if (++in < total) { 
-                    b1 = fBuffer[in] & 0x00FF; 
-                }
-                else {
+                if (++in < total) {
+                    b1 = fBuffer[in] & 0x00FF;
+                } else {
                     b1 = fInputStream.read();
                     if (b1 == -1) {
                         if (out > offset) {
-                            fBuffer[0] = (byte)b0;
+                            fBuffer[0] = (byte) b0;
                             fOffset = 1;
                             return out - offset;
                         }
@@ -303,15 +311,15 @@
                 }
                 if ((b1 & 0xC0) != 0x80) {
                     if (out > offset) {
-                        fBuffer[0] = (byte)b0;
-                        fBuffer[1] = (byte)b1;
+                        fBuffer[0] = (byte) b0;
+                        fBuffer[1] = (byte) b1;
                         fOffset = 2;
                         return out - offset;
                     }
                     invalidByte(2, 2, b1);
                 }
                 int c = ((b0 << 6) & 0x07C0) | (b1 & 0x003F);
-                ch[out++] = (char)c;
+                ch[out++] = (char) c;
                 count -= 1;
                 continue;
             }
@@ -320,14 +328,13 @@
             // Unicode: [zzzz yyyy] [yyxx xxxx]
             if ((b0 & 0xF0) == 0xE0) {
                 int b1 = -1;
-                if (++in < total) { 
-                    b1 = fBuffer[in] & 0x00FF; 
-                }
-                else {
+                if (++in < total) {
+                    b1 = fBuffer[in] & 0x00FF;
+                } else {
                     b1 = fInputStream.read();
                     if (b1 == -1) {
                         if (out > offset) {
-                            fBuffer[0] = (byte)b0;
+                            fBuffer[0] = (byte) b0;
                             fOffset = 1;
                             return out - offset;
                         }
@@ -337,23 +344,22 @@
                 }
                 if ((b1 & 0xC0) != 0x80) {
                     if (out > offset) {
-                        fBuffer[0] = (byte)b0;
-                        fBuffer[1] = (byte)b1;
+                        fBuffer[0] = (byte) b0;
+                        fBuffer[1] = (byte) b1;
                         fOffset = 2;
                         return out - offset;
                     }
                     invalidByte(2, 3, b1);
                 }
                 int b2 = -1;
-                if (++in < total) { 
-                    b2 = fBuffer[in] & 0x00FF; 
-                }
-                else {
+                if (++in < total) {
+                    b2 = fBuffer[in] & 0x00FF;
+                } else {
                     b2 = fInputStream.read();
                     if (b2 == -1) {
                         if (out > offset) {
-                            fBuffer[0] = (byte)b0;
-                            fBuffer[1] = (byte)b1;
+                            fBuffer[0] = (byte) b0;
+                            fBuffer[1] = (byte) b1;
                             fOffset = 2;
                             return out - offset;
                         }
@@ -363,9 +369,9 @@
                 }
                 if ((b2 & 0xC0) != 0x80) {
                     if (out > offset) {
-                        fBuffer[0] = (byte)b0;
-                        fBuffer[1] = (byte)b1;
-                        fBuffer[2] = (byte)b2;
+                        fBuffer[0] = (byte) b0;
+                        fBuffer[1] = (byte) b1;
+                        fBuffer[2] = (byte) b2;
                         fOffset = 3;
                         return out - offset;
                     }
@@ -373,7 +379,7 @@
                 }
                 int c = ((b0 << 12) & 0xF000) | ((b1 << 6) & 0x0FC0) |
                         (b2 & 0x003F);
-                ch[out++] = (char)c;
+                ch[out++] = (char) c;
                 count -= 2;
                 continue;
             }
@@ -384,14 +390,13 @@
             //          * uuuuu = wwww + 1
             if ((b0 & 0xF8) == 0xF0) {
                 int b1 = -1;
-                if (++in < total) { 
-                    b1 = fBuffer[in] & 0x00FF; 
-                }
-                else {
+                if (++in < total) {
+                    b1 = fBuffer[in] & 0x00FF;
+                } else {
                     b1 = fInputStream.read();
                     if (b1 == -1) {
                         if (out > offset) {
-                            fBuffer[0] = (byte)b0;
+                            fBuffer[0] = (byte) b0;
                             fOffset = 1;
                             return out - offset;
                         }
@@ -401,23 +406,22 @@
                 }
                 if ((b1 & 0xC0) != 0x80) {
                     if (out > offset) {
-                        fBuffer[0] = (byte)b0;
-                        fBuffer[1] = (byte)b1;
+                        fBuffer[0] = (byte) b0;
+                        fBuffer[1] = (byte) b1;
                         fOffset = 2;
                         return out - offset;
                     }
                     invalidByte(2, 4, b1);
                 }
                 int b2 = -1;
-                if (++in < total) { 
-                    b2 = fBuffer[in] & 0x00FF; 
-                }
-                else {
+                if (++in < total) {
+                    b2 = fBuffer[in] & 0x00FF;
+                } else {
                     b2 = fInputStream.read();
                     if (b2 == -1) {
                         if (out > offset) {
-                            fBuffer[0] = (byte)b0;
-                            fBuffer[1] = (byte)b1;
+                            fBuffer[0] = (byte) b0;
+                            fBuffer[1] = (byte) b1;
                             fOffset = 2;
                             return out - offset;
                         }
@@ -427,25 +431,24 @@
                 }
                 if ((b2 & 0xC0) != 0x80) {
                     if (out > offset) {
-                        fBuffer[0] = (byte)b0;
-                        fBuffer[1] = (byte)b1;
-                        fBuffer[2] = (byte)b2;
+                        fBuffer[0] = (byte) b0;
+                        fBuffer[1] = (byte) b1;
+                        fBuffer[2] = (byte) b2;
                         fOffset = 3;
                         return out - offset;
                     }
                     invalidByte(3, 4, b2);
                 }
                 int b3 = -1;
-                if (++in < total) { 
-                    b3 = fBuffer[in] & 0x00FF; 
-                }
-                else {
+                if (++in < total) {
+                    b3 = fBuffer[in] & 0x00FF;
+                } else {
                     b3 = fInputStream.read();
                     if (b3 == -1) {
                         if (out > offset) {
-                            fBuffer[0] = (byte)b0;
-                            fBuffer[1] = (byte)b1;
-                            fBuffer[2] = (byte)b2;
+                            fBuffer[0] = (byte) b0;
+                            fBuffer[1] = (byte) b1;
+                            fBuffer[2] = (byte) b2;
                             fOffset = 3;
                             return out - offset;
                         }
@@ -455,10 +458,10 @@
                 }
                 if ((b3 & 0xC0) != 0x80) {
                     if (out > offset) {
-                        fBuffer[0] = (byte)b0;
-                        fBuffer[1] = (byte)b1;
-                        fBuffer[2] = (byte)b2;
-                        fBuffer[3] = (byte)b3;
+                        fBuffer[0] = (byte) b0;
+                        fBuffer[1] = (byte) b1;
+                        fBuffer[2] = (byte) b2;
+                        fBuffer[3] = (byte) b3;
                         fOffset = 4;
                         return out - offset;
                     }
@@ -478,15 +481,15 @@
                 int ls = 0xDC00 | ((yyyyyy << 6) & 0x03C0) | xxxxxx;
 
                 // set characters
-                ch[out++] = (char)hs;
-                ch[out++] = (char)ls;
+                ch[out++] = (char) hs;
+                ch[out++] = (char) ls;
                 count -= 2;
                 continue;
             }
 
             // error
             if (out > offset) {
-                fBuffer[0] = (byte)b0;
+                fBuffer[0] = (byte) b0;
                 fOffset = 1;
                 return out - offset;
             }
@@ -496,7 +499,7 @@
         // return number of characters converted
         if (DEBUG_READ) {
             if (log.isDebugEnabled())
-                log.debug("read(char[],"+offset+','+length+"): count="+count);
+                log.debug("read(char[]," + offset + ',' + length + "): count=" + count);
         }
         return count;
 
@@ -506,23 +509,20 @@
      * Skip characters.  This method will block until some characters are
      * available, an I/O error occurs, or the end of the stream is reached.
      *
-     * @param  n  The number of characters to skip
-     *
-     * @return    The number of characters actually skipped
-     *
-     * @exception  IOException  If an I/O error occurs
+     * @param n The number of characters to skip
+     * @return The number of characters actually skipped
+     * @throws IOException If an I/O error occurs
      */
     public long skip(long n) throws IOException {
 
         long remaining = n;
         final char[] ch = new char[fBuffer.length];
         do {
-            int length = ch.length < remaining ? ch.length : (int)remaining;
+            int length = ch.length < remaining ? ch.length : (int) remaining;
             int count = read(ch, 0, length);
             if (count > 0) {
                 remaining -= count;
-            }
-            else {
+            } else {
                 break;
             }
         } while (remaining > 0);
@@ -536,20 +536,19 @@
      * Tell whether this stream is ready to be read.
      *
      * @return True if the next read() is guaranteed not to block for input,
-     * false otherwise.  Note that returning false does not guarantee that the
-     * next read will block.
-     *
-     * @exception  IOException  If an I/O error occurs
+     *         false otherwise.  Note that returning false does not guarantee that the
+     *         next read will block.
+     * @throws IOException If an I/O error occurs
      */
     public boolean ready() throws IOException {
-	    return false;
+        return false;
     } // ready()
 
     /**
      * Tell whether this stream supports the mark() operation.
      */
     public boolean markSupported() {
-	    return false;
+        return false;
     } // markSupported()
 
     /**
@@ -557,18 +556,17 @@
      * will attempt to reposition the stream to this point.  Not all
      * character-input streams support the mark() operation.
      *
-     * @param  readAheadLimit  Limit on the number of characters that may be
-     *                         read while still preserving the mark.  After
-     *                         reading this many characters, attempting to
-     *                         reset the stream may fail.
-     *
-     * @exception  IOException  If the stream does not support mark(),
-     *                          or if some other I/O error occurs
+     * @param readAheadLimit Limit on the number of characters that may be
+     *                       read while still preserving the mark.  After
+     *                       reading this many characters, attempting to
+     *                       reset the stream may fail.
+     * @throws IOException If the stream does not support mark(),
+     *                     or if some other I/O error occurs
      */
     public void mark(int readAheadLimit) throws IOException {
-	throw new IOException(
+        throw new IOException(
                 Localizer.getMessage("jsp.error.xml.operationNotSupported",
-				     "mark()", "UTF-8"));
+                        "mark()", "UTF-8"));
     }
 
     /**
@@ -579,10 +577,10 @@
      * character-input streams support the reset() operation, and some support
      * reset() without supporting mark().
      *
-     * @exception  IOException  If the stream has not been marked,
-     *                          or if the mark has been invalidated,
-     *                          or if the stream does not support reset(),
-     *                          or if some other I/O error occurs
+     * @throws IOException If the stream has not been marked,
+     *                     or if the mark has been invalidated,
+     *                     or if the stream does not support reset(),
+     *                     or if some other I/O error occurs
      */
     public void reset() throws IOException {
         fOffset = 0;
@@ -594,7 +592,7 @@
      * ready(), mark(), or reset() invocations will throw an IOException.
      * Closing a previously-closed stream, however, has no effect.
      *
-     * @exception  IOException  If an I/O error occurs
+     * @throws IOException If an I/O error occurs
      */
     public void close() throws IOException {
         fInputStream.close();
@@ -604,33 +602,39 @@
     // Private methods
     //
 
-    /** Throws an exception for expected byte. */
+    /**
+     * Throws an exception for expected byte.
+     */
     private void expectedByte(int position, int count)
-        throws UTFDataFormatException {
+            throws UTFDataFormatException {
 
         throw new UTFDataFormatException(
                 Localizer.getMessage("jsp.error.xml.expectedByte",
-				     Integer.toString(position),
-				     Integer.toString(count)));
+                        Integer.toString(position),
+                        Integer.toString(count)));
 
     } // expectedByte(int,int,int)
 
-    /** Throws an exception for invalid byte. */
-    private void invalidByte(int position, int count, int c) 
-        throws UTFDataFormatException {
+    /**
+     * Throws an exception for invalid byte.
+     */
+    private void invalidByte(int position, int count, int c)
+            throws UTFDataFormatException {
 
         throw new UTFDataFormatException(
                 Localizer.getMessage("jsp.error.xml.invalidByte",
-				     Integer.toString(position),
-				     Integer.toString(count)));
+                        Integer.toString(position),
+                        Integer.toString(count)));
     } // invalidByte(int,int,int,int)
 
-    /** Throws an exception for invalid surrogate bits. */
+    /**
+     * Throws an exception for invalid surrogate bits.
+     */
     private void invalidSurrogate(int uuuuu) throws UTFDataFormatException {
-        
+
         throw new UTFDataFormatException(
                 Localizer.getMessage("jsp.error.xml.invalidHighSurrogate",
-				     Integer.toHexString(uuuuu)));
+                        Integer.toHexString(uuuuu)));
     } // invalidSurrogate(int)
 
 } // class UTF8Reader
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLChar.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLChar.java
index 19cdc70..266cca6 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLChar.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLChar.java
@@ -32,7 +32,7 @@
  * in this class can be used to verify that a character is a valid
  * XML character or if the character is a space, name start, or name
  * character.
- * <p>
+ * <p/>
  * A series of convenience methods are supplied to ease the burden
  * of the developer. Because inlining the checks can improve per
  * character performance, the tables of character properties are
@@ -48,7 +48,6 @@
  * @author Arnaud  Le Hors, IBM
  * @author Michael Glavassevich, IBM
  * @author Rahul Srivastava, Sun Microsystems Inc.
- *
  * @version $Id: XMLChar.java 466606 2006-10-21 23:07:12Z markt $
  */
 public class XMLChar {
@@ -57,38 +56,54 @@
     // Constants
     //
 
-    /** Character flags. */
+    /**
+     * Character flags.
+     */
     private static final byte[] CHARS = new byte[1 << 16];
 
-    /** Valid character mask. */
+    /**
+     * Valid character mask.
+     */
     public static final int MASK_VALID = 0x01;
 
-    /** Space character mask. */
+    /**
+     * Space character mask.
+     */
     public static final int MASK_SPACE = 0x02;
 
-    /** Name start character mask. */
+    /**
+     * Name start character mask.
+     */
     public static final int MASK_NAME_START = 0x04;
 
-    /** Name character mask. */
+    /**
+     * Name character mask.
+     */
     public static final int MASK_NAME = 0x08;
 
-    /** Pubid character mask. */
+    /**
+     * Pubid character mask.
+     */
     public static final int MASK_PUBID = 0x10;
-    
-    /** 
+
+    /**
      * Content character mask. Special characters are those that can
-     * be considered the start of markup, such as '&lt;' and '&amp;'. 
+     * be considered the start of markup, such as '&lt;' and '&amp;'.
      * The various newline characters are considered special as well.
      * All other valid XML characters can be considered content.
-     * <p>
+     * <p/>
      * This is an optimization for the inner loop of character scanning.
      */
     public static final int MASK_CONTENT = 0x20;
 
-    /** NCName start character mask. */
+    /**
+     * NCName start character mask.
+     */
     public static final int MASK_NCNAME_START = 0x40;
 
-    /** NCName character mask. */
+    /**
+     * NCName character mask.
+     */
     public static final int MASK_NCNAME = 0x80;
 
     //
@@ -96,80 +111,80 @@
     //
 
     static {
-        
+
         // Initializing the Character Flag Array
         // Code generated by: XMLCharGenerator.
-        
+
         CHARS[9] = 35;
         CHARS[10] = 19;
         CHARS[13] = 19;
         CHARS[32] = 51;
         CHARS[33] = 49;
         CHARS[34] = 33;
-        Arrays.fill(CHARS, 35, 38, (byte) 49 ); // Fill 3 of value (byte) 49
+        Arrays.fill(CHARS, 35, 38, (byte) 49); // Fill 3 of value (byte) 49
         CHARS[38] = 1;
-        Arrays.fill(CHARS, 39, 45, (byte) 49 ); // Fill 6 of value (byte) 49
-        Arrays.fill(CHARS, 45, 47, (byte) -71 ); // Fill 2 of value (byte) -71
+        Arrays.fill(CHARS, 39, 45, (byte) 49); // Fill 6 of value (byte) 49
+        Arrays.fill(CHARS, 45, 47, (byte) -71); // Fill 2 of value (byte) -71
         CHARS[47] = 49;
-        Arrays.fill(CHARS, 48, 58, (byte) -71 ); // Fill 10 of value (byte) -71
+        Arrays.fill(CHARS, 48, 58, (byte) -71); // Fill 10 of value (byte) -71
         CHARS[58] = 61;
         CHARS[59] = 49;
         CHARS[60] = 1;
         CHARS[61] = 49;
         CHARS[62] = 33;
-        Arrays.fill(CHARS, 63, 65, (byte) 49 ); // Fill 2 of value (byte) 49
-        Arrays.fill(CHARS, 65, 91, (byte) -3 ); // Fill 26 of value (byte) -3
-        Arrays.fill(CHARS, 91, 93, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 63, 65, (byte) 49); // Fill 2 of value (byte) 49
+        Arrays.fill(CHARS, 65, 91, (byte) -3); // Fill 26 of value (byte) -3
+        Arrays.fill(CHARS, 91, 93, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[93] = 1;
         CHARS[94] = 33;
         CHARS[95] = -3;
         CHARS[96] = 33;
-        Arrays.fill(CHARS, 97, 123, (byte) -3 ); // Fill 26 of value (byte) -3
-        Arrays.fill(CHARS, 123, 183, (byte) 33 ); // Fill 60 of value (byte) 33
+        Arrays.fill(CHARS, 97, 123, (byte) -3); // Fill 26 of value (byte) -3
+        Arrays.fill(CHARS, 123, 183, (byte) 33); // Fill 60 of value (byte) 33
         CHARS[183] = -87;
-        Arrays.fill(CHARS, 184, 192, (byte) 33 ); // Fill 8 of value (byte) 33
-        Arrays.fill(CHARS, 192, 215, (byte) -19 ); // Fill 23 of value (byte) -19
+        Arrays.fill(CHARS, 184, 192, (byte) 33); // Fill 8 of value (byte) 33
+        Arrays.fill(CHARS, 192, 215, (byte) -19); // Fill 23 of value (byte) -19
         CHARS[215] = 33;
-        Arrays.fill(CHARS, 216, 247, (byte) -19 ); // Fill 31 of value (byte) -19
+        Arrays.fill(CHARS, 216, 247, (byte) -19); // Fill 31 of value (byte) -19
         CHARS[247] = 33;
-        Arrays.fill(CHARS, 248, 306, (byte) -19 ); // Fill 58 of value (byte) -19
-        Arrays.fill(CHARS, 306, 308, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 308, 319, (byte) -19 ); // Fill 11 of value (byte) -19
-        Arrays.fill(CHARS, 319, 321, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 321, 329, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 248, 306, (byte) -19); // Fill 58 of value (byte) -19
+        Arrays.fill(CHARS, 306, 308, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 308, 319, (byte) -19); // Fill 11 of value (byte) -19
+        Arrays.fill(CHARS, 319, 321, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 321, 329, (byte) -19); // Fill 8 of value (byte) -19
         CHARS[329] = 33;
-        Arrays.fill(CHARS, 330, 383, (byte) -19 ); // Fill 53 of value (byte) -19
+        Arrays.fill(CHARS, 330, 383, (byte) -19); // Fill 53 of value (byte) -19
         CHARS[383] = 33;
-        Arrays.fill(CHARS, 384, 452, (byte) -19 ); // Fill 68 of value (byte) -19
-        Arrays.fill(CHARS, 452, 461, (byte) 33 ); // Fill 9 of value (byte) 33
-        Arrays.fill(CHARS, 461, 497, (byte) -19 ); // Fill 36 of value (byte) -19
-        Arrays.fill(CHARS, 497, 500, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 500, 502, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 502, 506, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 506, 536, (byte) -19 ); // Fill 30 of value (byte) -19
-        Arrays.fill(CHARS, 536, 592, (byte) 33 ); // Fill 56 of value (byte) 33
-        Arrays.fill(CHARS, 592, 681, (byte) -19 ); // Fill 89 of value (byte) -19
-        Arrays.fill(CHARS, 681, 699, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 699, 706, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 706, 720, (byte) 33 ); // Fill 14 of value (byte) 33
-        Arrays.fill(CHARS, 720, 722, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 722, 768, (byte) 33 ); // Fill 46 of value (byte) 33
-        Arrays.fill(CHARS, 768, 838, (byte) -87 ); // Fill 70 of value (byte) -87
-        Arrays.fill(CHARS, 838, 864, (byte) 33 ); // Fill 26 of value (byte) 33
-        Arrays.fill(CHARS, 864, 866, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 866, 902, (byte) 33 ); // Fill 36 of value (byte) 33
+        Arrays.fill(CHARS, 384, 452, (byte) -19); // Fill 68 of value (byte) -19
+        Arrays.fill(CHARS, 452, 461, (byte) 33); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 461, 497, (byte) -19); // Fill 36 of value (byte) -19
+        Arrays.fill(CHARS, 497, 500, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 500, 502, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 502, 506, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 506, 536, (byte) -19); // Fill 30 of value (byte) -19
+        Arrays.fill(CHARS, 536, 592, (byte) 33); // Fill 56 of value (byte) 33
+        Arrays.fill(CHARS, 592, 681, (byte) -19); // Fill 89 of value (byte) -19
+        Arrays.fill(CHARS, 681, 699, (byte) 33); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 699, 706, (byte) -19); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 706, 720, (byte) 33); // Fill 14 of value (byte) 33
+        Arrays.fill(CHARS, 720, 722, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 722, 768, (byte) 33); // Fill 46 of value (byte) 33
+        Arrays.fill(CHARS, 768, 838, (byte) -87); // Fill 70 of value (byte) -87
+        Arrays.fill(CHARS, 838, 864, (byte) 33); // Fill 26 of value (byte) 33
+        Arrays.fill(CHARS, 864, 866, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 866, 902, (byte) 33); // Fill 36 of value (byte) 33
         CHARS[902] = -19;
         CHARS[903] = -87;
-        Arrays.fill(CHARS, 904, 907, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 904, 907, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[907] = 33;
         CHARS[908] = -19;
         CHARS[909] = 33;
-        Arrays.fill(CHARS, 910, 930, (byte) -19 ); // Fill 20 of value (byte) -19
+        Arrays.fill(CHARS, 910, 930, (byte) -19); // Fill 20 of value (byte) -19
         CHARS[930] = 33;
-        Arrays.fill(CHARS, 931, 975, (byte) -19 ); // Fill 44 of value (byte) -19
+        Arrays.fill(CHARS, 931, 975, (byte) -19); // Fill 44 of value (byte) -19
         CHARS[975] = 33;
-        Arrays.fill(CHARS, 976, 983, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 983, 986, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 976, 983, (byte) -19); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 983, 986, (byte) 33); // Fill 3 of value (byte) 33
         CHARS[986] = -19;
         CHARS[987] = 33;
         CHARS[988] = -19;
@@ -178,432 +193,432 @@
         CHARS[991] = 33;
         CHARS[992] = -19;
         CHARS[993] = 33;
-        Arrays.fill(CHARS, 994, 1012, (byte) -19 ); // Fill 18 of value (byte) -19
-        Arrays.fill(CHARS, 1012, 1025, (byte) 33 ); // Fill 13 of value (byte) 33
-        Arrays.fill(CHARS, 1025, 1037, (byte) -19 ); // Fill 12 of value (byte) -19
+        Arrays.fill(CHARS, 994, 1012, (byte) -19); // Fill 18 of value (byte) -19
+        Arrays.fill(CHARS, 1012, 1025, (byte) 33); // Fill 13 of value (byte) 33
+        Arrays.fill(CHARS, 1025, 1037, (byte) -19); // Fill 12 of value (byte) -19
         CHARS[1037] = 33;
-        Arrays.fill(CHARS, 1038, 1104, (byte) -19 ); // Fill 66 of value (byte) -19
+        Arrays.fill(CHARS, 1038, 1104, (byte) -19); // Fill 66 of value (byte) -19
         CHARS[1104] = 33;
-        Arrays.fill(CHARS, 1105, 1117, (byte) -19 ); // Fill 12 of value (byte) -19
+        Arrays.fill(CHARS, 1105, 1117, (byte) -19); // Fill 12 of value (byte) -19
         CHARS[1117] = 33;
-        Arrays.fill(CHARS, 1118, 1154, (byte) -19 ); // Fill 36 of value (byte) -19
+        Arrays.fill(CHARS, 1118, 1154, (byte) -19); // Fill 36 of value (byte) -19
         CHARS[1154] = 33;
-        Arrays.fill(CHARS, 1155, 1159, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 1159, 1168, (byte) 33 ); // Fill 9 of value (byte) 33
-        Arrays.fill(CHARS, 1168, 1221, (byte) -19 ); // Fill 53 of value (byte) -19
-        Arrays.fill(CHARS, 1221, 1223, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1223, 1225, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1225, 1227, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1227, 1229, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1229, 1232, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 1232, 1260, (byte) -19 ); // Fill 28 of value (byte) -19
-        Arrays.fill(CHARS, 1260, 1262, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1262, 1270, (byte) -19 ); // Fill 8 of value (byte) -19
-        Arrays.fill(CHARS, 1270, 1272, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1272, 1274, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1274, 1329, (byte) 33 ); // Fill 55 of value (byte) 33
-        Arrays.fill(CHARS, 1329, 1367, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 1367, 1369, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1155, 1159, (byte) -87); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 1159, 1168, (byte) 33); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 1168, 1221, (byte) -19); // Fill 53 of value (byte) -19
+        Arrays.fill(CHARS, 1221, 1223, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1223, 1225, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1225, 1227, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1227, 1229, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1229, 1232, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 1232, 1260, (byte) -19); // Fill 28 of value (byte) -19
+        Arrays.fill(CHARS, 1260, 1262, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1262, 1270, (byte) -19); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 1270, 1272, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1272, 1274, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1274, 1329, (byte) 33); // Fill 55 of value (byte) 33
+        Arrays.fill(CHARS, 1329, 1367, (byte) -19); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 1367, 1369, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[1369] = -19;
-        Arrays.fill(CHARS, 1370, 1377, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 1377, 1415, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 1415, 1425, (byte) 33 ); // Fill 10 of value (byte) 33
-        Arrays.fill(CHARS, 1425, 1442, (byte) -87 ); // Fill 17 of value (byte) -87
+        Arrays.fill(CHARS, 1370, 1377, (byte) 33); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 1377, 1415, (byte) -19); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 1415, 1425, (byte) 33); // Fill 10 of value (byte) 33
+        Arrays.fill(CHARS, 1425, 1442, (byte) -87); // Fill 17 of value (byte) -87
         CHARS[1442] = 33;
-        Arrays.fill(CHARS, 1443, 1466, (byte) -87 ); // Fill 23 of value (byte) -87
+        Arrays.fill(CHARS, 1443, 1466, (byte) -87); // Fill 23 of value (byte) -87
         CHARS[1466] = 33;
-        Arrays.fill(CHARS, 1467, 1470, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 1467, 1470, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[1470] = 33;
         CHARS[1471] = -87;
         CHARS[1472] = 33;
-        Arrays.fill(CHARS, 1473, 1475, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 1473, 1475, (byte) -87); // Fill 2 of value (byte) -87
         CHARS[1475] = 33;
         CHARS[1476] = -87;
-        Arrays.fill(CHARS, 1477, 1488, (byte) 33 ); // Fill 11 of value (byte) 33
-        Arrays.fill(CHARS, 1488, 1515, (byte) -19 ); // Fill 27 of value (byte) -19
-        Arrays.fill(CHARS, 1515, 1520, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 1520, 1523, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 1523, 1569, (byte) 33 ); // Fill 46 of value (byte) 33
-        Arrays.fill(CHARS, 1569, 1595, (byte) -19 ); // Fill 26 of value (byte) -19
-        Arrays.fill(CHARS, 1595, 1600, (byte) 33 ); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 1477, 1488, (byte) 33); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 1488, 1515, (byte) -19); // Fill 27 of value (byte) -19
+        Arrays.fill(CHARS, 1515, 1520, (byte) 33); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 1520, 1523, (byte) -19); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 1523, 1569, (byte) 33); // Fill 46 of value (byte) 33
+        Arrays.fill(CHARS, 1569, 1595, (byte) -19); // Fill 26 of value (byte) -19
+        Arrays.fill(CHARS, 1595, 1600, (byte) 33); // Fill 5 of value (byte) 33
         CHARS[1600] = -87;
-        Arrays.fill(CHARS, 1601, 1611, (byte) -19 ); // Fill 10 of value (byte) -19
-        Arrays.fill(CHARS, 1611, 1619, (byte) -87 ); // Fill 8 of value (byte) -87
-        Arrays.fill(CHARS, 1619, 1632, (byte) 33 ); // Fill 13 of value (byte) 33
-        Arrays.fill(CHARS, 1632, 1642, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 1642, 1648, (byte) 33 ); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 1601, 1611, (byte) -19); // Fill 10 of value (byte) -19
+        Arrays.fill(CHARS, 1611, 1619, (byte) -87); // Fill 8 of value (byte) -87
+        Arrays.fill(CHARS, 1619, 1632, (byte) 33); // Fill 13 of value (byte) 33
+        Arrays.fill(CHARS, 1632, 1642, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 1642, 1648, (byte) 33); // Fill 6 of value (byte) 33
         CHARS[1648] = -87;
-        Arrays.fill(CHARS, 1649, 1720, (byte) -19 ); // Fill 71 of value (byte) -19
-        Arrays.fill(CHARS, 1720, 1722, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1722, 1727, (byte) -19 ); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 1649, 1720, (byte) -19); // Fill 71 of value (byte) -19
+        Arrays.fill(CHARS, 1720, 1722, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1722, 1727, (byte) -19); // Fill 5 of value (byte) -19
         CHARS[1727] = 33;
-        Arrays.fill(CHARS, 1728, 1743, (byte) -19 ); // Fill 15 of value (byte) -19
+        Arrays.fill(CHARS, 1728, 1743, (byte) -19); // Fill 15 of value (byte) -19
         CHARS[1743] = 33;
-        Arrays.fill(CHARS, 1744, 1748, (byte) -19 ); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 1744, 1748, (byte) -19); // Fill 4 of value (byte) -19
         CHARS[1748] = 33;
         CHARS[1749] = -19;
-        Arrays.fill(CHARS, 1750, 1765, (byte) -87 ); // Fill 15 of value (byte) -87
-        Arrays.fill(CHARS, 1765, 1767, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 1767, 1769, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 1750, 1765, (byte) -87); // Fill 15 of value (byte) -87
+        Arrays.fill(CHARS, 1765, 1767, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 1767, 1769, (byte) -87); // Fill 2 of value (byte) -87
         CHARS[1769] = 33;
-        Arrays.fill(CHARS, 1770, 1774, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 1774, 1776, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 1776, 1786, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 1786, 2305, (byte) 33 ); // Fill 519 of value (byte) 33
-        Arrays.fill(CHARS, 2305, 2308, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 1770, 1774, (byte) -87); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 1774, 1776, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 1776, 1786, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 1786, 2305, (byte) 33); // Fill 519 of value (byte) 33
+        Arrays.fill(CHARS, 2305, 2308, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[2308] = 33;
-        Arrays.fill(CHARS, 2309, 2362, (byte) -19 ); // Fill 53 of value (byte) -19
-        Arrays.fill(CHARS, 2362, 2364, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2309, 2362, (byte) -19); // Fill 53 of value (byte) -19
+        Arrays.fill(CHARS, 2362, 2364, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[2364] = -87;
         CHARS[2365] = -19;
-        Arrays.fill(CHARS, 2366, 2382, (byte) -87 ); // Fill 16 of value (byte) -87
-        Arrays.fill(CHARS, 2382, 2385, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2385, 2389, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 2389, 2392, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2392, 2402, (byte) -19 ); // Fill 10 of value (byte) -19
-        Arrays.fill(CHARS, 2402, 2404, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2404, 2406, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2406, 2416, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2416, 2433, (byte) 33 ); // Fill 17 of value (byte) 33
-        Arrays.fill(CHARS, 2433, 2436, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2366, 2382, (byte) -87); // Fill 16 of value (byte) -87
+        Arrays.fill(CHARS, 2382, 2385, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2385, 2389, (byte) -87); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 2389, 2392, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2392, 2402, (byte) -19); // Fill 10 of value (byte) -19
+        Arrays.fill(CHARS, 2402, 2404, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2404, 2406, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2406, 2416, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2416, 2433, (byte) 33); // Fill 17 of value (byte) 33
+        Arrays.fill(CHARS, 2433, 2436, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[2436] = 33;
-        Arrays.fill(CHARS, 2437, 2445, (byte) -19 ); // Fill 8 of value (byte) -19
-        Arrays.fill(CHARS, 2445, 2447, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2447, 2449, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2449, 2451, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2451, 2473, (byte) -19 ); // Fill 22 of value (byte) -19
+        Arrays.fill(CHARS, 2437, 2445, (byte) -19); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 2445, 2447, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2447, 2449, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2449, 2451, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2451, 2473, (byte) -19); // Fill 22 of value (byte) -19
         CHARS[2473] = 33;
-        Arrays.fill(CHARS, 2474, 2481, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 2474, 2481, (byte) -19); // Fill 7 of value (byte) -19
         CHARS[2481] = 33;
         CHARS[2482] = -19;
-        Arrays.fill(CHARS, 2483, 2486, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2486, 2490, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 2490, 2492, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2483, 2486, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2486, 2490, (byte) -19); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 2490, 2492, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[2492] = -87;
         CHARS[2493] = 33;
-        Arrays.fill(CHARS, 2494, 2501, (byte) -87 ); // Fill 7 of value (byte) -87
-        Arrays.fill(CHARS, 2501, 2503, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2503, 2505, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2505, 2507, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2507, 2510, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2510, 2519, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 2494, 2501, (byte) -87); // Fill 7 of value (byte) -87
+        Arrays.fill(CHARS, 2501, 2503, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2503, 2505, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2505, 2507, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2507, 2510, (byte) -87); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2510, 2519, (byte) 33); // Fill 9 of value (byte) 33
         CHARS[2519] = -87;
-        Arrays.fill(CHARS, 2520, 2524, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2524, 2526, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2520, 2524, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2524, 2526, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[2526] = 33;
-        Arrays.fill(CHARS, 2527, 2530, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2530, 2532, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2532, 2534, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2534, 2544, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2544, 2546, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2546, 2562, (byte) 33 ); // Fill 16 of value (byte) 33
+        Arrays.fill(CHARS, 2527, 2530, (byte) -19); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2530, 2532, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2532, 2534, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2534, 2544, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2544, 2546, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2546, 2562, (byte) 33); // Fill 16 of value (byte) 33
         CHARS[2562] = -87;
-        Arrays.fill(CHARS, 2563, 2565, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2565, 2571, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 2571, 2575, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2575, 2577, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2577, 2579, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2579, 2601, (byte) -19 ); // Fill 22 of value (byte) -19
+        Arrays.fill(CHARS, 2563, 2565, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2565, 2571, (byte) -19); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 2571, 2575, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2575, 2577, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2577, 2579, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2579, 2601, (byte) -19); // Fill 22 of value (byte) -19
         CHARS[2601] = 33;
-        Arrays.fill(CHARS, 2602, 2609, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 2602, 2609, (byte) -19); // Fill 7 of value (byte) -19
         CHARS[2609] = 33;
-        Arrays.fill(CHARS, 2610, 2612, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2610, 2612, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[2612] = 33;
-        Arrays.fill(CHARS, 2613, 2615, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2613, 2615, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[2615] = 33;
-        Arrays.fill(CHARS, 2616, 2618, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2618, 2620, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2616, 2618, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2618, 2620, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[2620] = -87;
         CHARS[2621] = 33;
-        Arrays.fill(CHARS, 2622, 2627, (byte) -87 ); // Fill 5 of value (byte) -87
-        Arrays.fill(CHARS, 2627, 2631, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2631, 2633, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2633, 2635, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2635, 2638, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2638, 2649, (byte) 33 ); // Fill 11 of value (byte) 33
-        Arrays.fill(CHARS, 2649, 2653, (byte) -19 ); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 2622, 2627, (byte) -87); // Fill 5 of value (byte) -87
+        Arrays.fill(CHARS, 2627, 2631, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2631, 2633, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2633, 2635, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2635, 2638, (byte) -87); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2638, 2649, (byte) 33); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 2649, 2653, (byte) -19); // Fill 4 of value (byte) -19
         CHARS[2653] = 33;
         CHARS[2654] = -19;
-        Arrays.fill(CHARS, 2655, 2662, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 2662, 2674, (byte) -87 ); // Fill 12 of value (byte) -87
-        Arrays.fill(CHARS, 2674, 2677, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2677, 2689, (byte) 33 ); // Fill 12 of value (byte) 33
-        Arrays.fill(CHARS, 2689, 2692, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2655, 2662, (byte) 33); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 2662, 2674, (byte) -87); // Fill 12 of value (byte) -87
+        Arrays.fill(CHARS, 2674, 2677, (byte) -19); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2677, 2689, (byte) 33); // Fill 12 of value (byte) 33
+        Arrays.fill(CHARS, 2689, 2692, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[2692] = 33;
-        Arrays.fill(CHARS, 2693, 2700, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 2693, 2700, (byte) -19); // Fill 7 of value (byte) -19
         CHARS[2700] = 33;
         CHARS[2701] = -19;
         CHARS[2702] = 33;
-        Arrays.fill(CHARS, 2703, 2706, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2703, 2706, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[2706] = 33;
-        Arrays.fill(CHARS, 2707, 2729, (byte) -19 ); // Fill 22 of value (byte) -19
+        Arrays.fill(CHARS, 2707, 2729, (byte) -19); // Fill 22 of value (byte) -19
         CHARS[2729] = 33;
-        Arrays.fill(CHARS, 2730, 2737, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 2730, 2737, (byte) -19); // Fill 7 of value (byte) -19
         CHARS[2737] = 33;
-        Arrays.fill(CHARS, 2738, 2740, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2738, 2740, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[2740] = 33;
-        Arrays.fill(CHARS, 2741, 2746, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 2746, 2748, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2741, 2746, (byte) -19); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 2746, 2748, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[2748] = -87;
         CHARS[2749] = -19;
-        Arrays.fill(CHARS, 2750, 2758, (byte) -87 ); // Fill 8 of value (byte) -87
+        Arrays.fill(CHARS, 2750, 2758, (byte) -87); // Fill 8 of value (byte) -87
         CHARS[2758] = 33;
-        Arrays.fill(CHARS, 2759, 2762, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2759, 2762, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[2762] = 33;
-        Arrays.fill(CHARS, 2763, 2766, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2766, 2784, (byte) 33 ); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 2763, 2766, (byte) -87); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2766, 2784, (byte) 33); // Fill 18 of value (byte) 33
         CHARS[2784] = -19;
-        Arrays.fill(CHARS, 2785, 2790, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 2790, 2800, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2800, 2817, (byte) 33 ); // Fill 17 of value (byte) 33
-        Arrays.fill(CHARS, 2817, 2820, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2785, 2790, (byte) 33); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 2790, 2800, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2800, 2817, (byte) 33); // Fill 17 of value (byte) 33
+        Arrays.fill(CHARS, 2817, 2820, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[2820] = 33;
-        Arrays.fill(CHARS, 2821, 2829, (byte) -19 ); // Fill 8 of value (byte) -19
-        Arrays.fill(CHARS, 2829, 2831, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2831, 2833, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2833, 2835, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2835, 2857, (byte) -19 ); // Fill 22 of value (byte) -19
+        Arrays.fill(CHARS, 2821, 2829, (byte) -19); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 2829, 2831, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2831, 2833, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2833, 2835, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2835, 2857, (byte) -19); // Fill 22 of value (byte) -19
         CHARS[2857] = 33;
-        Arrays.fill(CHARS, 2858, 2865, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 2858, 2865, (byte) -19); // Fill 7 of value (byte) -19
         CHARS[2865] = 33;
-        Arrays.fill(CHARS, 2866, 2868, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2868, 2870, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2870, 2874, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 2874, 2876, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2866, 2868, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2868, 2870, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2870, 2874, (byte) -19); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 2874, 2876, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[2876] = -87;
         CHARS[2877] = -19;
-        Arrays.fill(CHARS, 2878, 2884, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 2884, 2887, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2887, 2889, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2889, 2891, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 2891, 2894, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 2894, 2902, (byte) 33 ); // Fill 8 of value (byte) 33
-        Arrays.fill(CHARS, 2902, 2904, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 2904, 2908, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2908, 2910, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2878, 2884, (byte) -87); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 2884, 2887, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2887, 2889, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2889, 2891, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 2891, 2894, (byte) -87); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2894, 2902, (byte) 33); // Fill 8 of value (byte) 33
+        Arrays.fill(CHARS, 2902, 2904, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2904, 2908, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2908, 2910, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[2910] = 33;
-        Arrays.fill(CHARS, 2911, 2914, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2914, 2918, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 2918, 2928, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 2928, 2946, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 2946, 2948, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 2911, 2914, (byte) -19); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2914, 2918, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 2918, 2928, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 2928, 2946, (byte) 33); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 2946, 2948, (byte) -87); // Fill 2 of value (byte) -87
         CHARS[2948] = 33;
-        Arrays.fill(CHARS, 2949, 2955, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 2955, 2958, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2958, 2961, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2949, 2955, (byte) -19); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 2955, 2958, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2958, 2961, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[2961] = 33;
-        Arrays.fill(CHARS, 2962, 2966, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 2966, 2969, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2969, 2971, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2962, 2966, (byte) -19); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 2966, 2969, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2969, 2971, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[2971] = 33;
         CHARS[2972] = -19;
         CHARS[2973] = 33;
-        Arrays.fill(CHARS, 2974, 2976, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2976, 2979, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2979, 2981, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 2981, 2984, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2984, 2987, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 2987, 2990, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 2990, 2998, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 2974, 2976, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2976, 2979, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2979, 2981, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 2981, 2984, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2984, 2987, (byte) -19); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 2987, 2990, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 2990, 2998, (byte) -19); // Fill 8 of value (byte) -19
         CHARS[2998] = 33;
-        Arrays.fill(CHARS, 2999, 3002, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 3002, 3006, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3006, 3011, (byte) -87 ); // Fill 5 of value (byte) -87
-        Arrays.fill(CHARS, 3011, 3014, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 3014, 3017, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 2999, 3002, (byte) -19); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 3002, 3006, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3006, 3011, (byte) -87); // Fill 5 of value (byte) -87
+        Arrays.fill(CHARS, 3011, 3014, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 3014, 3017, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[3017] = 33;
-        Arrays.fill(CHARS, 3018, 3022, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3022, 3031, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 3018, 3022, (byte) -87); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3022, 3031, (byte) 33); // Fill 9 of value (byte) 33
         CHARS[3031] = -87;
-        Arrays.fill(CHARS, 3032, 3047, (byte) 33 ); // Fill 15 of value (byte) 33
-        Arrays.fill(CHARS, 3047, 3056, (byte) -87 ); // Fill 9 of value (byte) -87
-        Arrays.fill(CHARS, 3056, 3073, (byte) 33 ); // Fill 17 of value (byte) 33
-        Arrays.fill(CHARS, 3073, 3076, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 3032, 3047, (byte) 33); // Fill 15 of value (byte) 33
+        Arrays.fill(CHARS, 3047, 3056, (byte) -87); // Fill 9 of value (byte) -87
+        Arrays.fill(CHARS, 3056, 3073, (byte) 33); // Fill 17 of value (byte) 33
+        Arrays.fill(CHARS, 3073, 3076, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[3076] = 33;
-        Arrays.fill(CHARS, 3077, 3085, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 3077, 3085, (byte) -19); // Fill 8 of value (byte) -19
         CHARS[3085] = 33;
-        Arrays.fill(CHARS, 3086, 3089, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 3086, 3089, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[3089] = 33;
-        Arrays.fill(CHARS, 3090, 3113, (byte) -19 ); // Fill 23 of value (byte) -19
+        Arrays.fill(CHARS, 3090, 3113, (byte) -19); // Fill 23 of value (byte) -19
         CHARS[3113] = 33;
-        Arrays.fill(CHARS, 3114, 3124, (byte) -19 ); // Fill 10 of value (byte) -19
+        Arrays.fill(CHARS, 3114, 3124, (byte) -19); // Fill 10 of value (byte) -19
         CHARS[3124] = 33;
-        Arrays.fill(CHARS, 3125, 3130, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 3130, 3134, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3134, 3141, (byte) -87 ); // Fill 7 of value (byte) -87
+        Arrays.fill(CHARS, 3125, 3130, (byte) -19); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 3130, 3134, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3134, 3141, (byte) -87); // Fill 7 of value (byte) -87
         CHARS[3141] = 33;
-        Arrays.fill(CHARS, 3142, 3145, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 3142, 3145, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[3145] = 33;
-        Arrays.fill(CHARS, 3146, 3150, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3150, 3157, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 3157, 3159, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3159, 3168, (byte) 33 ); // Fill 9 of value (byte) 33
-        Arrays.fill(CHARS, 3168, 3170, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3170, 3174, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3174, 3184, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3184, 3202, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 3202, 3204, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3146, 3150, (byte) -87); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3150, 3157, (byte) 33); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 3157, 3159, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3159, 3168, (byte) 33); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 3168, 3170, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3170, 3174, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3174, 3184, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3184, 3202, (byte) 33); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 3202, 3204, (byte) -87); // Fill 2 of value (byte) -87
         CHARS[3204] = 33;
-        Arrays.fill(CHARS, 3205, 3213, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 3205, 3213, (byte) -19); // Fill 8 of value (byte) -19
         CHARS[3213] = 33;
-        Arrays.fill(CHARS, 3214, 3217, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 3214, 3217, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[3217] = 33;
-        Arrays.fill(CHARS, 3218, 3241, (byte) -19 ); // Fill 23 of value (byte) -19
+        Arrays.fill(CHARS, 3218, 3241, (byte) -19); // Fill 23 of value (byte) -19
         CHARS[3241] = 33;
-        Arrays.fill(CHARS, 3242, 3252, (byte) -19 ); // Fill 10 of value (byte) -19
+        Arrays.fill(CHARS, 3242, 3252, (byte) -19); // Fill 10 of value (byte) -19
         CHARS[3252] = 33;
-        Arrays.fill(CHARS, 3253, 3258, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 3258, 3262, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3262, 3269, (byte) -87 ); // Fill 7 of value (byte) -87
+        Arrays.fill(CHARS, 3253, 3258, (byte) -19); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 3258, 3262, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3262, 3269, (byte) -87); // Fill 7 of value (byte) -87
         CHARS[3269] = 33;
-        Arrays.fill(CHARS, 3270, 3273, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 3270, 3273, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[3273] = 33;
-        Arrays.fill(CHARS, 3274, 3278, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3278, 3285, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 3285, 3287, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3287, 3294, (byte) 33 ); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 3274, 3278, (byte) -87); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3278, 3285, (byte) 33); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 3285, 3287, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3287, 3294, (byte) 33); // Fill 7 of value (byte) 33
         CHARS[3294] = -19;
         CHARS[3295] = 33;
-        Arrays.fill(CHARS, 3296, 3298, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3298, 3302, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3302, 3312, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3312, 3330, (byte) 33 ); // Fill 18 of value (byte) 33
-        Arrays.fill(CHARS, 3330, 3332, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3296, 3298, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3298, 3302, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3302, 3312, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3312, 3330, (byte) 33); // Fill 18 of value (byte) 33
+        Arrays.fill(CHARS, 3330, 3332, (byte) -87); // Fill 2 of value (byte) -87
         CHARS[3332] = 33;
-        Arrays.fill(CHARS, 3333, 3341, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 3333, 3341, (byte) -19); // Fill 8 of value (byte) -19
         CHARS[3341] = 33;
-        Arrays.fill(CHARS, 3342, 3345, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 3342, 3345, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[3345] = 33;
-        Arrays.fill(CHARS, 3346, 3369, (byte) -19 ); // Fill 23 of value (byte) -19
+        Arrays.fill(CHARS, 3346, 3369, (byte) -19); // Fill 23 of value (byte) -19
         CHARS[3369] = 33;
-        Arrays.fill(CHARS, 3370, 3386, (byte) -19 ); // Fill 16 of value (byte) -19
-        Arrays.fill(CHARS, 3386, 3390, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3390, 3396, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 3396, 3398, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3398, 3401, (byte) -87 ); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 3370, 3386, (byte) -19); // Fill 16 of value (byte) -19
+        Arrays.fill(CHARS, 3386, 3390, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3390, 3396, (byte) -87); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3396, 3398, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3398, 3401, (byte) -87); // Fill 3 of value (byte) -87
         CHARS[3401] = 33;
-        Arrays.fill(CHARS, 3402, 3406, (byte) -87 ); // Fill 4 of value (byte) -87
-        Arrays.fill(CHARS, 3406, 3415, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 3402, 3406, (byte) -87); // Fill 4 of value (byte) -87
+        Arrays.fill(CHARS, 3406, 3415, (byte) 33); // Fill 9 of value (byte) 33
         CHARS[3415] = -87;
-        Arrays.fill(CHARS, 3416, 3424, (byte) 33 ); // Fill 8 of value (byte) 33
-        Arrays.fill(CHARS, 3424, 3426, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3426, 3430, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3430, 3440, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3440, 3585, (byte) 33 ); // Fill 145 of value (byte) 33
-        Arrays.fill(CHARS, 3585, 3631, (byte) -19 ); // Fill 46 of value (byte) -19
+        Arrays.fill(CHARS, 3416, 3424, (byte) 33); // Fill 8 of value (byte) 33
+        Arrays.fill(CHARS, 3424, 3426, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3426, 3430, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3430, 3440, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3440, 3585, (byte) 33); // Fill 145 of value (byte) 33
+        Arrays.fill(CHARS, 3585, 3631, (byte) -19); // Fill 46 of value (byte) -19
         CHARS[3631] = 33;
         CHARS[3632] = -19;
         CHARS[3633] = -87;
-        Arrays.fill(CHARS, 3634, 3636, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3636, 3643, (byte) -87 ); // Fill 7 of value (byte) -87
-        Arrays.fill(CHARS, 3643, 3648, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 3648, 3654, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 3654, 3663, (byte) -87 ); // Fill 9 of value (byte) -87
+        Arrays.fill(CHARS, 3634, 3636, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3636, 3643, (byte) -87); // Fill 7 of value (byte) -87
+        Arrays.fill(CHARS, 3643, 3648, (byte) 33); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 3648, 3654, (byte) -19); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 3654, 3663, (byte) -87); // Fill 9 of value (byte) -87
         CHARS[3663] = 33;
-        Arrays.fill(CHARS, 3664, 3674, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3674, 3713, (byte) 33 ); // Fill 39 of value (byte) 33
-        Arrays.fill(CHARS, 3713, 3715, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3664, 3674, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3674, 3713, (byte) 33); // Fill 39 of value (byte) 33
+        Arrays.fill(CHARS, 3713, 3715, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[3715] = 33;
         CHARS[3716] = -19;
-        Arrays.fill(CHARS, 3717, 3719, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3719, 3721, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3717, 3719, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3719, 3721, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[3721] = 33;
         CHARS[3722] = -19;
-        Arrays.fill(CHARS, 3723, 3725, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3723, 3725, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[3725] = -19;
-        Arrays.fill(CHARS, 3726, 3732, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 3732, 3736, (byte) -19 ); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 3726, 3732, (byte) 33); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 3732, 3736, (byte) -19); // Fill 4 of value (byte) -19
         CHARS[3736] = 33;
-        Arrays.fill(CHARS, 3737, 3744, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 3737, 3744, (byte) -19); // Fill 7 of value (byte) -19
         CHARS[3744] = 33;
-        Arrays.fill(CHARS, 3745, 3748, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 3745, 3748, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[3748] = 33;
         CHARS[3749] = -19;
         CHARS[3750] = 33;
         CHARS[3751] = -19;
-        Arrays.fill(CHARS, 3752, 3754, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3754, 3756, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3752, 3754, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3754, 3756, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[3756] = 33;
-        Arrays.fill(CHARS, 3757, 3759, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3757, 3759, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[3759] = 33;
         CHARS[3760] = -19;
         CHARS[3761] = -87;
-        Arrays.fill(CHARS, 3762, 3764, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 3764, 3770, (byte) -87 ); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3762, 3764, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 3764, 3770, (byte) -87); // Fill 6 of value (byte) -87
         CHARS[3770] = 33;
-        Arrays.fill(CHARS, 3771, 3773, (byte) -87 ); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3771, 3773, (byte) -87); // Fill 2 of value (byte) -87
         CHARS[3773] = -19;
-        Arrays.fill(CHARS, 3774, 3776, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3776, 3781, (byte) -19 ); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 3774, 3776, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3776, 3781, (byte) -19); // Fill 5 of value (byte) -19
         CHARS[3781] = 33;
         CHARS[3782] = -87;
         CHARS[3783] = 33;
-        Arrays.fill(CHARS, 3784, 3790, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 3790, 3792, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 3792, 3802, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3802, 3864, (byte) 33 ); // Fill 62 of value (byte) 33
-        Arrays.fill(CHARS, 3864, 3866, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3866, 3872, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 3872, 3882, (byte) -87 ); // Fill 10 of value (byte) -87
-        Arrays.fill(CHARS, 3882, 3893, (byte) 33 ); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 3784, 3790, (byte) -87); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3790, 3792, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 3792, 3802, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3802, 3864, (byte) 33); // Fill 62 of value (byte) 33
+        Arrays.fill(CHARS, 3864, 3866, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3866, 3872, (byte) 33); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 3872, 3882, (byte) -87); // Fill 10 of value (byte) -87
+        Arrays.fill(CHARS, 3882, 3893, (byte) 33); // Fill 11 of value (byte) 33
         CHARS[3893] = -87;
         CHARS[3894] = 33;
         CHARS[3895] = -87;
         CHARS[3896] = 33;
         CHARS[3897] = -87;
-        Arrays.fill(CHARS, 3898, 3902, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3902, 3904, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 3904, 3912, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 3898, 3902, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3902, 3904, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 3904, 3912, (byte) -19); // Fill 8 of value (byte) -19
         CHARS[3912] = 33;
-        Arrays.fill(CHARS, 3913, 3946, (byte) -19 ); // Fill 33 of value (byte) -19
-        Arrays.fill(CHARS, 3946, 3953, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 3953, 3973, (byte) -87 ); // Fill 20 of value (byte) -87
+        Arrays.fill(CHARS, 3913, 3946, (byte) -19); // Fill 33 of value (byte) -19
+        Arrays.fill(CHARS, 3946, 3953, (byte) 33); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 3953, 3973, (byte) -87); // Fill 20 of value (byte) -87
         CHARS[3973] = 33;
-        Arrays.fill(CHARS, 3974, 3980, (byte) -87 ); // Fill 6 of value (byte) -87
-        Arrays.fill(CHARS, 3980, 3984, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 3984, 3990, (byte) -87 ); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3974, 3980, (byte) -87); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 3980, 3984, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 3984, 3990, (byte) -87); // Fill 6 of value (byte) -87
         CHARS[3990] = 33;
         CHARS[3991] = -87;
         CHARS[3992] = 33;
-        Arrays.fill(CHARS, 3993, 4014, (byte) -87 ); // Fill 21 of value (byte) -87
-        Arrays.fill(CHARS, 4014, 4017, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4017, 4024, (byte) -87 ); // Fill 7 of value (byte) -87
+        Arrays.fill(CHARS, 3993, 4014, (byte) -87); // Fill 21 of value (byte) -87
+        Arrays.fill(CHARS, 4014, 4017, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4017, 4024, (byte) -87); // Fill 7 of value (byte) -87
         CHARS[4024] = 33;
         CHARS[4025] = -87;
-        Arrays.fill(CHARS, 4026, 4256, (byte) 33 ); // Fill 230 of value (byte) 33
-        Arrays.fill(CHARS, 4256, 4294, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 4294, 4304, (byte) 33 ); // Fill 10 of value (byte) 33
-        Arrays.fill(CHARS, 4304, 4343, (byte) -19 ); // Fill 39 of value (byte) -19
-        Arrays.fill(CHARS, 4343, 4352, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 4026, 4256, (byte) 33); // Fill 230 of value (byte) 33
+        Arrays.fill(CHARS, 4256, 4294, (byte) -19); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 4294, 4304, (byte) 33); // Fill 10 of value (byte) 33
+        Arrays.fill(CHARS, 4304, 4343, (byte) -19); // Fill 39 of value (byte) -19
+        Arrays.fill(CHARS, 4343, 4352, (byte) 33); // Fill 9 of value (byte) 33
         CHARS[4352] = -19;
         CHARS[4353] = 33;
-        Arrays.fill(CHARS, 4354, 4356, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4354, 4356, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[4356] = 33;
-        Arrays.fill(CHARS, 4357, 4360, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 4357, 4360, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[4360] = 33;
         CHARS[4361] = -19;
         CHARS[4362] = 33;
-        Arrays.fill(CHARS, 4363, 4365, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4363, 4365, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[4365] = 33;
-        Arrays.fill(CHARS, 4366, 4371, (byte) -19 ); // Fill 5 of value (byte) -19
-        Arrays.fill(CHARS, 4371, 4412, (byte) 33 ); // Fill 41 of value (byte) 33
+        Arrays.fill(CHARS, 4366, 4371, (byte) -19); // Fill 5 of value (byte) -19
+        Arrays.fill(CHARS, 4371, 4412, (byte) 33); // Fill 41 of value (byte) 33
         CHARS[4412] = -19;
         CHARS[4413] = 33;
         CHARS[4414] = -19;
         CHARS[4415] = 33;
         CHARS[4416] = -19;
-        Arrays.fill(CHARS, 4417, 4428, (byte) 33 ); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 4417, 4428, (byte) 33); // Fill 11 of value (byte) 33
         CHARS[4428] = -19;
         CHARS[4429] = 33;
         CHARS[4430] = -19;
         CHARS[4431] = 33;
         CHARS[4432] = -19;
-        Arrays.fill(CHARS, 4433, 4436, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4436, 4438, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 4438, 4441, (byte) 33 ); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4433, 4436, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4436, 4438, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4438, 4441, (byte) 33); // Fill 3 of value (byte) 33
         CHARS[4441] = -19;
-        Arrays.fill(CHARS, 4442, 4447, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 4447, 4450, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 4442, 4447, (byte) 33); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 4447, 4450, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[4450] = 33;
         CHARS[4451] = -19;
         CHARS[4452] = 33;
@@ -612,46 +627,46 @@
         CHARS[4455] = -19;
         CHARS[4456] = 33;
         CHARS[4457] = -19;
-        Arrays.fill(CHARS, 4458, 4461, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4461, 4463, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 4463, 4466, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 4466, 4468, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4458, 4461, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4461, 4463, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4463, 4466, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 4466, 4468, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[4468] = 33;
         CHARS[4469] = -19;
-        Arrays.fill(CHARS, 4470, 4510, (byte) 33 ); // Fill 40 of value (byte) 33
+        Arrays.fill(CHARS, 4470, 4510, (byte) 33); // Fill 40 of value (byte) 33
         CHARS[4510] = -19;
-        Arrays.fill(CHARS, 4511, 4520, (byte) 33 ); // Fill 9 of value (byte) 33
+        Arrays.fill(CHARS, 4511, 4520, (byte) 33); // Fill 9 of value (byte) 33
         CHARS[4520] = -19;
-        Arrays.fill(CHARS, 4521, 4523, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 4521, 4523, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[4523] = -19;
-        Arrays.fill(CHARS, 4524, 4526, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 4526, 4528, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 4528, 4535, (byte) 33 ); // Fill 7 of value (byte) 33
-        Arrays.fill(CHARS, 4535, 4537, (byte) -19 ); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4524, 4526, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 4526, 4528, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 4528, 4535, (byte) 33); // Fill 7 of value (byte) 33
+        Arrays.fill(CHARS, 4535, 4537, (byte) -19); // Fill 2 of value (byte) -19
         CHARS[4537] = 33;
         CHARS[4538] = -19;
         CHARS[4539] = 33;
-        Arrays.fill(CHARS, 4540, 4547, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 4547, 4587, (byte) 33 ); // Fill 40 of value (byte) 33
+        Arrays.fill(CHARS, 4540, 4547, (byte) -19); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 4547, 4587, (byte) 33); // Fill 40 of value (byte) 33
         CHARS[4587] = -19;
-        Arrays.fill(CHARS, 4588, 4592, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 4588, 4592, (byte) 33); // Fill 4 of value (byte) 33
         CHARS[4592] = -19;
-        Arrays.fill(CHARS, 4593, 4601, (byte) 33 ); // Fill 8 of value (byte) 33
+        Arrays.fill(CHARS, 4593, 4601, (byte) 33); // Fill 8 of value (byte) 33
         CHARS[4601] = -19;
-        Arrays.fill(CHARS, 4602, 7680, (byte) 33 ); // Fill 3078 of value (byte) 33
-        Arrays.fill(CHARS, 7680, 7836, (byte) -19 ); // Fill 156 of value (byte) -19
-        Arrays.fill(CHARS, 7836, 7840, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 7840, 7930, (byte) -19 ); // Fill 90 of value (byte) -19
-        Arrays.fill(CHARS, 7930, 7936, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 7936, 7958, (byte) -19 ); // Fill 22 of value (byte) -19
-        Arrays.fill(CHARS, 7958, 7960, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 7960, 7966, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 7966, 7968, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 7968, 8006, (byte) -19 ); // Fill 38 of value (byte) -19
-        Arrays.fill(CHARS, 8006, 8008, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8008, 8014, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 8014, 8016, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8016, 8024, (byte) -19 ); // Fill 8 of value (byte) -19
+        Arrays.fill(CHARS, 4602, 7680, (byte) 33); // Fill 3078 of value (byte) 33
+        Arrays.fill(CHARS, 7680, 7836, (byte) -19); // Fill 156 of value (byte) -19
+        Arrays.fill(CHARS, 7836, 7840, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 7840, 7930, (byte) -19); // Fill 90 of value (byte) -19
+        Arrays.fill(CHARS, 7930, 7936, (byte) 33); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 7936, 7958, (byte) -19); // Fill 22 of value (byte) -19
+        Arrays.fill(CHARS, 7958, 7960, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 7960, 7966, (byte) -19); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 7966, 7968, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 7968, 8006, (byte) -19); // Fill 38 of value (byte) -19
+        Arrays.fill(CHARS, 8006, 8008, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8008, 8014, (byte) -19); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 8014, 8016, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8016, 8024, (byte) -19); // Fill 8 of value (byte) -19
         CHARS[8024] = 33;
         CHARS[8025] = -19;
         CHARS[8026] = 33;
@@ -659,66 +674,66 @@
         CHARS[8028] = 33;
         CHARS[8029] = -19;
         CHARS[8030] = 33;
-        Arrays.fill(CHARS, 8031, 8062, (byte) -19 ); // Fill 31 of value (byte) -19
-        Arrays.fill(CHARS, 8062, 8064, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8064, 8117, (byte) -19 ); // Fill 53 of value (byte) -19
+        Arrays.fill(CHARS, 8031, 8062, (byte) -19); // Fill 31 of value (byte) -19
+        Arrays.fill(CHARS, 8062, 8064, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8064, 8117, (byte) -19); // Fill 53 of value (byte) -19
         CHARS[8117] = 33;
-        Arrays.fill(CHARS, 8118, 8125, (byte) -19 ); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 8118, 8125, (byte) -19); // Fill 7 of value (byte) -19
         CHARS[8125] = 33;
         CHARS[8126] = -19;
-        Arrays.fill(CHARS, 8127, 8130, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 8130, 8133, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 8127, 8130, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 8130, 8133, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[8133] = 33;
-        Arrays.fill(CHARS, 8134, 8141, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 8141, 8144, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 8144, 8148, (byte) -19 ); // Fill 4 of value (byte) -19
-        Arrays.fill(CHARS, 8148, 8150, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 8150, 8156, (byte) -19 ); // Fill 6 of value (byte) -19
-        Arrays.fill(CHARS, 8156, 8160, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 8160, 8173, (byte) -19 ); // Fill 13 of value (byte) -19
-        Arrays.fill(CHARS, 8173, 8178, (byte) 33 ); // Fill 5 of value (byte) 33
-        Arrays.fill(CHARS, 8178, 8181, (byte) -19 ); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 8134, 8141, (byte) -19); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 8141, 8144, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 8144, 8148, (byte) -19); // Fill 4 of value (byte) -19
+        Arrays.fill(CHARS, 8148, 8150, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8150, 8156, (byte) -19); // Fill 6 of value (byte) -19
+        Arrays.fill(CHARS, 8156, 8160, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 8160, 8173, (byte) -19); // Fill 13 of value (byte) -19
+        Arrays.fill(CHARS, 8173, 8178, (byte) 33); // Fill 5 of value (byte) 33
+        Arrays.fill(CHARS, 8178, 8181, (byte) -19); // Fill 3 of value (byte) -19
         CHARS[8181] = 33;
-        Arrays.fill(CHARS, 8182, 8189, (byte) -19 ); // Fill 7 of value (byte) -19
-        Arrays.fill(CHARS, 8189, 8400, (byte) 33 ); // Fill 211 of value (byte) 33
-        Arrays.fill(CHARS, 8400, 8413, (byte) -87 ); // Fill 13 of value (byte) -87
-        Arrays.fill(CHARS, 8413, 8417, (byte) 33 ); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 8182, 8189, (byte) -19); // Fill 7 of value (byte) -19
+        Arrays.fill(CHARS, 8189, 8400, (byte) 33); // Fill 211 of value (byte) 33
+        Arrays.fill(CHARS, 8400, 8413, (byte) -87); // Fill 13 of value (byte) -87
+        Arrays.fill(CHARS, 8413, 8417, (byte) 33); // Fill 4 of value (byte) 33
         CHARS[8417] = -87;
-        Arrays.fill(CHARS, 8418, 8486, (byte) 33 ); // Fill 68 of value (byte) 33
+        Arrays.fill(CHARS, 8418, 8486, (byte) 33); // Fill 68 of value (byte) 33
         CHARS[8486] = -19;
-        Arrays.fill(CHARS, 8487, 8490, (byte) 33 ); // Fill 3 of value (byte) 33
-        Arrays.fill(CHARS, 8490, 8492, (byte) -19 ); // Fill 2 of value (byte) -19
-        Arrays.fill(CHARS, 8492, 8494, (byte) 33 ); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 8487, 8490, (byte) 33); // Fill 3 of value (byte) 33
+        Arrays.fill(CHARS, 8490, 8492, (byte) -19); // Fill 2 of value (byte) -19
+        Arrays.fill(CHARS, 8492, 8494, (byte) 33); // Fill 2 of value (byte) 33
         CHARS[8494] = -19;
-        Arrays.fill(CHARS, 8495, 8576, (byte) 33 ); // Fill 81 of value (byte) 33
-        Arrays.fill(CHARS, 8576, 8579, (byte) -19 ); // Fill 3 of value (byte) -19
-        Arrays.fill(CHARS, 8579, 12293, (byte) 33 ); // Fill 3714 of value (byte) 33
+        Arrays.fill(CHARS, 8495, 8576, (byte) 33); // Fill 81 of value (byte) 33
+        Arrays.fill(CHARS, 8576, 8579, (byte) -19); // Fill 3 of value (byte) -19
+        Arrays.fill(CHARS, 8579, 12293, (byte) 33); // Fill 3714 of value (byte) 33
         CHARS[12293] = -87;
         CHARS[12294] = 33;
         CHARS[12295] = -19;
-        Arrays.fill(CHARS, 12296, 12321, (byte) 33 ); // Fill 25 of value (byte) 33
-        Arrays.fill(CHARS, 12321, 12330, (byte) -19 ); // Fill 9 of value (byte) -19
-        Arrays.fill(CHARS, 12330, 12336, (byte) -87 ); // Fill 6 of value (byte) -87
+        Arrays.fill(CHARS, 12296, 12321, (byte) 33); // Fill 25 of value (byte) 33
+        Arrays.fill(CHARS, 12321, 12330, (byte) -19); // Fill 9 of value (byte) -19
+        Arrays.fill(CHARS, 12330, 12336, (byte) -87); // Fill 6 of value (byte) -87
         CHARS[12336] = 33;
-        Arrays.fill(CHARS, 12337, 12342, (byte) -87 ); // Fill 5 of value (byte) -87
-        Arrays.fill(CHARS, 12342, 12353, (byte) 33 ); // Fill 11 of value (byte) 33
-        Arrays.fill(CHARS, 12353, 12437, (byte) -19 ); // Fill 84 of value (byte) -19
-        Arrays.fill(CHARS, 12437, 12441, (byte) 33 ); // Fill 4 of value (byte) 33
-        Arrays.fill(CHARS, 12441, 12443, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 12443, 12445, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 12445, 12447, (byte) -87 ); // Fill 2 of value (byte) -87
-        Arrays.fill(CHARS, 12447, 12449, (byte) 33 ); // Fill 2 of value (byte) 33
-        Arrays.fill(CHARS, 12449, 12539, (byte) -19 ); // Fill 90 of value (byte) -19
+        Arrays.fill(CHARS, 12337, 12342, (byte) -87); // Fill 5 of value (byte) -87
+        Arrays.fill(CHARS, 12342, 12353, (byte) 33); // Fill 11 of value (byte) 33
+        Arrays.fill(CHARS, 12353, 12437, (byte) -19); // Fill 84 of value (byte) -19
+        Arrays.fill(CHARS, 12437, 12441, (byte) 33); // Fill 4 of value (byte) 33
+        Arrays.fill(CHARS, 12441, 12443, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 12443, 12445, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 12445, 12447, (byte) -87); // Fill 2 of value (byte) -87
+        Arrays.fill(CHARS, 12447, 12449, (byte) 33); // Fill 2 of value (byte) 33
+        Arrays.fill(CHARS, 12449, 12539, (byte) -19); // Fill 90 of value (byte) -19
         CHARS[12539] = 33;
-        Arrays.fill(CHARS, 12540, 12543, (byte) -87 ); // Fill 3 of value (byte) -87
-        Arrays.fill(CHARS, 12543, 12549, (byte) 33 ); // Fill 6 of value (byte) 33
-        Arrays.fill(CHARS, 12549, 12589, (byte) -19 ); // Fill 40 of value (byte) -19
-        Arrays.fill(CHARS, 12589, 19968, (byte) 33 ); // Fill 7379 of value (byte) 33
-        Arrays.fill(CHARS, 19968, 40870, (byte) -19 ); // Fill 20902 of value (byte) -19
-        Arrays.fill(CHARS, 40870, 44032, (byte) 33 ); // Fill 3162 of value (byte) 33
-        Arrays.fill(CHARS, 44032, 55204, (byte) -19 ); // Fill 11172 of value (byte) -19
-        Arrays.fill(CHARS, 55204, 55296, (byte) 33 ); // Fill 92 of value (byte) 33
-        Arrays.fill(CHARS, 57344, 65534, (byte) 33 ); // Fill 8190 of value (byte) 33
+        Arrays.fill(CHARS, 12540, 12543, (byte) -87); // Fill 3 of value (byte) -87
+        Arrays.fill(CHARS, 12543, 12549, (byte) 33); // Fill 6 of value (byte) 33
+        Arrays.fill(CHARS, 12549, 12589, (byte) -19); // Fill 40 of value (byte) -19
+        Arrays.fill(CHARS, 12589, 19968, (byte) 33); // Fill 7379 of value (byte) 33
+        Arrays.fill(CHARS, 19968, 40870, (byte) -19); // Fill 20902 of value (byte) -19
+        Arrays.fill(CHARS, 40870, 44032, (byte) 33); // Fill 3162 of value (byte) 33
+        Arrays.fill(CHARS, 44032, 55204, (byte) -19); // Fill 11172 of value (byte) -19
+        Arrays.fill(CHARS, 55204, 55296, (byte) 33); // Fill 92 of value (byte) 33
+        Arrays.fill(CHARS, 57344, 65534, (byte) 33); // Fill 8190 of value (byte) 33
 
     } // <clinit>()
 
@@ -786,7 +801,7 @@
     /**
      * Returns true if the specified character is valid. This method
      * also checks the surrogate character range from 0x10000 to 0x10FFFF.
-     * <p>
+     * <p/>
      * If the program chooses to apply the mask directly to the
      * <code>CHARS</code> array, then they are responsible for checking
      * the surrogate character range.
@@ -795,7 +810,7 @@
      */
     public static boolean isValid(int c) {
         return (c < 0x10000 && (CHARS[c] & MASK_VALID) != 0) ||
-               (0x10000 <= c && c <= 0x10FFFF);
+                (0x10000 <= c && c <= 0x10FFFF);
     } // isValid(int):boolean
 
     /**
@@ -814,7 +829,7 @@
      */
     public static boolean isContent(int c) {
         return (c < 0x10000 && (CHARS[c] & MASK_CONTENT) != 0) ||
-               (0x10000 <= c && c <= 0x10FFFF);
+                (0x10000 <= c && c <= 0x10FFFF);
     } // isContent(int):boolean
 
     /**
@@ -906,22 +921,22 @@
         if (name.length() == 0)
             return false;
         char ch = name.charAt(0);
-        if( isNameStart(ch) == false)
-           return false;
-        for (int i = 1; i < name.length(); i++ ) {
-           ch = name.charAt(i);
-           if( isName( ch ) == false ){
-              return false;
-           }
+        if (isNameStart(ch) == false)
+            return false;
+        for (int i = 1; i < name.length(); i++) {
+            ch = name.charAt(i);
+            if (isName(ch) == false) {
+                return false;
+            }
         }
         return true;
     } // isValidName(String):boolean
-    
+
 
     /*
-     * from the namespace rec
-     * [4] NCName ::= (Letter | '_') (NCNameChar)*
-     */
+    * from the namespace rec
+    * [4] NCName ::= (Letter | '_') (NCNameChar)*
+    */
     /**
      * Check to see if a string is a valid NCName according to [4]
      * from the XML Namespaces 1.0 Recommendation
@@ -933,13 +948,13 @@
         if (ncName.length() == 0)
             return false;
         char ch = ncName.charAt(0);
-        if( isNCNameStart(ch) == false)
-           return false;
-        for (int i = 1; i < ncName.length(); i++ ) {
-           ch = ncName.charAt(i);
-           if( isNCName( ch ) == false ){
-              return false;
-           }
+        if (isNCNameStart(ch) == false)
+            return false;
+        for (int i = 1; i < ncName.length(); i++) {
+            ch = ncName.charAt(i);
+            if (isNCName(ch) == false) {
+                return false;
+            }
         }
         return true;
     } // isValidNCName(String):boolean
@@ -952,24 +967,21 @@
      * in the XML 1.0 Recommendation
      *
      * @param nmtoken string to check
-     * @return true if nmtoken is a valid Nmtoken 
+     * @return true if nmtoken is a valid Nmtoken
      */
     public static boolean isValidNmtoken(String nmtoken) {
         if (nmtoken.length() == 0)
             return false;
-        for (int i = 0; i < nmtoken.length(); i++ ) {
-           char ch = nmtoken.charAt(i);
-           if(  ! isName( ch ) ){
-              return false;
-           }
+        for (int i = 0; i < nmtoken.length(); i++) {
+            char ch = nmtoken.charAt(i);
+            if (!isName(ch)) {
+                return false;
+            }
         }
         return true;
     } // isValidName(String):boolean
 
 
-
-
-
     // encodings
 
     /**
@@ -989,8 +1001,8 @@
                     for (int i = 1; i < length; i++) {
                         c = ianaEncoding.charAt(i);
                         if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
-                            (c < '0' || c > '9') && c != '.' && c != '_' &&
-                            c != '-') {
+                                (c < '0' || c > '9') && c != '.' && c != '_' &&
+                                c != '-') {
                             return false;
                         }
                     }
@@ -1016,8 +1028,8 @@
                 for (int i = 1; i < length; i++) {
                     char c = javaEncoding.charAt(i);
                     if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
-                        (c < '0' || c > '9') && c != '.' && c != '_' &&
-                        c != '-') {
+                            (c < '0' || c > '9') && c != '.' && c != '_' &&
+                            c != '-') {
                         return false;
                     }
                 }
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLEncodingDetector.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLEncodingDetector.java
index 8e09df2..c5a0653 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLEncodingDetector.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLEncodingDetector.java
@@ -35,13 +35,13 @@
 import java.util.jar.JarFile;
 
 public class XMLEncodingDetector {
-    
+
     private InputStream stream;
     private String encoding;
     private boolean isEncodingSetInProlog;
     private Boolean isBigEndian;
     private Reader reader;
-    
+
     // org.apache.xerces.impl.XMLEntityManager fields
     public static final int DEFAULT_BUFFER_SIZE = 2048;
     public static final int DEFAULT_XMLDECL_BUFFER_SIZE = 64;
@@ -49,7 +49,7 @@
     private SymbolTable fSymbolTable;
     private XMLEncodingDetector fCurrentEntity;
     private int fBufferSize = DEFAULT_BUFFER_SIZE;
-    
+
     // org.apache.xerces.impl.XMLEntityManager.ScannedEntity fields
     private int lineNumber = 1;
     private int columnNumber = 1;
@@ -58,15 +58,15 @@
     private int position;
     private int count;
     private boolean mayReadChunks = false;
-    
+
     // org.apache.xerces.impl.XMLScanner fields
-    private XMLString fString = new XMLString();    
+    private XMLString fString = new XMLString();
     private XMLStringBuffer fStringBuffer = new XMLStringBuffer();
     private XMLStringBuffer fStringBuffer2 = new XMLStringBuffer();
     private final static String fVersionSymbol = "version";
     private final static String fEncodingSymbol = "encoding";
     private final static String fStandaloneSymbol = "standalone";
-    
+
     // org.apache.xerces.impl.XMLDocumentFragmentScannerImpl fields
     private int fMarkupDepth = 0;
     private String[] fStrings = new String[3];
@@ -84,23 +84,22 @@
     /**
      * Autodetects the encoding of the XML document supplied by the given
      * input stream.
-     *
+     * <p/>
      * Encoding autodetection is done according to the XML 1.0 specification,
      * Appendix F.1: Detection Without External Encoding Information.
      *
      * @return Two-element array, where the first element (of type
-     * java.lang.String) contains the name of the (auto)detected encoding, and
-     * the second element (of type java.lang.Boolean) specifies whether the 
-     * encoding was specified using the 'encoding' attribute of an XML prolog
-     * (TRUE) or autodetected (FALSE).
+     *         java.lang.String) contains the name of the (auto)detected encoding, and
+     *         the second element (of type java.lang.Boolean) specifies whether the
+     *         encoding was specified using the 'encoding' attribute of an XML prolog
+     *         (TRUE) or autodetected (FALSE).
      */
     public static Object[] getEncoding(String fname, JarFile jarFile,
                                        JspCompilationContext ctxt,
                                        ErrorDispatcher err)
-        throws IOException, JasperException
-    {
+            throws IOException, JasperException {
         InputStream inStream = JspUtil.getInputStream(fname, jarFile, ctxt,
-                                                      err);
+                err);
         XMLEncodingDetector detector = new XMLEncodingDetector();
         Object[] ret = detector.getEncoding(inStream, err);
         inStream.close();
@@ -109,59 +108,58 @@
     }
 
     private Object[] getEncoding(InputStream in, ErrorDispatcher err)
-        throws IOException, JasperException
-    {
+            throws IOException, JasperException {
         this.stream = in;
-        this.err=err;
+        this.err = err;
         createInitialReader();
         scanXMLDecl();
-	
-        return new Object[] { this.encoding,
-                              new Boolean(this.isEncodingSetInProlog) };
+
+        return new Object[]{this.encoding,
+                new Boolean(this.isEncodingSetInProlog)};
     }
-    
+
     // stub method
     void endEntity() {
     }
-    
+
     // Adapted from:
     // org.apache.xerces.impl.XMLEntityManager.startEntity()
     private void createInitialReader() throws IOException, JasperException {
 
-	// wrap this stream in RewindableInputStream
-	stream = new RewindableInputStream(stream);
+        // wrap this stream in RewindableInputStream
+        stream = new RewindableInputStream(stream);
 
-	// perform auto-detect of encoding if necessary
-	if (encoding == null) {
-	    // read first four bytes and determine encoding
-	    final byte[] b4 = new byte[4];
-	    int count = 0;
-	    for (; count<4; count++ ) {
-		b4[count] = (byte)stream.read();
-	    }
-	    if (count == 4) {
-		Object [] encodingDesc = getEncodingName(b4, count);
-		encoding = (String)(encodingDesc[0]);
-		isBigEndian = (Boolean)(encodingDesc[1]);
+        // perform auto-detect of encoding if necessary
+        if (encoding == null) {
+            // read first four bytes and determine encoding
+            final byte[] b4 = new byte[4];
+            int count = 0;
+            for (; count < 4; count++) {
+                b4[count] = (byte) stream.read();
+            }
+            if (count == 4) {
+                Object[] encodingDesc = getEncodingName(b4, count);
+                encoding = (String) (encodingDesc[0]);
+                isBigEndian = (Boolean) (encodingDesc[1]);
 
-		stream.reset();
-		// Special case UTF-8 files with BOM created by Microsoft
-		// tools. It's more efficient to consume the BOM than make
-		// the reader perform extra checks. -Ac
-		if (count > 2 && encoding.equals("UTF-8")) {
-		    int b0 = b4[0] & 0xFF;
-		    int b1 = b4[1] & 0xFF;
-		    int b2 = b4[2] & 0xFF;
-		    if (b0 == 0xEF && b1 == 0xBB && b2 == 0xBF) {
-			// ignore first three bytes...
-			stream.skip(3);
-		    }
-		}
-		reader = createReader(stream, encoding, isBigEndian);
-	    } else {
-		reader = createReader(stream, encoding, isBigEndian);
-	    }
-	}
+                stream.reset();
+                // Special case UTF-8 files with BOM created by Microsoft
+                // tools. It's more efficient to consume the BOM than make
+                // the reader perform extra checks. -Ac
+                if (count > 2 && encoding.equals("UTF-8")) {
+                    int b0 = b4[0] & 0xFF;
+                    int b1 = b4[1] & 0xFF;
+                    int b2 = b4[2] & 0xFF;
+                    if (b0 == 0xEF && b1 == 0xBB && b2 == 0xBF) {
+                        // ignore first three bytes...
+                        stream.skip(3);
+                    }
+                }
+                reader = createReader(stream, encoding, isBigEndian);
+            } else {
+                reader = createReader(stream, encoding, isBigEndian);
+            }
+        }
     }
 
     // Adapted from:
@@ -170,21 +168,20 @@
      * Creates a reader capable of reading the given input stream in
      * the specified encoding.
      *
-     * @param inputStream  The input stream.
-     * @param encoding     The encoding name that the input stream is
-     *                     encoded using. If the user has specified that
-     *                     Java encoding names are allowed, then the
-     *                     encoding name may be a Java encoding name;
-     *                     otherwise, it is an ianaEncoding name.
-     * @param isBigEndian   For encodings (like uCS-4), whose names cannot
-     *                      specify a byte order, this tells whether the order
-     *                      is bigEndian. null means unknown or not relevant.
-     *
+     * @param inputStream The input stream.
+     * @param encoding    The encoding name that the input stream is
+     *                    encoded using. If the user has specified that
+     *                    Java encoding names are allowed, then the
+     *                    encoding name may be a Java encoding name;
+     *                    otherwise, it is an ianaEncoding name.
+     * @param isBigEndian For encodings (like uCS-4), whose names cannot
+     *                    specify a byte order, this tells whether the order
+     *                    is bigEndian. null means unknown or not relevant.
      * @return Returns a reader.
      */
     private Reader createReader(InputStream inputStream, String encoding,
-				Boolean isBigEndian)
-                throws IOException, JasperException {
+                                Boolean isBigEndian)
+            throws IOException, JasperException {
 
         // normalize encoding name
         if (encoding == null) {
@@ -209,7 +206,7 @@
                 }
             } else {
                 err.jspError("jsp.error.xml.encodingByteOrderUnsupported",
-			     encoding);
+                        encoding);
             }
         }
         if (ENCODING.equals("ISO-10646-UCS-2")) {
@@ -222,7 +219,7 @@
                 }
             } else {
                 err.jspError("jsp.error.xml.encodingByteOrderUnsupported",
-			     encoding);
+                        encoding);
             }
         }
 
@@ -246,7 +243,7 @@
         String javaEncoding = EncodingMap.getIANA2JavaMapping(ENCODING);
         if (javaEncoding == null) {
             if (fAllowJavaEncodings) {
-		javaEncoding = encoding;
+                javaEncoding = encoding;
             } else {
                 err.jspError("jsp.error.xml.encodingDeclInvalid", encoding);
                 // see comment above.
@@ -267,9 +264,9 @@
      * @param b4    The first four bytes of the input.
      * @param count The number of bytes actually read.
      * @return a 2-element array:  the first element, an IANA-encoding string,
-     *  the second element a Boolean which is true iff the document is big
-     *  endian, false if it's little-endian, and null if the distinction isn't
-     *  relevant.
+     *         the second element a Boolean which is true iff the document is big
+     *         endian, false if it's little-endian, and null if the distinction isn't
+     *         relevant.
      */
     private Object[] getEncodingName(byte[] b4, int count) {
 
@@ -282,115 +279,116 @@
         int b1 = b4[1] & 0xFF;
         if (b0 == 0xFE && b1 == 0xFF) {
             // UTF-16, big-endian
-            return new Object [] {"UTF-16BE", new Boolean(true)};
+            return new Object[]{"UTF-16BE", new Boolean(true)};
         }
         if (b0 == 0xFF && b1 == 0xFE) {
             // UTF-16, little-endian
-            return new Object [] {"UTF-16LE", new Boolean(false)};
+            return new Object[]{"UTF-16LE", new Boolean(false)};
         }
 
         // default to UTF-8 if we don't have enough bytes to make a
         // good determination of the encoding
         if (count < 3) {
-            return new Object [] {"UTF-8", null};
+            return new Object[]{"UTF-8", null};
         }
 
         // UTF-8 with a BOM
         int b2 = b4[2] & 0xFF;
         if (b0 == 0xEF && b1 == 0xBB && b2 == 0xBF) {
-            return new Object [] {"UTF-8", null};
+            return new Object[]{"UTF-8", null};
         }
 
         // default to UTF-8 if we don't have enough bytes to make a
         // good determination of the encoding
         if (count < 4) {
-            return new Object [] {"UTF-8", null};
+            return new Object[]{"UTF-8", null};
         }
 
         // other encodings
         int b3 = b4[3] & 0xFF;
         if (b0 == 0x00 && b1 == 0x00 && b2 == 0x00 && b3 == 0x3C) {
             // UCS-4, big endian (1234)
-            return new Object [] {"ISO-10646-UCS-4", new Boolean(true)};
+            return new Object[]{"ISO-10646-UCS-4", new Boolean(true)};
         }
         if (b0 == 0x3C && b1 == 0x00 && b2 == 0x00 && b3 == 0x00) {
             // UCS-4, little endian (4321)
-            return new Object [] {"ISO-10646-UCS-4", new Boolean(false)};
+            return new Object[]{"ISO-10646-UCS-4", new Boolean(false)};
         }
         if (b0 == 0x00 && b1 == 0x00 && b2 == 0x3C && b3 == 0x00) {
             // UCS-4, unusual octet order (2143)
             // REVISIT: What should this be?
-            return new Object [] {"ISO-10646-UCS-4", null};
+            return new Object[]{"ISO-10646-UCS-4", null};
         }
         if (b0 == 0x00 && b1 == 0x3C && b2 == 0x00 && b3 == 0x00) {
             // UCS-4, unusual octect order (3412)
             // REVISIT: What should this be?
-            return new Object [] {"ISO-10646-UCS-4", null};
+            return new Object[]{"ISO-10646-UCS-4", null};
         }
         if (b0 == 0x00 && b1 == 0x3C && b2 == 0x00 && b3 == 0x3F) {
             // UTF-16, big-endian, no BOM
             // (or could turn out to be UCS-2...
             // REVISIT: What should this be?
-            return new Object [] {"UTF-16BE", new Boolean(true)};
+            return new Object[]{"UTF-16BE", new Boolean(true)};
         }
         if (b0 == 0x3C && b1 == 0x00 && b2 == 0x3F && b3 == 0x00) {
             // UTF-16, little-endian, no BOM
             // (or could turn out to be UCS-2...
-            return new Object [] {"UTF-16LE", new Boolean(false)};
+            return new Object[]{"UTF-16LE", new Boolean(false)};
         }
         if (b0 == 0x4C && b1 == 0x6F && b2 == 0xA7 && b3 == 0x94) {
             // EBCDIC
             // a la xerces1, return CP037 instead of EBCDIC here
-            return new Object [] {"CP037", null};
+            return new Object[]{"CP037", null};
         }
 
         // default encoding
-        return new Object [] {"UTF-8", null};
+        return new Object[]{"UTF-8", null};
 
     }
 
     // Adapted from:
     // org.apache.xerces.impl.XMLEntityManager.EntityScanner.isExternal
-    /** Returns true if the current entity being scanned is external. */
+    /**
+     * Returns true if the current entity being scanned is external.
+     */
     public boolean isExternal() {
-	return true;
+        return true;
     }
 
     // Adapted from:
     // org.apache.xerces.impl.XMLEntityManager.EntityScanner.peekChar
     /**
      * Returns the next character on the input.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The character is <em>not</em> consumed.
      *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
      */
     public int peekChar() throws IOException {
-	
-	// load more characters, if needed
-	if (fCurrentEntity.position == fCurrentEntity.count) {
-	    load(0, true);
-	}
-	
-	// peek at character
-	int c = fCurrentEntity.ch[fCurrentEntity.position];
 
-	// return peeked character
-	if (fCurrentEntity.isExternal()) {
-	    return c != '\r' ? c : '\n';
-	}
-	else {
-	    return c;
-	}
-	
+        // load more characters, if needed
+        if (fCurrentEntity.position == fCurrentEntity.count) {
+            load(0, true);
+        }
+
+        // peek at character
+        int c = fCurrentEntity.ch[fCurrentEntity.position];
+
+        // return peeked character
+        if (fCurrentEntity.isExternal()) {
+            return c != '\r' ? c : '\n';
+        } else {
+            return c;
+        }
+
     } // peekChar():int
-    
+
     // Adapted from:
     // org.apache.xerces.impl.XMLEntityManager.EntityScanner.scanChar
     /**
      * Returns the next character on the input.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The character is consumed.
      *
      * @throws IOException  Thrown if i/o error occurs.
@@ -398,34 +396,34 @@
      */
     public int scanChar() throws IOException {
 
-	// load more characters, if needed
-	if (fCurrentEntity.position == fCurrentEntity.count) {
-	    load(0, true);
-	}
+        // load more characters, if needed
+        if (fCurrentEntity.position == fCurrentEntity.count) {
+            load(0, true);
+        }
 
-	// scan character
-	int c = fCurrentEntity.ch[fCurrentEntity.position++];
-	boolean external = false;
-	if (c == '\n' ||
-	    (c == '\r' && (external = fCurrentEntity.isExternal()))) {
-	    fCurrentEntity.lineNumber++;
-	    fCurrentEntity.columnNumber = 1;
-	    if (fCurrentEntity.position == fCurrentEntity.count) {
-		fCurrentEntity.ch[0] = (char)c;
-		load(1, false);
-	    }
-	    if (c == '\r' && external) {
-		if (fCurrentEntity.ch[fCurrentEntity.position++] != '\n') {
-		    fCurrentEntity.position--;
-		}
-		c = '\n';
-	    }
-	}
+        // scan character
+        int c = fCurrentEntity.ch[fCurrentEntity.position++];
+        boolean external = false;
+        if (c == '\n' ||
+                (c == '\r' && (external = fCurrentEntity.isExternal()))) {
+            fCurrentEntity.lineNumber++;
+            fCurrentEntity.columnNumber = 1;
+            if (fCurrentEntity.position == fCurrentEntity.count) {
+                fCurrentEntity.ch[0] = (char) c;
+                load(1, false);
+            }
+            if (c == '\r' && external) {
+                if (fCurrentEntity.ch[fCurrentEntity.position++] != '\n') {
+                    fCurrentEntity.position--;
+                }
+                c = '\n';
+            }
+        }
 
-	// return character that was scanned
-	fCurrentEntity.columnNumber++;
-	return c;
-	
+        // return character that was scanned
+        fCurrentEntity.columnNumber++;
+        return c;
+
     }
 
     // Adapted from:
@@ -433,70 +431,69 @@
     /**
      * Returns a string matching the Name production appearing immediately
      * on the input as a symbol, or null if no Name string is present.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The Name characters are consumed.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The string returned must be a symbol. The
      * SymbolTable can be used for this purpose.
      *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
-     *
      * @see SymbolTable
      * @see XMLChar#isName
      * @see XMLChar#isNameStart
      */
     public String scanName() throws IOException {
-	
-	// load more characters, if needed
-	if (fCurrentEntity.position == fCurrentEntity.count) {
-	    load(0, true);
-	}
-	
-	// scan name
-	int offset = fCurrentEntity.position;
-	if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) {
-	    if (++fCurrentEntity.position == fCurrentEntity.count) {
-		fCurrentEntity.ch[0] = fCurrentEntity.ch[offset];
-		offset = 0;
-		if (load(1, false)) {
-		    fCurrentEntity.columnNumber++;
-		    String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch,
-							   0, 1);
-		    return symbol;
-		}
-	    }
-	    while (XMLChar.isName(fCurrentEntity.ch[fCurrentEntity.position])) {
-		if (++fCurrentEntity.position == fCurrentEntity.count) {
-		    int length = fCurrentEntity.position - offset;
-		    if (length == fBufferSize) {
-			// bad luck we have to resize our buffer
-			char[] tmp = new char[fBufferSize * 2];
-			System.arraycopy(fCurrentEntity.ch, offset,
-					 tmp, 0, length);
-			fCurrentEntity.ch = tmp;
-			fBufferSize *= 2;
-		    } else {
-			System.arraycopy(fCurrentEntity.ch, offset,
-					 fCurrentEntity.ch, 0, length);
-		    }
-		    offset = 0;
-		    if (load(length, false)) {
-			break;
-		    }
-		}
-	    }
-	}
-	int length = fCurrentEntity.position - offset;
-	fCurrentEntity.columnNumber += length;
 
-	// return name
-	String symbol = null;
-	if (length > 0) {
-	    symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, offset, length);
-	}
-	return symbol;
-	
+        // load more characters, if needed
+        if (fCurrentEntity.position == fCurrentEntity.count) {
+            load(0, true);
+        }
+
+        // scan name
+        int offset = fCurrentEntity.position;
+        if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) {
+            if (++fCurrentEntity.position == fCurrentEntity.count) {
+                fCurrentEntity.ch[0] = fCurrentEntity.ch[offset];
+                offset = 0;
+                if (load(1, false)) {
+                    fCurrentEntity.columnNumber++;
+                    String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch,
+                            0, 1);
+                    return symbol;
+                }
+            }
+            while (XMLChar.isName(fCurrentEntity.ch[fCurrentEntity.position])) {
+                if (++fCurrentEntity.position == fCurrentEntity.count) {
+                    int length = fCurrentEntity.position - offset;
+                    if (length == fBufferSize) {
+                        // bad luck we have to resize our buffer
+                        char[] tmp = new char[fBufferSize * 2];
+                        System.arraycopy(fCurrentEntity.ch, offset,
+                                tmp, 0, length);
+                        fCurrentEntity.ch = tmp;
+                        fBufferSize *= 2;
+                    } else {
+                        System.arraycopy(fCurrentEntity.ch, offset,
+                                fCurrentEntity.ch, 0, length);
+                    }
+                    offset = 0;
+                    if (load(length, false)) {
+                        break;
+                    }
+                }
+            }
+        }
+        int length = fCurrentEntity.position - offset;
+        fCurrentEntity.columnNumber += length;
+
+        // return name
+        String symbol = null;
+        if (length > 0) {
+            symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, offset, length);
+        }
+        return symbol;
+
     }
 
     // Adapted from:
@@ -504,14 +501,14 @@
     /**
      * Scans a range of attribute value data, setting the fields of the
      * XMLString structure, appropriately.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The characters are consumed.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> This method does not guarantee to return
      * the longest run of attribute value data. This method may return
      * before the quote character due to reaching the end of the input
      * buffer or any other reason.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The fields contained in the XMLString
      * structure are not guaranteed to remain valid upon subsequent calls
      * to the entity scanner. Therefore, the caller is responsible for
@@ -521,135 +518,130 @@
      * @param quote   The quote character that signifies the end of the
      *                attribute value data.
      * @param content The content structure to fill.
-     *
      * @return Returns the next character on the input, if known. This
      *         value may be -1 but this does <em>note</em> designate
      *         end of file.
-     *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
      */
     public int scanLiteral(int quote, XMLString content)
-	throws IOException {
+            throws IOException {
 
-	// load more characters, if needed
-	if (fCurrentEntity.position == fCurrentEntity.count) {
-	    load(0, true);
-	} else if (fCurrentEntity.position == fCurrentEntity.count - 1) {
-	    fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];
-	    load(1, false);
-	    fCurrentEntity.position = 0;
-	}
+        // load more characters, if needed
+        if (fCurrentEntity.position == fCurrentEntity.count) {
+            load(0, true);
+        } else if (fCurrentEntity.position == fCurrentEntity.count - 1) {
+            fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];
+            load(1, false);
+            fCurrentEntity.position = 0;
+        }
 
-	// normalize newlines
-	int offset = fCurrentEntity.position;
-	int c = fCurrentEntity.ch[offset];
-	int newlines = 0;
-	boolean external = fCurrentEntity.isExternal();
-	if (c == '\n' || (c == '\r' && external)) {
-	    do {
-		c = fCurrentEntity.ch[fCurrentEntity.position++];
-		if (c == '\r' && external) {
-		    newlines++;
-		    fCurrentEntity.lineNumber++;
-		    fCurrentEntity.columnNumber = 1;
-		    if (fCurrentEntity.position == fCurrentEntity.count) {
-			offset = 0;
-			fCurrentEntity.position = newlines;
-			if (load(newlines, false)) {
-			    break;
-			}
-		    }
-		    if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {
-			fCurrentEntity.position++;
-			offset++;
-		    }
-		    /*** NEWLINE NORMALIZATION ***/
-		    else {
-			newlines++;
-		    }
-		    /***/
-		}
-		else if (c == '\n') {
-		    newlines++;
-		    fCurrentEntity.lineNumber++;
-		    fCurrentEntity.columnNumber = 1;
-		    if (fCurrentEntity.position == fCurrentEntity.count) {
-			offset = 0;
-			fCurrentEntity.position = newlines;
-			if (load(newlines, false)) {
-			    break;
-			}
-		    }
-		    /*** NEWLINE NORMALIZATION ***
-			 if (fCurrentEntity.ch[fCurrentEntity.position] == '\r'
-			 && external) {
-			 fCurrentEntity.position++;
-			 offset++;
-			 }
-			 /***/
-		}
-		else {
-		    fCurrentEntity.position--;
-		    break;
-		}
-	    } while (fCurrentEntity.position < fCurrentEntity.count - 1);
-	    for (int i = offset; i < fCurrentEntity.position; i++) {
-		fCurrentEntity.ch[i] = '\n';
-	    }
-	    int length = fCurrentEntity.position - offset;
-	    if (fCurrentEntity.position == fCurrentEntity.count - 1) {
-		content.setValues(fCurrentEntity.ch, offset, length);
-		return -1;
-	    }
-	}
+        // normalize newlines
+        int offset = fCurrentEntity.position;
+        int c = fCurrentEntity.ch[offset];
+        int newlines = 0;
+        boolean external = fCurrentEntity.isExternal();
+        if (c == '\n' || (c == '\r' && external)) {
+            do {
+                c = fCurrentEntity.ch[fCurrentEntity.position++];
+                if (c == '\r' && external) {
+                    newlines++;
+                    fCurrentEntity.lineNumber++;
+                    fCurrentEntity.columnNumber = 1;
+                    if (fCurrentEntity.position == fCurrentEntity.count) {
+                        offset = 0;
+                        fCurrentEntity.position = newlines;
+                        if (load(newlines, false)) {
+                            break;
+                        }
+                    }
+                    if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {
+                        fCurrentEntity.position++;
+                        offset++;
+                    }
+                    /*** NEWLINE NORMALIZATION ***/
+                    else {
+                        newlines++;
+                    }
+                    /***/
+                } else if (c == '\n') {
+                    newlines++;
+                    fCurrentEntity.lineNumber++;
+                    fCurrentEntity.columnNumber = 1;
+                    if (fCurrentEntity.position == fCurrentEntity.count) {
+                        offset = 0;
+                        fCurrentEntity.position = newlines;
+                        if (load(newlines, false)) {
+                            break;
+                        }
+                    }
+                    /*** NEWLINE NORMALIZATION ***
+                     if (fCurrentEntity.ch[fCurrentEntity.position] == '\r'
+                     && external) {
+                     fCurrentEntity.position++;
+                     offset++;
+                     }
+                     /***/
+                } else {
+                    fCurrentEntity.position--;
+                    break;
+                }
+            } while (fCurrentEntity.position < fCurrentEntity.count - 1);
+            for (int i = offset; i < fCurrentEntity.position; i++) {
+                fCurrentEntity.ch[i] = '\n';
+            }
+            int length = fCurrentEntity.position - offset;
+            if (fCurrentEntity.position == fCurrentEntity.count - 1) {
+                content.setValues(fCurrentEntity.ch, offset, length);
+                return -1;
+            }
+        }
 
-	// scan literal value
-	while (fCurrentEntity.position < fCurrentEntity.count) {
-	    c = fCurrentEntity.ch[fCurrentEntity.position++];
-	    if ((c == quote &&
-		 (!fCurrentEntity.literal || external))
-		|| c == '%' || !XMLChar.isContent(c)) {
-		fCurrentEntity.position--;
-		break;
-	    }
-	}
-	int length = fCurrentEntity.position - offset;
-	fCurrentEntity.columnNumber += length - newlines;
-	content.setValues(fCurrentEntity.ch, offset, length);
+        // scan literal value
+        while (fCurrentEntity.position < fCurrentEntity.count) {
+            c = fCurrentEntity.ch[fCurrentEntity.position++];
+            if ((c == quote &&
+                    (!fCurrentEntity.literal || external))
+                    || c == '%' || !XMLChar.isContent(c)) {
+                fCurrentEntity.position--;
+                break;
+            }
+        }
+        int length = fCurrentEntity.position - offset;
+        fCurrentEntity.columnNumber += length - newlines;
+        content.setValues(fCurrentEntity.ch, offset, length);
 
-	// return next character
-	if (fCurrentEntity.position != fCurrentEntity.count) {
-	    c = fCurrentEntity.ch[fCurrentEntity.position];
-	    // NOTE: We don't want to accidentally signal the
-	    //       end of the literal if we're expanding an
-	    //       entity appearing in the literal. -Ac
-	    if (c == quote && fCurrentEntity.literal) {
-		c = -1;
-	    }
-	}
-	else {
-	    c = -1;
-	}
-	return c;
+        // return next character
+        if (fCurrentEntity.position != fCurrentEntity.count) {
+            c = fCurrentEntity.ch[fCurrentEntity.position];
+            // NOTE: We don't want to accidentally signal the
+            //       end of the literal if we're expanding an
+            //       entity appearing in the literal. -Ac
+            if (c == quote && fCurrentEntity.literal) {
+                c = -1;
+            }
+        } else {
+            c = -1;
+        }
+        return c;
 
     }
 
     /**
      * Scans a range of character data up to the specified delimiter,
      * setting the fields of the XMLString structure, appropriately.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The characters are consumed.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> This assumes that the internal buffer is
      * at least the same size, or bigger, than the length of the delimiter
      * and that the delimiter contains at least one character.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> This method does not guarantee to return
      * the longest run of character data. This method may return before
      * the delimiter due to reaching the end of the input buffer or any
      * other reason.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The fields contained in the XMLString
      * structure are not guaranteed to remain valid upon subsequent calls
      * to the entity scanner. Therefore, the caller is responsible for
@@ -659,143 +651,137 @@
      * @param delimiter The string that signifies the end of the character
      *                  data to be scanned.
      * @param buffer    The data structure to fill.
-     *
      * @return Returns true if there is more data to scan, false otherwise.
-     *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
      */
     public boolean scanData(String delimiter, XMLStringBuffer buffer)
-	throws IOException {
+            throws IOException {
 
-	boolean done = false;
-	int delimLen = delimiter.length();
-	char charAt0 = delimiter.charAt(0);
-	boolean external = fCurrentEntity.isExternal();
-	do {
-    
-	    // load more characters, if needed
-    
-	    if (fCurrentEntity.position == fCurrentEntity.count) {
-		load(0, true);
-	    }
-	    else if (fCurrentEntity.position >= fCurrentEntity.count - delimLen) {
-		System.arraycopy(fCurrentEntity.ch, fCurrentEntity.position,
-				 fCurrentEntity.ch, 0, fCurrentEntity.count - fCurrentEntity.position);
-		load(fCurrentEntity.count - fCurrentEntity.position, false);
-		fCurrentEntity.position = 0;
-	    } 
-	    if (fCurrentEntity.position >= fCurrentEntity.count - delimLen) {
-		// something must be wrong with the input: e.g., file ends an
-		// unterminated comment
-		int length = fCurrentEntity.count - fCurrentEntity.position;
-		buffer.append (fCurrentEntity.ch, fCurrentEntity.position,
-			       length); 
-		fCurrentEntity.columnNumber += fCurrentEntity.count;
-		fCurrentEntity.position = fCurrentEntity.count;
-		load(0,true);
-		return false;
-	    }
-    
-	    // normalize newlines
-	    int offset = fCurrentEntity.position;
-	    int c = fCurrentEntity.ch[offset];
-	    int newlines = 0;
-	    if (c == '\n' || (c == '\r' && external)) {
-		do {
-		    c = fCurrentEntity.ch[fCurrentEntity.position++];
-		    if (c == '\r' && external) {
-			newlines++;
-			fCurrentEntity.lineNumber++;
-			fCurrentEntity.columnNumber = 1;
-			if (fCurrentEntity.position == fCurrentEntity.count) {
-			    offset = 0;
-			    fCurrentEntity.position = newlines;
-			    if (load(newlines, false)) {
-				break;
-			    }
-			}
-			if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {
-			    fCurrentEntity.position++;
-			    offset++;
-			}
-			/*** NEWLINE NORMALIZATION ***/
-			else {
-			    newlines++;
-			}
-		    }
-		    else if (c == '\n') {
-			newlines++;
-			fCurrentEntity.lineNumber++;
-			fCurrentEntity.columnNumber = 1;
-			if (fCurrentEntity.position == fCurrentEntity.count) {
-			    offset = 0;
-			    fCurrentEntity.position = newlines;
-			    fCurrentEntity.count = newlines;
-			    if (load(newlines, false)) {
-				break;
-			    }
-			}
-		    }
-		    else {
-			fCurrentEntity.position--;
-			break;
-		    }
-		} while (fCurrentEntity.position < fCurrentEntity.count - 1);
-		for (int i = offset; i < fCurrentEntity.position; i++) {
-		    fCurrentEntity.ch[i] = '\n';
-		}
-		int length = fCurrentEntity.position - offset;
-		if (fCurrentEntity.position == fCurrentEntity.count - 1) {
-		    buffer.append(fCurrentEntity.ch, offset, length);
-		    return true;
-		}
-	    }
-    
-	    // iterate over buffer looking for delimiter
-	OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {
-	    c = fCurrentEntity.ch[fCurrentEntity.position++];
-	    if (c == charAt0) {
-		// looks like we just hit the delimiter
-		int delimOffset = fCurrentEntity.position - 1;
-		for (int i = 1; i < delimLen; i++) {
-		    if (fCurrentEntity.position == fCurrentEntity.count) {
-			fCurrentEntity.position -= i;
-			break OUTER;
-		    }
-		    c = fCurrentEntity.ch[fCurrentEntity.position++];
-		    if (delimiter.charAt(i) != c) {
-			fCurrentEntity.position--;
-			break;
-		    }
-		}
-		if (fCurrentEntity.position == delimOffset + delimLen) {
-		    done = true;
-		    break;
-		}
-	    }
-	    else if (c == '\n' || (external && c == '\r')) {
-		fCurrentEntity.position--;
-		break;
-	    }
-	    else if (XMLChar.isInvalid(c)) {
-		fCurrentEntity.position--;
-		int length = fCurrentEntity.position - offset;
-		fCurrentEntity.columnNumber += length - newlines;
-		buffer.append(fCurrentEntity.ch, offset, length); 
-		return true;
-	    }
-	}
-	    int length = fCurrentEntity.position - offset;
-	    fCurrentEntity.columnNumber += length - newlines;
-	    if (done) {
-		length -= delimLen;
-	    }
-	    buffer.append (fCurrentEntity.ch, offset, length);
-    
-	    // return true if string was skipped
-	} while (!done);
-	return !done;
+        boolean done = false;
+        int delimLen = delimiter.length();
+        char charAt0 = delimiter.charAt(0);
+        boolean external = fCurrentEntity.isExternal();
+        do {
+
+            // load more characters, if needed
+
+            if (fCurrentEntity.position == fCurrentEntity.count) {
+                load(0, true);
+            } else if (fCurrentEntity.position >= fCurrentEntity.count - delimLen) {
+                System.arraycopy(fCurrentEntity.ch, fCurrentEntity.position,
+                        fCurrentEntity.ch, 0, fCurrentEntity.count - fCurrentEntity.position);
+                load(fCurrentEntity.count - fCurrentEntity.position, false);
+                fCurrentEntity.position = 0;
+            }
+            if (fCurrentEntity.position >= fCurrentEntity.count - delimLen) {
+                // something must be wrong with the input: e.g., file ends an
+                // unterminated comment
+                int length = fCurrentEntity.count - fCurrentEntity.position;
+                buffer.append(fCurrentEntity.ch, fCurrentEntity.position,
+                        length);
+                fCurrentEntity.columnNumber += fCurrentEntity.count;
+                fCurrentEntity.position = fCurrentEntity.count;
+                load(0, true);
+                return false;
+            }
+
+            // normalize newlines
+            int offset = fCurrentEntity.position;
+            int c = fCurrentEntity.ch[offset];
+            int newlines = 0;
+            if (c == '\n' || (c == '\r' && external)) {
+                do {
+                    c = fCurrentEntity.ch[fCurrentEntity.position++];
+                    if (c == '\r' && external) {
+                        newlines++;
+                        fCurrentEntity.lineNumber++;
+                        fCurrentEntity.columnNumber = 1;
+                        if (fCurrentEntity.position == fCurrentEntity.count) {
+                            offset = 0;
+                            fCurrentEntity.position = newlines;
+                            if (load(newlines, false)) {
+                                break;
+                            }
+                        }
+                        if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {
+                            fCurrentEntity.position++;
+                            offset++;
+                        }
+                        /*** NEWLINE NORMALIZATION ***/
+                        else {
+                            newlines++;
+                        }
+                    } else if (c == '\n') {
+                        newlines++;
+                        fCurrentEntity.lineNumber++;
+                        fCurrentEntity.columnNumber = 1;
+                        if (fCurrentEntity.position == fCurrentEntity.count) {
+                            offset = 0;
+                            fCurrentEntity.position = newlines;
+                            fCurrentEntity.count = newlines;
+                            if (load(newlines, false)) {
+                                break;
+                            }
+                        }
+                    } else {
+                        fCurrentEntity.position--;
+                        break;
+                    }
+                } while (fCurrentEntity.position < fCurrentEntity.count - 1);
+                for (int i = offset; i < fCurrentEntity.position; i++) {
+                    fCurrentEntity.ch[i] = '\n';
+                }
+                int length = fCurrentEntity.position - offset;
+                if (fCurrentEntity.position == fCurrentEntity.count - 1) {
+                    buffer.append(fCurrentEntity.ch, offset, length);
+                    return true;
+                }
+            }
+
+            // iterate over buffer looking for delimiter
+            OUTER:
+            while (fCurrentEntity.position < fCurrentEntity.count) {
+                c = fCurrentEntity.ch[fCurrentEntity.position++];
+                if (c == charAt0) {
+                    // looks like we just hit the delimiter
+                    int delimOffset = fCurrentEntity.position - 1;
+                    for (int i = 1; i < delimLen; i++) {
+                        if (fCurrentEntity.position == fCurrentEntity.count) {
+                            fCurrentEntity.position -= i;
+                            break OUTER;
+                        }
+                        c = fCurrentEntity.ch[fCurrentEntity.position++];
+                        if (delimiter.charAt(i) != c) {
+                            fCurrentEntity.position--;
+                            break;
+                        }
+                    }
+                    if (fCurrentEntity.position == delimOffset + delimLen) {
+                        done = true;
+                        break;
+                    }
+                } else if (c == '\n' || (external && c == '\r')) {
+                    fCurrentEntity.position--;
+                    break;
+                } else if (XMLChar.isInvalid(c)) {
+                    fCurrentEntity.position--;
+                    int length = fCurrentEntity.position - offset;
+                    fCurrentEntity.columnNumber += length - newlines;
+                    buffer.append(fCurrentEntity.ch, offset, length);
+                    return true;
+                }
+            }
+            int length = fCurrentEntity.position - offset;
+            fCurrentEntity.columnNumber += length - newlines;
+            if (done) {
+                length -= delimLen;
+            }
+            buffer.append(fCurrentEntity.ch, offset, length);
+
+            // return true if string was skipped
+        } while (!done);
+        return !done;
 
     }
 
@@ -803,53 +789,50 @@
     // org.apache.xerces.impl.XMLEntityManager.EntityScanner.skipChar
     /**
      * Skips a character appearing immediately on the input.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The character is consumed only if it matches
      * the specified character.
      *
      * @param c The character to skip.
-     *
      * @return Returns true if the character was skipped.
-     *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
      */
     public boolean skipChar(int c) throws IOException {
 
-	// load more characters, if needed
-	if (fCurrentEntity.position == fCurrentEntity.count) {
-	    load(0, true);
-	}
+        // load more characters, if needed
+        if (fCurrentEntity.position == fCurrentEntity.count) {
+            load(0, true);
+        }
 
-	// skip character
-	int cc = fCurrentEntity.ch[fCurrentEntity.position];
-	if (cc == c) {
-	    fCurrentEntity.position++;
-	    if (c == '\n') {
-		fCurrentEntity.lineNumber++;
-		fCurrentEntity.columnNumber = 1;
-	    }
-	    else {
-		fCurrentEntity.columnNumber++;
-	    }
-	    return true;
-	} else if (c == '\n' && cc == '\r' && fCurrentEntity.isExternal()) {
-	    // handle newlines
-	    if (fCurrentEntity.position == fCurrentEntity.count) {
-		fCurrentEntity.ch[0] = (char)cc;
-		load(1, false);
-	    }
-	    fCurrentEntity.position++;
-	    if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {
-		fCurrentEntity.position++;
-	    }
-	    fCurrentEntity.lineNumber++;
-	    fCurrentEntity.columnNumber = 1;
-	    return true;
-	}
+        // skip character
+        int cc = fCurrentEntity.ch[fCurrentEntity.position];
+        if (cc == c) {
+            fCurrentEntity.position++;
+            if (c == '\n') {
+                fCurrentEntity.lineNumber++;
+                fCurrentEntity.columnNumber = 1;
+            } else {
+                fCurrentEntity.columnNumber++;
+            }
+            return true;
+        } else if (c == '\n' && cc == '\r' && fCurrentEntity.isExternal()) {
+            // handle newlines
+            if (fCurrentEntity.position == fCurrentEntity.count) {
+                fCurrentEntity.ch[0] = (char) cc;
+                load(1, false);
+            }
+            fCurrentEntity.position++;
+            if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {
+                fCurrentEntity.position++;
+            }
+            fCurrentEntity.lineNumber++;
+            fCurrentEntity.columnNumber = 1;
+            return true;
+        }
 
-	// character was not skipped
-	return false;
+        // character was not skipped
+        return false;
 
     }
 
@@ -857,116 +840,111 @@
     // org.apache.xerces.impl.XMLEntityManager.EntityScanner.skipSpaces
     /**
      * Skips space characters appearing immediately on the input.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The characters are consumed only if they are
      * space characters.
      *
      * @return Returns true if at least one space character was skipped.
-     *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
-     *
      * @see XMLChar#isSpace
      */
     public boolean skipSpaces() throws IOException {
 
-	// load more characters, if needed
-	if (fCurrentEntity.position == fCurrentEntity.count) {
-	    load(0, true);
-	}
+        // load more characters, if needed
+        if (fCurrentEntity.position == fCurrentEntity.count) {
+            load(0, true);
+        }
 
-	// skip spaces
-	int c = fCurrentEntity.ch[fCurrentEntity.position];
-	if (XMLChar.isSpace(c)) {
-	    boolean external = fCurrentEntity.isExternal();
-	    do {
-		boolean entityChanged = false;
-		// handle newlines
-		if (c == '\n' || (external && c == '\r')) {
-		    fCurrentEntity.lineNumber++;
-		    fCurrentEntity.columnNumber = 1;
-		    if (fCurrentEntity.position == fCurrentEntity.count - 1) {
-			fCurrentEntity.ch[0] = (char)c;
-			entityChanged = load(1, true);
-			if (!entityChanged)
-                                // the load change the position to be 1,
-                                // need to restore it when entity not changed
-			    fCurrentEntity.position = 0;
-		    }
-		    if (c == '\r' && external) {
-			// REVISIT: Does this need to be updated to fix the
-			//          #x0D ^#x0A newline normalization problem? -Ac
-			if (fCurrentEntity.ch[++fCurrentEntity.position] != '\n') {
-			    fCurrentEntity.position--;
-			}
-		    }
-		    /*** NEWLINE NORMALIZATION ***
-			 else {
-			 if (fCurrentEntity.ch[fCurrentEntity.position + 1] == '\r'
-			 && external) {
-			 fCurrentEntity.position++;
-			 }
-			 }
-			 /***/
-		}
-		else {
-		    fCurrentEntity.columnNumber++;
-		}
-		// load more characters, if needed
-		if (!entityChanged)
-		    fCurrentEntity.position++;
-		if (fCurrentEntity.position == fCurrentEntity.count) {
-		    load(0, true);
-		}
-	    } while (XMLChar.isSpace(c = fCurrentEntity.ch[fCurrentEntity.position]));
-	    return true;
-	}
+        // skip spaces
+        int c = fCurrentEntity.ch[fCurrentEntity.position];
+        if (XMLChar.isSpace(c)) {
+            boolean external = fCurrentEntity.isExternal();
+            do {
+                boolean entityChanged = false;
+                // handle newlines
+                if (c == '\n' || (external && c == '\r')) {
+                    fCurrentEntity.lineNumber++;
+                    fCurrentEntity.columnNumber = 1;
+                    if (fCurrentEntity.position == fCurrentEntity.count - 1) {
+                        fCurrentEntity.ch[0] = (char) c;
+                        entityChanged = load(1, true);
+                        if (!entityChanged)
+                            // the load change the position to be 1,
+                            // need to restore it when entity not changed
+                            fCurrentEntity.position = 0;
+                    }
+                    if (c == '\r' && external) {
+                        // REVISIT: Does this need to be updated to fix the
+                        //          #x0D ^#x0A newline normalization problem? -Ac
+                        if (fCurrentEntity.ch[++fCurrentEntity.position] != '\n') {
+                            fCurrentEntity.position--;
+                        }
+                    }
+                    /*** NEWLINE NORMALIZATION ***
+                     else {
+                     if (fCurrentEntity.ch[fCurrentEntity.position + 1] == '\r'
+                     && external) {
+                     fCurrentEntity.position++;
+                     }
+                     }
+                     /***/
+                } else {
+                    fCurrentEntity.columnNumber++;
+                }
+                // load more characters, if needed
+                if (!entityChanged)
+                    fCurrentEntity.position++;
+                if (fCurrentEntity.position == fCurrentEntity.count) {
+                    load(0, true);
+                }
+            } while (XMLChar.isSpace(c = fCurrentEntity.ch[fCurrentEntity.position]));
+            return true;
+        }
 
-	// no spaces were found
-	return false;
+        // no spaces were found
+        return false;
 
     }
 
     /**
      * Skips the specified string appearing immediately on the input.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> The characters are consumed only if they are
      * space characters.
      *
      * @param s The string to skip.
-     *
      * @return Returns true if the string was skipped.
-     *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
      */
     public boolean skipString(String s) throws IOException {
 
-	// load more characters, if needed
-	if (fCurrentEntity.position == fCurrentEntity.count) {
-	    load(0, true);
-	}
+        // load more characters, if needed
+        if (fCurrentEntity.position == fCurrentEntity.count) {
+            load(0, true);
+        }
 
-	// skip string
-	final int length = s.length();
-	for (int i = 0; i < length; i++) {
-	    char c = fCurrentEntity.ch[fCurrentEntity.position++];
-	    if (c != s.charAt(i)) {
-		fCurrentEntity.position -= i + 1;
-		return false;
-	    }
-	    if (i < length - 1 && fCurrentEntity.position == fCurrentEntity.count) {
-		System.arraycopy(fCurrentEntity.ch, fCurrentEntity.count - i - 1, fCurrentEntity.ch, 0, i + 1);
-		// REVISIT: Can a string to be skipped cross an
-		//          entity boundary? -Ac
-		if (load(i + 1, false)) {
-		    fCurrentEntity.position -= i + 1;
-		    return false;
-		}
-	    }
-	}
-	fCurrentEntity.columnNumber += length;
-	return true;
+        // skip string
+        final int length = s.length();
+        for (int i = 0; i < length; i++) {
+            char c = fCurrentEntity.ch[fCurrentEntity.position++];
+            if (c != s.charAt(i)) {
+                fCurrentEntity.position -= i + 1;
+                return false;
+            }
+            if (i < length - 1 && fCurrentEntity.position == fCurrentEntity.count) {
+                System.arraycopy(fCurrentEntity.ch, fCurrentEntity.count - i - 1, fCurrentEntity.ch, 0, i + 1);
+                // REVISIT: Can a string to be skipped cross an
+                //          entity boundary? -Ac
+                if (load(i + 1, false)) {
+                    fCurrentEntity.position -= i + 1;
+                    return false;
+                }
+            }
+        }
+        fCurrentEntity.columnNumber += length;
+        return true;
 
     }
 
@@ -982,47 +960,46 @@
      *                     the current entity in place and the entity
      *                     boundary will be signaled by the return
      *                     value.
-     *
      * @returns Returns true if the entity changed as a result of this
-     *          load operation.
+     * load operation.
      */
     final boolean load(int offset, boolean changeEntity)
-	throws IOException {
+            throws IOException {
 
-	// read characters
-	int length = fCurrentEntity.mayReadChunks?
-	    (fCurrentEntity.ch.length - offset):
-	    (DEFAULT_XMLDECL_BUFFER_SIZE);
-	int count = fCurrentEntity.reader.read(fCurrentEntity.ch, offset,
-					       length);
+        // read characters
+        int length = fCurrentEntity.mayReadChunks ?
+                (fCurrentEntity.ch.length - offset) :
+                (DEFAULT_XMLDECL_BUFFER_SIZE);
+        int count = fCurrentEntity.reader.read(fCurrentEntity.ch, offset,
+                length);
 
-	// reset count and position
-	boolean entityChanged = false;
-	if (count != -1) {
-	    if (count != 0) {
-		fCurrentEntity.count = count + offset;
-		fCurrentEntity.position = offset;
-	    }
-	}
+        // reset count and position
+        boolean entityChanged = false;
+        if (count != -1) {
+            if (count != 0) {
+                fCurrentEntity.count = count + offset;
+                fCurrentEntity.position = offset;
+            }
+        }
 
-	// end of this entity
-	else {
-	    fCurrentEntity.count = offset;
-	    fCurrentEntity.position = offset;
-	    entityChanged = true;
-	    if (changeEntity) {
-		endEntity();
-		if (fCurrentEntity == null) {
-		    throw new EOFException();
-		}
-		// handle the trailing edges
-		if (fCurrentEntity.position == fCurrentEntity.count) {
-		    load(0, false);
-		}
-	    }
-	}
+        // end of this entity
+        else {
+            fCurrentEntity.count = offset;
+            fCurrentEntity.position = offset;
+            entityChanged = true;
+            if (changeEntity) {
+                endEntity();
+                if (fCurrentEntity == null) {
+                    throw new EOFException();
+                }
+                // handle the trailing edges
+                if (fCurrentEntity.position == fCurrentEntity.count) {
+                    load(0, false);
+                }
+            }
+        }
 
-	return entityChanged;
+        return entityChanged;
 
     }
 
@@ -1037,7 +1014,7 @@
      * encoding of a document, we can neither backtrack to read the
      * whole doc again nor start reading where we are with a new
      * reader.
-     *
+     * <p/>
      * This class allows rewinding an inputStream by allowing a mark
      * to be set, and the stream reset to that position.  <strong>The
      * class assumes that it needs to read one character per
@@ -1094,7 +1071,7 @@
                 fEndOffset = fOffset;
                 return -1;
             }
-            fData[fLength++] = (byte)b;
+            fData[fLength++] = (byte) b;
             fOffset++;
             return b & 0xff;
         }
@@ -1114,15 +1091,14 @@
                     fEndOffset = fOffset;
                     return -1;
                 }
-                b[off] = (byte)returnedVal;
+                b[off] = (byte) returnedVal;
                 return 1;
             }
             if (len < bytesLeft) {
                 if (len <= 0) {
                     return 0;
                 }
-            }
-            else {
+            } else {
                 len = bytesLeft;
             }
             if (b != null) {
@@ -1133,8 +1109,7 @@
         }
 
         public long skip(long n)
-            throws IOException
-        {
+                throws IOException {
             int bytesLeft;
             if (n <= 0) {
                 return 0;
@@ -1155,14 +1130,14 @@
                 return bytesLeft;
             }
             n -= bytesLeft;
-	    /*
-	     * In a manner of speaking, when this class isn't permitting more
-	     * than one byte at a time to be read, it is "blocking".  The
-	     * available() method should indicate how much can be read without
-	     * blocking, so while we're in this mode, it should only indicate
-	     * that bytes in its buffer are available; otherwise, the result of
-	     * available() on the underlying InputStream is appropriate.
-	     */
+            /*
+            * In a manner of speaking, when this class isn't permitting more
+            * than one byte at a time to be read, it is "blocking".  The
+            * available() method should indicate how much can be read without
+            * blocking, so while we're in this mode, it should only indicate
+            * that bytes in its buffer are available; otherwise, the result of
+            * available() on the underlying InputStream is appropriate.
+            */
             return fInputStream.skip(n) + bytesLeft;
         }
 
@@ -1173,7 +1148,7 @@
                     return -1;
                 }
                 return fCurrentEntity.mayReadChunks ? fInputStream.available()
-		    : 0;
+                        : 0;
             }
             return bytesLeft;
         }
@@ -1202,34 +1177,34 @@
     // org.apache.xerces.impl.XMLDocumentScannerImpl.dispatch
     private void scanXMLDecl() throws IOException, JasperException {
 
-	if (skipString("<?xml")) {
-	    fMarkupDepth++;
-	    // NOTE: special case where document starts with a PI
-	    //       whose name starts with "xml" (e.g. "xmlfoo")
-	    if (XMLChar.isName(peekChar())) {
-		fStringBuffer.clear();
-		fStringBuffer.append("xml");
-		while (XMLChar.isName(peekChar())) {
-		    fStringBuffer.append((char)scanChar());
-		}
-		String target = fSymbolTable.addSymbol(fStringBuffer.ch,
-						       fStringBuffer.offset,
-						       fStringBuffer.length);
-		scanPIData(target, fString);
-	    }
+        if (skipString("<?xml")) {
+            fMarkupDepth++;
+            // NOTE: special case where document starts with a PI
+            //       whose name starts with "xml" (e.g. "xmlfoo")
+            if (XMLChar.isName(peekChar())) {
+                fStringBuffer.clear();
+                fStringBuffer.append("xml");
+                while (XMLChar.isName(peekChar())) {
+                    fStringBuffer.append((char) scanChar());
+                }
+                String target = fSymbolTable.addSymbol(fStringBuffer.ch,
+                        fStringBuffer.offset,
+                        fStringBuffer.length);
+                scanPIData(target, fString);
+            }
 
-	    // standard XML declaration
-	    else {
-		scanXMLDeclOrTextDecl(false);
-	    }
-	}
+            // standard XML declaration
+            else {
+                scanXMLDeclOrTextDecl(false);
+            }
+        }
     }
-    
+
     // Adapted from:
     // org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanXMLDeclOrTextDecl
     /**
      * Scans an XML or text declaration.
-     * <p>
+     * <p/>
      * <pre>
      * [23] XMLDecl ::= '&lt;?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
      * [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")
@@ -1237,7 +1212,7 @@
      * [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
      * [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'")
      *                 | ('"' ('yes' | 'no') '"'))
-     *
+     * <p/>
      * [77] TextDecl ::= '&lt;?xml' VersionInfo? EncodingDecl S? '?>'
      * </pre>
      *
@@ -1245,8 +1220,8 @@
      *                         be scanned instead of an XML
      *                         declaration.
      */
-    private void scanXMLDeclOrTextDecl(boolean scanningTextDecl) 
-        throws IOException, JasperException {
+    private void scanXMLDeclOrTextDecl(boolean scanningTextDecl)
+            throws IOException, JasperException {
 
         // scan decl
         scanXMLDeclOrTextDecl(scanningTextDecl, fStrings);
@@ -1258,7 +1233,7 @@
         // set encoding on reader
         if (encodingPseudoAttr != null) {
             isEncodingSetInProlog = true;
-	    encoding = encodingPseudoAttr;
+            encoding = encodingPseudoAttr;
         }
     }
 
@@ -1266,7 +1241,7 @@
     // org.apache.xerces.impl.XMLScanner.scanXMLDeclOrTextDecl
     /**
      * Scans an XML or text declaration.
-     * <p>
+     * <p/>
      * <pre>
      * [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
      * [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")
@@ -1274,23 +1249,23 @@
      * [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
      * [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'")
      *                 | ('"' ('yes' | 'no') '"'))
-     *
+     * <p/>
      * [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
      * </pre>
      *
-     * @param scanningTextDecl True if a text declaration is to
-     *                         be scanned instead of an XML
-     *                         declaration.
+     * @param scanningTextDecl      True if a text declaration is to
+     *                              be scanned instead of an XML
+     *                              declaration.
      * @param pseudoAttributeValues An array of size 3 to return the version,
-     *                         encoding and standalone pseudo attribute values
-     *                         (in that order).
-     *
-     * <strong>Note:</strong> This method uses fString, anything in it
-     * at the time of calling is lost.
+     *                              encoding and standalone pseudo attribute values
+     *                              (in that order).
+     *                              <p/>
+     *                              <strong>Note:</strong> This method uses fString, anything in it
+     *                              at the time of calling is lost.
      */
     private void scanXMLDeclOrTextDecl(boolean scanningTextDecl,
-				       String[] pseudoAttributeValues) 
-                throws IOException, JasperException {
+                                       String[] pseudoAttributeValues)
+            throws IOException, JasperException {
 
         // pseudo-attribute values
         String version = null;
@@ -1314,18 +1289,18 @@
                     if (name == fVersionSymbol) {
                         if (!sawSpace) {
                             reportFatalError(scanningTextDecl
-                                       ? "jsp.error.xml.spaceRequiredBeforeVersionInTextDecl"
-                                       : "jsp.error.xml.spaceRequiredBeforeVersionInXMLDecl",
-                                             null);
+                                    ? "jsp.error.xml.spaceRequiredBeforeVersionInTextDecl"
+                                    : "jsp.error.xml.spaceRequiredBeforeVersionInXMLDecl",
+                                    null);
                         }
                         version = fString.toString();
                         state = STATE_ENCODING;
                         if (!version.equals("1.0")) {
                             // REVISIT: XML REC says we should throw an error
-			    // in such cases.
+                            // in such cases.
                             // some may object the throwing of fatalError.
                             err.jspError("jsp.error.xml.versionNotSupported",
-					 version);
+                                    version);
                         }
                     } else if (name == fEncodingSymbol) {
                         if (!scanningTextDecl) {
@@ -1333,17 +1308,16 @@
                         }
                         if (!sawSpace) {
                             reportFatalError(scanningTextDecl
-                                      ? "jsp.error.xml.spaceRequiredBeforeEncodingInTextDecl"
-                                      : "jsp.error.xml.spaceRequiredBeforeEncodingInXMLDecl",
-                                             null);
+                                    ? "jsp.error.xml.spaceRequiredBeforeEncodingInTextDecl"
+                                    : "jsp.error.xml.spaceRequiredBeforeEncodingInXMLDecl",
+                                    null);
                         }
                         encoding = fString.toString();
                         state = scanningTextDecl ? STATE_DONE : STATE_STANDALONE;
                     } else {
                         if (scanningTextDecl) {
                             err.jspError("jsp.error.xml.encodingDeclRequired");
-                        }
-                        else {
+                        } else {
                             err.jspError("jsp.error.xml.versionInfoRequired");
                         }
                     }
@@ -1353,9 +1327,9 @@
                     if (name == fEncodingSymbol) {
                         if (!sawSpace) {
                             reportFatalError(scanningTextDecl
-                                      ? "jsp.error.xml.spaceRequiredBeforeEncodingInTextDecl"
-                                      : "jsp.error.xml.spaceRequiredBeforeEncodingInXMLDecl",
-                                             null);
+                                    ? "jsp.error.xml.spaceRequiredBeforeEncodingInTextDecl"
+                                    : "jsp.error.xml.spaceRequiredBeforeEncodingInXMLDecl",
+                                    null);
                         }
                         encoding = fString.toString();
                         state = scanningTextDecl ? STATE_DONE : STATE_STANDALONE;
@@ -1386,7 +1360,7 @@
                             err.jspError("jsp.error.xml.sdDeclInvalid");
                         }
                     } else {
-			err.jspError("jsp.error.xml.encodingDeclRequired");
+                        err.jspError("jsp.error.xml.encodingDeclRequired");
                     }
                     break;
                 }
@@ -1400,9 +1374,9 @@
         if (scanningTextDecl && state != STATE_DONE) {
             err.jspError("jsp.error.xml.morePseudoAttributes");
         }
-        
+
         // If there is no data in the xml or text decl then we fail to report
-	// error for version or encoding info above.
+        // error for version or encoding info above.
         if (scanningTextDecl) {
             if (!dataFoundForTarget && encoding == null) {
                 err.jspError("jsp.error.xml.encodingDeclRequired");
@@ -1421,7 +1395,7 @@
             err.jspError("jsp.error.xml.xmlDeclUnterminated");
 
         }
-        
+
         // fill in return array
         pseudoAttributeValues[0] = version;
         pseudoAttributeValues[1] = encoding;
@@ -1434,20 +1408,19 @@
      * Scans a pseudo attribute.
      *
      * @param scanningTextDecl True if scanning this pseudo-attribute for a
-     *                         TextDecl; false if scanning XMLDecl. This 
+     *                         TextDecl; false if scanning XMLDecl. This
      *                         flag is needed to report the correct type of
      *                         error.
-     * @param value            The string to fill in with the attribute 
+     * @param value            The string to fill in with the attribute
      *                         value.
-     *
      * @return The name of the attribute
-     *
-     * <strong>Note:</strong> This method uses fStringBuffer2, anything in it
-     * at the time of calling is lost.
+     *         <p/>
+     *         <strong>Note:</strong> This method uses fStringBuffer2, anything in it
+     *         at the time of calling is lost.
      */
-    public String scanPseudoAttribute(boolean scanningTextDecl, 
-                                      XMLString value) 
-                throws IOException, JasperException {
+    public String scanPseudoAttribute(boolean scanningTextDecl,
+                                      XMLString value)
+            throws IOException, JasperException {
 
         String name = scanName();
         if (name == null) {
@@ -1456,17 +1429,17 @@
         skipSpaces();
         if (!skipChar('=')) {
             reportFatalError(scanningTextDecl ?
-			     "jsp.error.xml.eqRequiredInTextDecl"
-                             : "jsp.error.xml.eqRequiredInXMLDecl",
-			     name);
+                    "jsp.error.xml.eqRequiredInTextDecl"
+                    : "jsp.error.xml.eqRequiredInXMLDecl",
+                    name);
         }
         skipSpaces();
         int quote = peekChar();
         if (quote != '\'' && quote != '"') {
             reportFatalError(scanningTextDecl ?
-			     "jsp.error.xml.quoteRequiredInTextDecl"
-                             : "jsp.error.xml.quoteRequiredInXMLDecl" ,
-			     name);
+                    "jsp.error.xml.quoteRequiredInTextDecl"
+                    : "jsp.error.xml.quoteRequiredInXMLDecl",
+                    name);
         }
         scanChar();
         int c = scanLiteral(quote, value);
@@ -1476,15 +1449,13 @@
                 fStringBuffer2.append(value);
                 if (c != -1) {
                     if (c == '&' || c == '%' || c == '<' || c == ']') {
-                        fStringBuffer2.append((char)scanChar());
-                    }
-                    else if (XMLChar.isHighSurrogate(c)) {
+                        fStringBuffer2.append((char) scanChar());
+                    } else if (XMLChar.isHighSurrogate(c)) {
                         scanSurrogates(fStringBuffer2);
-                    }
-                    else if (XMLChar.isInvalid(c)) {
+                    } else if (XMLChar.isInvalid(c)) {
                         String key = scanningTextDecl
-                            ? "jsp.error.xml.invalidCharInTextDecl"
-			    : "jsp.error.xml.invalidCharInXMLDecl";
+                                ? "jsp.error.xml.invalidCharInTextDecl"
+                                : "jsp.error.xml.invalidCharInXMLDecl";
                         reportFatalError(key, Integer.toString(c, 16));
                         scanChar();
                     }
@@ -1496,31 +1467,31 @@
         }
         if (!skipChar(quote)) {
             reportFatalError(scanningTextDecl ?
-			     "jsp.error.xml.closeQuoteMissingInTextDecl"
-                             : "jsp.error.xml.closeQuoteMissingInXMLDecl",
-			     name);
+                    "jsp.error.xml.closeQuoteMissingInTextDecl"
+                    : "jsp.error.xml.closeQuoteMissingInXMLDecl",
+                    name);
         }
 
         // return
         return name;
 
     }
-    
+
     // Adapted from:
     // org.apache.xerces.impl.XMLScanner.scanPIData
     /**
      * Scans a processing data. This is needed to handle the situation
-     * where a document starts with a processing instruction whose 
+     * where a document starts with a processing instruction whose
      * target name <em>starts with</em> "xml". (e.g. xmlfoo)
-     *
+     * <p/>
      * <strong>Note:</strong> This method uses fStringBuffer, anything in it
      * at the time of calling is lost.
      *
      * @param target The PI target
-     * @param data The string to fill in with the data
+     * @param data   The string to fill in with the data
      */
-    private void scanPIData(String target, XMLString data) 
-        throws IOException, JasperException {
+    private void scanPIData(String target, XMLString data)
+            throws IOException, JasperException {
 
         // check target
         if (target.length() == 3) {
@@ -1538,8 +1509,7 @@
                 // we found the end, there is no data
                 data.clear();
                 return;
-            }
-            else {
+            } else {
                 // if there is data there should be some space
                 err.jspError("jsp.error.xml.spaceRequiredInPI");
             }
@@ -1555,7 +1525,7 @@
                         scanSurrogates(fStringBuffer);
                     } else if (XMLChar.isInvalid(c)) {
                         err.jspError("jsp.error.xml.invalidCharInPI",
-				     Integer.toHexString(c));
+                                Integer.toHexString(c));
                         scanChar();
                     }
                 }
@@ -1569,7 +1539,7 @@
     // org.apache.xerces.impl.XMLScanner.scanSurrogates
     /**
      * Scans surrogates and append them to the specified buffer.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> This assumes the current char has already been
      * identified as a high surrogate.
      *
@@ -1577,30 +1547,30 @@
      * @returns True if it succeeded.
      */
     private boolean scanSurrogates(XMLStringBuffer buf)
-        throws IOException, JasperException {
+            throws IOException, JasperException {
 
         int high = scanChar();
         int low = peekChar();
         if (!XMLChar.isLowSurrogate(low)) {
             err.jspError("jsp.error.xml.invalidCharInContent",
-			 Integer.toString(high, 16));
+                    Integer.toString(high, 16));
             return false;
         }
         scanChar();
 
         // convert surrogates to supplemental character
-        int c = XMLChar.supplemental((char)high, (char)low);
+        int c = XMLChar.supplemental((char) high, (char) low);
 
         // supplemental character must be a valid XML character
         if (!XMLChar.isValid(c)) {
             err.jspError("jsp.error.xml.invalidCharInContent",
-			 Integer.toString(c, 16)); 
+                    Integer.toString(c, 16));
             return false;
         }
 
         // fill in the buffer
-        buf.append((char)high);
-        buf.append((char)low);
+        buf.append((char) high);
+        buf.append((char) low);
 
         return true;
 
@@ -1612,7 +1582,7 @@
      * Convenience function used in all XML scanners.
      */
     private void reportFatalError(String msgId, String arg)
-                throws JasperException {
+            throws JasperException {
         err.jspError(msgId, arg);
     }
 
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLString.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLString.java
index 58a0ab3..1e8220e 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLString.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLString.java
@@ -29,16 +29,16 @@
  * This class is used as a structure to pass text contained in the underlying
  * character buffer of the scanner. The offset and length fields allow the
  * buffer to be re-used without creating new character arrays.
- * <p>
+ * <p/>
  * <strong>Note:</strong> Methods that are passed an XMLString structure
  * should consider the contents read-only and not make any modifications
  * to the contents of the buffer. The method receiving this structure
  * should also not modify the offset and length if this structure (or
  * the values of this structure) are passed to another method.
- * <p>
+ * <p/>
  * <strong>Note:</strong> Methods that are passed an XMLString structure
  * are required to copy the information out of the buffer if it is to be
- * saved for use beyond the scope of the method. The contents of the 
+ * saved for use beyond the scope of the method. The contents of the
  * structure are volatile and the contents of the character buffer cannot
  * be assured once the method that is passed this structure returns.
  * Therefore, methods passed this structure should not save any reference
@@ -46,7 +46,6 @@
  *
  * @author Eric Ye, IBM
  * @author Andy Clark, IBM
- *
  * @version $Id: XMLString.java 466606 2006-10-21 23:07:12Z markt $
  */
 public class XMLString {
@@ -55,27 +54,35 @@
     // Data
     //
 
-    /** The character array. */
+    /**
+     * The character array.
+     */
     public char[] ch;
 
-    /** The offset into the character array. */
+    /**
+     * The offset into the character array.
+     */
     public int offset;
 
-    /** The length of characters from the offset. */
+    /**
+     * The length of characters from the offset.
+     */
     public int length;
 
     //
     // Constructors
     //
 
-    /** Default constructor. */
+    /**
+     * Default constructor.
+     */
     public XMLString() {
     } // <init>()
 
     /**
      * Constructs an XMLString structure preset with the specified
      * values.
-     * 
+     *
      * @param ch     The character array.
      * @param offset The offset into the character array.
      * @param length The length of characters from the offset.
@@ -87,7 +94,7 @@
     /**
      * Constructs an XMLString structure with copies of the values in
      * the given structure.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> This does not copy the character array;
      * only the reference to the array is copied.
      *
@@ -104,7 +111,7 @@
     /**
      * Initializes the contents of the XMLString structure with the
      * specified values.
-     * 
+     *
      * @param ch     The character array.
      * @param offset The offset into the character array.
      * @param length The length of characters from the offset.
@@ -118,17 +125,19 @@
     /**
      * Initializes the contents of the XMLString structure with copies
      * of the given string structure.
-     * <p>
+     * <p/>
      * <strong>Note:</strong> This does not copy the character array;
      * only the reference to the array is copied.
-     * 
+     *
      * @param s
      */
     public void setValues(XMLString s) {
         setValues(s.ch, s.offset, s.length);
     } // setValues(XMLString)
 
-    /** Resets all of the values to their defaults. */
+    /**
+     * Resets all of the values to their defaults.
+     */
     public void clear() {
         this.ch = null;
         this.offset = 0;
@@ -138,7 +147,7 @@
     /**
      * Returns true if the contents of this XMLString structure and
      * the specified array are equal.
-     * 
+     *
      * @param ch     The character array.
      * @param offset The offset into the character array.
      * @param length The length of characters from the offset.
@@ -151,8 +160,8 @@
             return false;
         }
 
-        for (int i=0; i<length; i++) {
-            if (this.ch[this.offset+i] != ch[offset+i] ) {
+        for (int i = 0; i < length; i++) {
+            if (this.ch[this.offset + i] != ch[offset + i]) {
                 return false;
             }
         }
@@ -162,22 +171,22 @@
     /**
      * Returns true if the contents of this XMLString structure and
      * the specified string are equal.
-     * 
+     *
      * @param s The string to compare.
      */
     public boolean equals(String s) {
         if (s == null) {
             return false;
         }
-        if ( length != s.length() ) {
+        if (length != s.length()) {
             return false;
         }
 
         // is this faster than call s.toCharArray first and compare the 
         // two arrays directly, which will possibly involve creating a
         // new char array object.
-        for (int i=0; i<length; i++) {
-            if (ch[offset+i] != s.charAt(i)) {
+        for (int i = 0; i < length; i++) {
+            if (ch[offset + i] != s.charAt(i)) {
                 return false;
             }
         }
@@ -189,7 +198,9 @@
     // Object methods
     //
 
-    /** Returns a string representation of this object. */
+    /**
+     * Returns a string representation of this object.
+     */
     public String toString() {
         return length > 0 ? new String(ch, offset, length) : "";
     } // toString():String
diff --git a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLStringBuffer.java b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLStringBuffer.java
index 14a471e..d97dbde 100644
--- a/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLStringBuffer.java
+++ b/struts2-jsp-plugin/src/main/java/org/apache/struts2/jasper/xmlparser/XMLStringBuffer.java
@@ -32,28 +32,29 @@
  * expecting an XMLString object. This is a safe operation because
  * it is assumed that any callee will <strong>not</strong> modify
  * the contents of the XMLString structure.
- * <p> 
+ * <p/>
  * The contents of the string are managed by the string buffer. As
  * characters are appended, the string buffer will grow as needed.
- * <p>
- * <strong>Note:</strong> Never set the <code>ch</code>, 
+ * <p/>
+ * <strong>Note:</strong> Never set the <code>ch</code>,
  * <code>offset</code>, and <code>length</code> fields directly.
  * These fields are managed by the string buffer. In order to reset
  * the buffer, call <code>clear()</code>.
- * 
+ *
  * @author Andy Clark, IBM
  * @author Eric Ye, IBM
- *
  * @version $Id: XMLStringBuffer.java 466606 2006-10-21 23:07:12Z markt $
  */
 public class XMLStringBuffer
-    extends XMLString {
+        extends XMLString {
 
     //
     // Constants
     //
 
-    /** Default buffer size (32). */
+    /**
+     * Default buffer size (32).
+     */
     public static final int DEFAULT_SIZE = 32;
 
     //
@@ -61,40 +62,46 @@
     //
 
     /**
-     * 
+     *
      */
     public XMLStringBuffer() {
         this(DEFAULT_SIZE);
     } // <init>()
 
     /**
-     * 
-     * 
-     * @param size 
+     * @param size
      */
     public XMLStringBuffer(int size) {
         ch = new char[size];
     } // <init>(int)
 
-    /** Constructs a string buffer from a char. */
+    /**
+     * Constructs a string buffer from a char.
+     */
     public XMLStringBuffer(char c) {
         this(1);
         append(c);
     } // <init>(char)
 
-    /** Constructs a string buffer from a String. */
+    /**
+     * Constructs a string buffer from a String.
+     */
     public XMLStringBuffer(String s) {
         this(s.length());
         append(s);
     } // <init>(String)
 
-    /** Constructs a string buffer from the specified character array. */
+    /**
+     * Constructs a string buffer from the specified character array.
+     */
     public XMLStringBuffer(char[] ch, int offset, int length) {
         this(length);
         append(ch, offset, length);
     } // <init>(char[],int,int)
 
-    /** Constructs a string buffer from the specified XMLString. */
+    /**
+     * Constructs a string buffer from the specified XMLString.
+     */
     public XMLStringBuffer(XMLString s) {
         this(s.length);
         append(s);
@@ -104,7 +111,9 @@
     // Public methods
     //
 
-    /** Clears the string buffer. */
+    /**
+     * Clears the string buffer.
+     */
     public void clear() {
         offset = 0;
         length = 0;
@@ -112,17 +121,17 @@
 
     /**
      * append
-     * 
-     * @param c 
+     *
+     * @param c
      */
     public void append(char c) {
         if (this.length + 1 > this.ch.length) {
-                    int newLength = this.ch.length*2;
-                    if (newLength < this.ch.length + DEFAULT_SIZE)
-                        newLength = this.ch.length + DEFAULT_SIZE;
-                    char[] newch = new char[newLength];
-                    System.arraycopy(this.ch, 0, newch, 0, this.length);
-                    this.ch = newch;
+            int newLength = this.ch.length * 2;
+            if (newLength < this.ch.length + DEFAULT_SIZE)
+                newLength = this.ch.length + DEFAULT_SIZE;
+            char[] newch = new char[newLength];
+            System.arraycopy(this.ch, 0, newch, 0, this.length);
+            this.ch = newch;
         }
         this.ch[this.length] = c;
         this.length++;
@@ -130,16 +139,16 @@
 
     /**
      * append
-     * 
-     * @param s 
+     *
+     * @param s
      */
     public void append(String s) {
         int length = s.length();
         if (this.length + length > this.ch.length) {
-            int newLength = this.ch.length*2;
+            int newLength = this.ch.length * 2;
             if (newLength < this.length + length + DEFAULT_SIZE)
                 newLength = this.ch.length + length + DEFAULT_SIZE;
-            char[] newch = new char[newLength];            
+            char[] newch = new char[newLength];
             System.arraycopy(this.ch, 0, newch, 0, this.length);
             this.ch = newch;
         }
@@ -149,10 +158,10 @@
 
     /**
      * append
-     * 
-     * @param ch 
-     * @param offset 
-     * @param length 
+     *
+     * @param ch
+     * @param offset
+     * @param length
      */
     public void append(char[] ch, int offset, int length) {
         if (this.length + length > this.ch.length) {
@@ -166,8 +175,8 @@
 
     /**
      * append
-     * 
-     * @param s 
+     *
+     * @param s
      */
     public void append(XMLString s) {
         append(s.ch, s.offset, s.length);
diff --git a/struts2-jsp-plugin/src/main/resources/struts-plugin.xml b/struts2-jsp-plugin/src/main/resources/struts-plugin.xml
index 35a15a0..8f30dc0 100644
--- a/struts2-jsp-plugin/src/main/resources/struts-plugin.xml
+++ b/struts2-jsp-plugin/src/main/resources/struts-plugin.xml
@@ -22,15 +22,15 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-    "http://struts.apache.org/dtds/struts-2.0.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+        "http://struts.apache.org/dtds/struts-2.0.dtd">
 
 <struts>
     <package name="jsp-default" extends="struts-default">
 
-    	<result-types>
-    		<result-type name="embeddedJsp" class="org.apache.struts2.EmbeddedJSPResult"/>
-    	</result-types>
+        <result-types>
+            <result-type name="embeddedJsp" class="org.apache.struts2.EmbeddedJSPResult"/>
+        </result-types>
     </package>
 
 </struts>
diff --git a/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java b/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
index 3784f80..9314b93 100644
--- a/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
+++ b/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
@@ -25,22 +25,21 @@
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.util.ValueStack;
 import junit.framework.TestCase;
-import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.xwork.StringUtils;
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
 import org.springframework.mock.web.MockHttpServletResponse;
 import org.springframework.mock.web.MockServletContext;
 
+import javax.servlet.Servlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-import javax.servlet.Servlet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.List;
 import java.util.ArrayList;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.CyclicBarrier;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
 
 public class EmbeddedJSPResultTest extends TestCase {
     private HttpServletRequest request;
@@ -48,6 +47,22 @@
     private MockServletContext context;
     private EmbeddedJSPResult result;
 
+    public void testEmbedded() throws Exception {
+        //the jsp is inside jsps.jar
+        result.setLocation("dir/all.jsp");
+        result.execute(null);
+
+        assertEquals("helloJGWhoamI?XXXXXXXXXXXYThissessionisnotsecure.", StringUtils.deleteWhitespace(response.getContentAsString()));
+    }
+
+    public void testEmbeddedAbsolutePath() throws Exception {
+        //the jsp is inside jsps.jar
+        result.setLocation("/dir/all.jsp");
+        result.execute(null);
+
+        assertEquals("helloJGWhoamI?XXXXXXXXXXXYThissessionisnotsecure.", StringUtils.deleteWhitespace(response.getContentAsString()));
+    }
+
     public void testSimple() throws Exception {
         result.setLocation("org/apache/struts2/simple0.jsp");
         result.execute(null);
@@ -66,35 +81,35 @@
         result.setLocation("org/apache/struts2/tag0.jsp");
         result.execute(null);
 
-        assertEquals("Thissessionisnotsecure.OtherText", cleanup(response.getContentAsString()));
+        assertEquals("Thissessionisnotsecure.OtherText", StringUtils.deleteWhitespace(response.getContentAsString()));
     }
 
     public void testIncludeSimple() throws Exception {
         result.setLocation("org/apache/struts2/includes0.jsp");
         result.execute(null);
 
-        assertEquals("helloTest", cleanup(response.getContentAsString()));
+        assertEquals("helloTest", StringUtils.deleteWhitespace(response.getContentAsString()));
     }
 
     public void testIncludeSimpleWithDirective() throws Exception {
         result.setLocation("org/apache/struts2/includes3.jsp");
         result.execute(null);
 
-        assertEquals("helloTest", cleanup(response.getContentAsString()));
+        assertEquals("helloTest", StringUtils.deleteWhitespace(response.getContentAsString()));
     }
 
     public void testIncludeWithSubdir() throws Exception {
         result.setLocation("org/apache/struts2/includes1.jsp");
         result.execute(null);
 
-        assertEquals("subTest", cleanup(response.getContentAsString()));
+        assertEquals("subTest", StringUtils.deleteWhitespace(response.getContentAsString()));
     }
 
     public void testIncludeWithParam() throws Exception {
         result.setLocation("org/apache/struts2/includes2.jsp");
         result.execute(null);
 
-        assertEquals("JGTest", cleanup(response.getContentAsString()));
+        assertEquals("JGTest", StringUtils.deleteWhitespace(response.getContentAsString()));
     }
 
     public void testBroken0() throws Exception {
@@ -111,7 +126,7 @@
         result.setLocation("org/apache/struts2/jstl.jsp");
         result.execute(null);
 
-        assertEquals("XXXXXXXXXXXY", cleanup(response.getContentAsString()));
+        assertEquals("XXXXXXXXXXXY", StringUtils.deleteWhitespace(response.getContentAsString()));
     }
 
 
@@ -154,18 +169,13 @@
         }
     }
 
-     public void testBeans() throws Exception {
+    public void testBeans() throws Exception {
         result.setLocation("org/apache/struts2/beans.jsp");
         result.execute(null);
 
-        assertEquals("WhoamI?", cleanup(response.getContentAsString()));
+        assertEquals("WhoamI?", StringUtils.deleteWhitespace(response.getContentAsString()));
     }
 
-    private String cleanup(String str) {
-        return str.replaceAll("\\s", "");
-    }
-
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
diff --git a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/beans.jsp b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/beans.jsp
index 0f18aef..6d5222d 100644
--- a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/beans.jsp
+++ b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/beans.jsp
@@ -1,2 +1,2 @@
-<jsp:useBean id="mybean" class="org.apache.struts2.SoyBean" scope="page" />
-<jsp:getProperty name="mybean" property="message" />
+<jsp:useBean id="mybean" class="org.apache.struts2.SoyBean" scope="page"/>
+<jsp:getProperty name="mybean" property="message"/>
diff --git a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/broken0.jsp b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/broken0.jsp
index cd8160b..b4bf816 100644
--- a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/broken0.jsp
+++ b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/broken0.jsp
@@ -1,2 +1,2 @@
-<jsp:include page="org/apache/struts2/printParam.jsp" >
+<jsp:include page="org/apache/struts2/printParam.jsp">
   
\ No newline at end of file
diff --git a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp
index a13faf2..d660643 100644
--- a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp
+++ b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp
@@ -1,2 +1,2 @@
-<jsp:include page="org/apache/struts2/simple0.jsp" />
+<jsp:include page="org/apache/struts2/simple0.jsp"/>
 Test
\ No newline at end of file
diff --git a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes1.jsp b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes1.jsp
index f1a3deb..b08963f 100644
--- a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes1.jsp
+++ b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes1.jsp
@@ -1,2 +1,2 @@
-<jsp:include page="org/apache/struts2/sub/simple0.jsp" />
+<jsp:include page="org/apache/struts2/sub/simple0.jsp"/>
 Test
\ No newline at end of file
diff --git a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes2.jsp b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes2.jsp
index 9ebdf99..442f5b3 100644
--- a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes2.jsp
+++ b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes2.jsp
@@ -1,4 +1,4 @@
-<jsp:include page="org/apache/struts2/printParam.jsp" >
-   <jsp:param name="username" value="JG" />
+<jsp:include page="org/apache/struts2/printParam.jsp">
+    <jsp:param name="username" value="JG"/>
 </jsp:include>
 Test
\ No newline at end of file
diff --git a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp
index f31dd21..82c7e61 100644
--- a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp
+++ b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp
@@ -2,8 +2,8 @@
 
 <c:set var="number" value="10"/>
 <c:forEach begin="0" end="${number}">
-X    
+    X
 </c:forEach>
 <c:if test="${number < 15}">
-Y
+    Y
 </c:if>
\ No newline at end of file
diff --git a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/tag0.jsp b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/tag0.jsp
index 7bdc194..55e2b05 100644
--- a/struts2-jsp-plugin/src/test/resources/org/apache/struts2/tag0.jsp
+++ b/struts2-jsp-plugin/src/test/resources/org/apache/struts2/tag0.jsp
@@ -1,5 +1,5 @@
 <%@ taglib prefix="r" uri="http://jakarta.apache.org/taglibs/request-1.0" %>
 <r:isSecure value="false">
-  This session is not secure.
+    This session is not secure.
 </r:isSecure>
 OtherText
\ No newline at end of file
