diff --git a/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java b/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java
index f4a97d5..4f4f42c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java
@@ -24,7 +24,6 @@
 import org.apache.wiki.auth.WikiPrincipal;
 import org.apache.wiki.auth.permissions.AllPermission;
 import org.apache.wiki.auth.user.UserDatabase;
-import org.apache.wiki.tags.WikiTagBase;
 import org.apache.wiki.ui.Command;
 import org.apache.wiki.ui.CommandResolver;
 import org.apache.wiki.ui.GroupCommand;
@@ -70,6 +69,8 @@
 
     private WikiSession m_session;
 
+    public static final String ATTR_CONTEXT = "jspwiki.context";
+
     /** User is administering JSPWiki (Install, SecurityConfig). */
     public static final String INSTALL = WikiCommand.INSTALL.getRequestContext();
 
@@ -636,7 +637,7 @@
 
     /**
      *  This method can be used to find the WikiContext programmatically from a JSP PageContext. We check the request context.
-     *  The wiki context, if it exists, is looked up using the key {@link org.apache.wiki.tags.WikiTagBase#ATTR_CONTEXT}.
+     *  The wiki context, if it exists, is looked up using the key {@link #ATTR_CONTEXT}.
      *
      *  @since 2.4
      *  @param pageContext the JSP page context
@@ -644,7 +645,7 @@
      */
     public static WikiContext findContext( final PageContext pageContext ) {
         final HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
-        return (WikiContext)request.getAttribute( WikiTagBase.ATTR_CONTEXT );
+        return (WikiContext)request.getAttribute( ATTR_CONTEXT );
     }
 
     /**
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/auth/AuthorizationManager.java b/jspwiki-main/src/main/java/org/apache/wiki/auth/AuthorizationManager.java
index e1acca7..040046d 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/auth/AuthorizationManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/auth/AuthorizationManager.java
@@ -39,7 +39,6 @@
 import org.apache.wiki.event.WikiSecurityEvent;
 import org.apache.wiki.i18n.InternationalizationManager;
 import org.apache.wiki.preferences.Preferences;
-import org.apache.wiki.tags.WikiTagBase;
 import org.apache.wiki.util.ClassUtil;
 import org.freshcookies.security.policy.LocalPolicy;
 
@@ -383,7 +382,7 @@
      * If the user is allowed, this method returns <code>true</code>;
      * <code>false</code> otherwise. If access is allowed,
      * the wiki context will be added to the request as an attribute
-     * with the key name {@link org.apache.wiki.tags.WikiTagBase#ATTR_CONTEXT}.
+     * with the key name {@link org.apache.wiki.WikiContext#ATTR_CONTEXT}.
      * Note that this method will automatically redirect the user to
      * a login or error page, as appropriate, if access fails. This is
      * NOT guaranteed to be default behavior in the future.
@@ -404,7 +403,7 @@
      * and delegating the access check to {@link #checkPermission(WikiSession, Permission)}.
      * If the user is allowed, this method returns <code>true</code>;
      * <code>false</code> otherwise. Also, the wiki context will be added to the request as attribute
-     * with the key name {@link org.apache.wiki.tags.WikiTagBase#ATTR_CONTEXT}.
+     * with the key name {@link org.apache.wiki.WikiContext#ATTR_CONTEXT}.
      *
      * @param context wiki context to check if it is accesible
      * @param response The servlet response object
@@ -412,33 +411,26 @@
      * @return the result of the access check
      * @throws IOException If something goes wrong
      */
-    public boolean hasAccess( WikiContext context, HttpServletResponse response, boolean redirect ) throws IOException
-    {
-        boolean allowed = checkPermission( context.getWikiSession(), context.requiredPermission() );
-        ResourceBundle rb = Preferences.getBundle( context, InternationalizationManager.CORE_BUNDLE );
+    public boolean hasAccess( final WikiContext context, final HttpServletResponse response, final boolean redirect ) throws IOException {
+        final boolean allowed = checkPermission( context.getWikiSession(), context.requiredPermission() );
+        final ResourceBundle rb = Preferences.getBundle( context, InternationalizationManager.CORE_BUNDLE );
 
         // Stash the wiki context
-        if ( context.getHttpRequest() != null && context.getHttpRequest().getAttribute( WikiTagBase.ATTR_CONTEXT ) == null )
-        {
-            context.getHttpRequest().setAttribute( WikiTagBase.ATTR_CONTEXT, context );
+        if ( context.getHttpRequest() != null && context.getHttpRequest().getAttribute( WikiContext.ATTR_CONTEXT ) == null ) {
+            context.getHttpRequest().setAttribute( WikiContext.ATTR_CONTEXT, context );
         }
 
         // If access not allowed, redirect
-        if( !allowed && redirect )
-        {
-            Principal currentUser  = context.getWikiSession().getUserPrincipal();
-            String pageurl = context.getPage().getName();
-            if( context.getWikiSession().isAuthenticated() )
-            {
+        if( !allowed && redirect ) {
+            final Principal currentUser  = context.getWikiSession().getUserPrincipal();
+            final String pageurl = context.getPage().getName();
+            if( context.getWikiSession().isAuthenticated() ) {
                 log.info("User "+currentUser.getName()+" has no access - forbidden (permission=" + context.requiredPermission() + ")" );
-                context.getWikiSession().addMessage(
-                               MessageFormat.format( rb.getString("security.error.noaccess.logged"), context.getName()) );
-            }
-            else
-            {
+                context.getWikiSession().addMessage( MessageFormat.format( rb.getString( "security.error.noaccess.logged" ),
+                                                     context.getName()) );
+            } else {
                 log.info("User "+currentUser.getName()+" has no access - redirecting (permission=" + context.requiredPermission() + ")");
-                context.getWikiSession().addMessage(
-                               MessageFormat.format( rb.getString("security.error.noaccess"), context.getName()) );
+                context.getWikiSession().addMessage( MessageFormat.format( rb.getString("security.error.noaccess"), context.getName() ) );
             }
             response.sendRedirect( m_engine.getURL(WikiContext.LOGIN, pageurl, null, false ) );
         }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/AttachmentsIteratorTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/AttachmentsIteratorTag.java
index 232e4ca..41f1c67 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/AttachmentsIteratorTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/AttachmentsIteratorTag.java
@@ -53,7 +53,7 @@
      */
     @Override
     public final int doStartTag()  {
-        m_wikiContext = (WikiContext) pageContext.getAttribute( WikiTagBase.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
+        m_wikiContext = (WikiContext) pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
         final WikiEngine engine = m_wikiContext.getEngine();
         final AttachmentManager mgr = engine.getAttachmentManager();
         final WikiPage page;
@@ -81,7 +81,7 @@
                     final Attachment  att = (Attachment) m_iterator.next();
                     final WikiContext context = (WikiContext)m_wikiContext.clone();
                     context.setPage( att );
-                    pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
+                    pageContext.setAttribute( WikiContext.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
                     pageContext.setAttribute( getId(), att );
                 } else {
                     return SKIP_BODY;
@@ -119,7 +119,7 @@
             final Attachment att = ( Attachment )m_iterator.next();
             final WikiContext context = ( WikiContext )m_wikiContext.clone();
             context.setPage( att );
-            pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT,  context, PageContext.REQUEST_SCOPE );
+            pageContext.setAttribute( WikiContext.ATTR_CONTEXT,  context, PageContext.REQUEST_SCOPE );
             pageContext.setAttribute( getId(), att );
 
             return EVAL_BODY_BUFFERED;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/HistoryIteratorTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/HistoryIteratorTag.java
index 5134cfa..6686c54 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/HistoryIteratorTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/HistoryIteratorTag.java
@@ -47,7 +47,7 @@
 
     @Override
     public final int doStartTag() {
-        m_wikiContext = (WikiContext) pageContext.getAttribute( WikiTagBase.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
+        m_wikiContext = (WikiContext) pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
         final WikiEngine engine = m_wikiContext.getEngine();
         final WikiPage page = m_wikiContext.getPage();
 
@@ -65,7 +65,7 @@
                 if( m_iterator.hasNext() ) {
                     final WikiContext context = ( WikiContext )m_wikiContext.clone();
                     context.setPage( ( WikiPage )m_iterator.next() );
-                    pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
+                    pageContext.setAttribute( WikiContext.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
                     pageContext.setAttribute( getId(), context.getPage() );
                 } else {
                     return SKIP_BODY;
@@ -97,7 +97,7 @@
         if( m_iterator != null && m_iterator.hasNext() ) {
             final WikiContext context = ( WikiContext )m_wikiContext.clone();
             context.setPage( ( WikiPage )m_iterator.next() );
-            pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
+            pageContext.setAttribute( WikiContext.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
             pageContext.setAttribute( getId(), context.getPage() );
             return EVAL_BODY_BUFFERED;
         }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java
index e04470d..78a1a46 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java
@@ -18,19 +18,18 @@
  */
 package org.apache.wiki.tags;
 
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
+import org.apache.log4j.Logger;
+import org.apache.wiki.WikiContext;
+import org.apache.wiki.WikiPage;
 
 import javax.servlet.jsp.JspWriter;
 import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.BodyTagSupport;
 import javax.servlet.jsp.tagext.TryCatchFinally;
-
-import org.apache.log4j.Logger;
-import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
 
 
 /**
@@ -130,7 +129,7 @@
         //
         //  Push it to the iterator stack, and set the id.
         //
-        pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
+        pageContext.setAttribute( WikiContext.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
         pageContext.setAttribute( getId(), o );
     }
 
@@ -141,7 +140,7 @@
     public int doEndTag()
     {
         // Return back to the original.
-        pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT, m_wikiContext, PageContext.REQUEST_SCOPE );
+        pageContext.setAttribute( WikiContext.ATTR_CONTEXT, m_wikiContext, PageContext.REQUEST_SCOPE );
 
         return EVAL_PAGE;
     }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java
index 0eb68eb..f3f8ed2 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java
@@ -18,13 +18,6 @@
  */
 package org.apache.wiki.tags;
 
-import java.io.IOException;
-import java.util.Collection;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspWriter;
-import javax.servlet.jsp.PageContext;
-
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiEngine;
@@ -32,6 +25,12 @@
 import org.apache.wiki.ui.Command;
 import org.apache.wiki.ui.PageCommand;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.PageContext;
+import java.io.IOException;
+import java.util.Collection;
+
 /**
  *  Iterates through Search result results.
  *
@@ -89,7 +88,7 @@
         }
 
         m_count = 0;
-        m_wikiContext = (WikiContext) pageContext.getAttribute( WikiTagBase.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
+        m_wikiContext = (WikiContext) pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
 
         return nextResult();
     }
@@ -107,9 +106,7 @@
             WikiContext context = new WikiContext( engine, request, command );
             
             // Stash it in the page context
-            pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT,
-                                      context,
-                                      PageContext.REQUEST_SCOPE );
+            pageContext.setAttribute( WikiContext.ATTR_CONTEXT, context, PageContext.REQUEST_SCOPE );
             pageContext.setAttribute( getId(), r );
 
             return EVAL_BODY_BUFFERED;
@@ -118,18 +115,13 @@
         return SKIP_BODY;
     }
 
-    public int doAfterBody()
-    {
-        if( bodyContent != null )
-        {
-            try
-            {
-                JspWriter out = getPreviousOut();
+    public int doAfterBody() {
+        if( bodyContent != null ) {
+            try {
+                final JspWriter out = getPreviousOut();
                 out.print(bodyContent.getString());
                 bodyContent.clearBody();
-            }
-            catch( IOException e )
-            {
+            } catch( final IOException e ) {
                 log.error("Unable to get inner tag text", e);
                 // FIXME: throw something?
             }
@@ -138,10 +130,9 @@
         return nextResult();
     }
 
-    public int doEndTag()
-    {
+    public int doEndTag() {
         m_iterator = null;
-
         return super.doEndTag();
     }
+
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/TranslateTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/TranslateTag.java
index d838d1b..f6cbd0c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/TranslateTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/TranslateTag.java
@@ -18,15 +18,14 @@
  */
 package org.apache.wiki.tags;
 
+import org.apache.log4j.Logger;
+import org.apache.wiki.WikiContext;
+
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.BodyContent;
 import javax.servlet.jsp.tagext.BodyTagSupport;
 
-import org.apache.wiki.WikiContext;
-
-import org.apache.log4j.Logger;
-
 /**
  *  Converts the body text into HTML content.
  *
@@ -37,45 +36,31 @@
 {
     private static final long serialVersionUID = 0L;
     
-    static    Logger    log = Logger.getLogger( TranslateTag.class );
+    private static final Logger log = Logger.getLogger( TranslateTag.class );
 
-    public final int doAfterBody()
-        throws JspException
-    {
-        try
-        {
-            WikiContext context = (WikiContext) pageContext.getAttribute( WikiTagBase.ATTR_CONTEXT,
-                                                                          PageContext.REQUEST_SCOPE );
+    public final int doAfterBody() throws JspException {
+        try {
+            WikiContext context = (WikiContext) pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
 
-            //
-            //  Because the TranslateTag should not affect any of the real page attributes
-            //  we have to make a clone here.
-            //
-            
+            //  Because the TranslateTag should not affect any of the real page attributes we have to make a clone here.
             context = context.deepClone();
             
-            //
             //  Get the page data.
-            //
-            BodyContent bc = getBodyContent();
+            final BodyContent bc = getBodyContent();
             String wikiText = bc.getString();
             bc.clearBody();
 
-            if( wikiText != null )
-            {
+            if( wikiText != null ) {
                 wikiText = wikiText.trim();
-            
-                String result = context.getEngine().textToHTML( context, wikiText );
-
+                final String result = context.getEngine().textToHTML( context, wikiText );
                 getPreviousOut().write( result );
             }
-        }
-        catch( Exception e )
-        {
+        } catch( final Exception e ) {
             log.error( "Tag failed", e );
-            throw new JspException( "Tag failed, check logs: "+e.getMessage() );
+            throw new JspException( "Tag failed, check logs: " + e.getMessage() );
         }
 
         return SKIP_BODY;
     }
+
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiBodyTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiBodyTag.java
index a73a794..fe86320 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiBodyTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiBodyTag.java
@@ -18,16 +18,14 @@
  */
 package org.apache.wiki.tags;
 
-import java.io.IOException;
+import org.apache.log4j.Logger;
+import org.apache.wiki.WikiContext;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.BodyTagSupport;
 import javax.servlet.jsp.tagext.TryCatchFinally;
-
-import org.apache.log4j.Logger;
-
-import org.apache.wiki.WikiContext;
+import java.io.IOException;
 
 
 /**
@@ -40,22 +38,15 @@
 	protected WikiContext m_wikiContext;
     private static final Logger log = Logger.getLogger( WikiBodyTag.class );
 
-    public int doStartTag() throws JspException
-    {
-        try
-        {
-            m_wikiContext = (WikiContext) pageContext.getAttribute( WikiTagBase.ATTR_CONTEXT,
-                                                                    PageContext.REQUEST_SCOPE );
-
-            if( m_wikiContext == null )
-            {
+    public int doStartTag() throws JspException {
+        try {
+            m_wikiContext = (WikiContext) pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
+            if( m_wikiContext == null ) {
                 throw new JspException("WikiContext may not be NULL - serious internal problem!");
             }
 
             return doWikiStartTag();
-        }
-        catch( Exception e )
-        {
+        } catch( final Exception e ) {
             log.error( "Tag failed", e );
             throw new JspException( "Tag failed, check logs: "+e.getMessage() );
         }
@@ -70,8 +61,7 @@
      */
     public abstract int doWikiStartTag() throws JspException, IOException;
 
-    public void doCatch(Throwable arg0) throws Throwable
-    {
+    public void doCatch(Throwable arg0) throws Throwable {
     }
 
     public void doFinally()
@@ -79,5 +69,4 @@
         m_wikiContext = null;
     }  
     
-    
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiTagBase.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiTagBase.java
index 8d2b0be..123b2af 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiTagBase.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/WikiTagBase.java
@@ -40,8 +40,6 @@
     private static final long serialVersionUID = -1409836349293777141L;
     private static final Logger log = Logger.getLogger( WikiTagBase.class );
 
-    public static final String ATTR_CONTEXT = "jspwiki.context";
-
     protected WikiContext m_wikiContext;
 
     /**
@@ -64,7 +62,7 @@
     
     public int doStartTag() throws JspException {
         try {
-            m_wikiContext = ( WikiContext )pageContext.getAttribute( ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
+            m_wikiContext = ( WikiContext )pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
             if( m_wikiContext == null ) {
                 throw new JspException("WikiContext may not be NULL - serious internal problem!");
             }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java
index 41d55c9..7dee58c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java
@@ -19,6 +19,7 @@
 package org.apache.wiki.ui;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
 import org.apache.log4j.NDC;
 import org.apache.wiki.WatchDog;
 import org.apache.wiki.WikiContext;
@@ -75,8 +76,9 @@
  * @see TemplateManager
  * @see org.apache.wiki.tags.RequestResourceTag
  */
-public class WikiJSPFilter extends WikiServletFilter
-{
+public class WikiJSPFilter extends WikiServletFilter {
+
+    private static final Logger log = Logger.getLogger( WikiJSPFilter.class );
     private String m_wiki_encoding;
     private boolean useEncoding;
 
@@ -249,9 +251,8 @@
      *  Simple response wrapper that just allows us to gobble through the entire
      *  response before it's output.
      */
-    private static class JSPWikiServletResponseWrapper
-        extends HttpServletResponseWrapper
-    {
+    private static class JSPWikiServletResponseWrapper extends HttpServletResponseWrapper {
+
         ByteArrayOutputStream m_output;
         private ByteArrayServletOutputStream m_servletOut;
         private PrintWriter m_writer;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiServletFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiServletFilter.java
index 45a95e1..4d8e08f 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiServletFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiServletFilter.java
@@ -25,7 +25,6 @@
 import org.apache.wiki.WikiSession;
 import org.apache.wiki.auth.SessionMonitor;
 import org.apache.wiki.auth.WikiSecurityException;
-import org.apache.wiki.tags.WikiTagBase;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -40,23 +39,17 @@
 import java.io.PrintWriter;
 
 /**
- * Filter that verifies that the {@link org.apache.wiki.WikiEngine} is running, and
- * sets the authentication status for the user's WikiSession. Each HTTP request
- * processed by this filter is wrapped by a {@link WikiRequestWrapper}. The wrapper's
- * primary responsibility is to return the correct <code>userPrincipal</code> and
- * <code>remoteUser</code> for authenticated JSPWiki users (whether 
- * authenticated by container or by JSPWiki's custom system).
- * The wrapper's other responsibility is to incorporate JSPWiki built-in roles
- * into the role-checking algorithm for {@link  HttpServletRequest#isUserInRole(String)}.
- * Just before the request is wrapped, the method {@link org.apache.wiki.auth.AuthenticationManager#login(HttpServletRequest)} executes;
- * this method contains all of the logic needed to grab any user login credentials set 
- * by the container or by cookies.
- *  
- *
+ * Filter that verifies that the {@link org.apache.wiki.WikiEngine} is running, and sets the authentication status for the user's
+ * WikiSession. Each HTTP request processed by this filter is wrapped by a {@link WikiRequestWrapper}. The wrapper's primary responsibility
+ * is to return the correct <code>userPrincipal</code> and <code>remoteUser</code> for authenticated JSPWiki users (whether authenticated
+ * by container or by JSPWiki's custom system). The wrapper's other responsibility is to incorporate JSPWiki built-in roles
+ * into the role-checking algorithm for {@link  HttpServletRequest#isUserInRole(String)}. Just before the request is wrapped, the method
+ * {@link org.apache.wiki.auth.AuthenticationManager#login(HttpServletRequest)} executes; this method contains all of the logic needed to
+ * grab any user login credentials set by the container or by cookies.
  */
-public class WikiServletFilter implements Filter
-{
-    protected static final Logger log = Logger.getLogger( WikiServletFilter.class );
+public class WikiServletFilter implements Filter {
+
+    private static final Logger log = Logger.getLogger( WikiServletFilter.class );
     protected WikiEngine m_engine = null;
 
     /**
@@ -73,13 +66,11 @@
      * @param config The FilterConfig.
      * @throws ServletException If a WikiEngine cannot be started.
      */
-    public void init( FilterConfig config ) throws ServletException
-    {
-        ServletContext context = config.getServletContext();
+    public void init( final FilterConfig config ) throws ServletException {
+        final ServletContext context = config.getServletContext();
 
         // TODO REMOVEME when resolving JSPWIKI-129
-        if( System.getSecurityManager() != null )
-        {
+        if( System.getSecurityManager() != null ) {
             context.log( "== JSPWIKI WARNING ==   : This container is running with a security manager. JSPWiki does not yet really support that right now. See issue JSPWIKI-129 for details and information on how to proceed." );
         }
 
@@ -89,13 +80,11 @@
     /**
      * Destroys the WikiServletFilter.
      */
-    public void destroy()
-    {
+    public void destroy() {
     }
 
     /**
-    * Checks that the WikiEngine is running ok, wraps the current
-    * HTTP request, and sets the correct authentication state for the users's
+    * Checks that the WikiEngine is running ok, wraps the current HTTP request, and sets the correct authentication state for the users's
     * WikiSession. First, the method {@link org.apache.wiki.auth.AuthenticationManager#login(HttpServletRequest)}
     * executes, which sets the authentication state. Then, the request is wrapped with a
     * {@link WikiRequestWrapper}.
@@ -105,19 +94,14 @@
     * @throws ServletException if {@link org.apache.wiki.auth.AuthenticationManager#login(HttpServletRequest)} fails for any reason
     * @throws IOException If writing to the servlet response fails. 
     */
-    public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException
-    {
-        //
+    public void doFilter( final ServletRequest request, final ServletResponse response, final FilterChain chain ) throws IOException, ServletException {
         //  Sanity check; it might be true in some conditions, but we need to know where.
-        //
-        if( chain == null )
-        {
+        if( chain == null ) {
             throw new ServletException("FilterChain is null, even if it should not be.  Please report this to the jspwiki development team.");
         }
         
-        if( m_engine == null )
-        {
-            PrintWriter out = response.getWriter();
+        if( m_engine == null ) {
+            final PrintWriter out = response.getWriter();
             out.print("<!DOCTYPE html><html lang=\"en\"><head><title>Fatal problem with JSPWiki</title></head>");
             out.print("<body>");
             out.print("<h1>JSPWiki has not been started</h1>");
@@ -138,33 +122,24 @@
         // Set the character encoding
         httpRequest.setCharacterEncoding( m_engine.getContentEncoding().displayName() );
         
-        if ( !isWrapped( request ) )
-        {
+        if ( !isWrapped( request ) ) {
             // Prepare the WikiSession
-            try
-            {
+            try {
                 m_engine.getAuthenticationManager().login( httpRequest );
-                WikiSession wikiSession = SessionMonitor.getInstance( m_engine ).find( httpRequest.getSession() );
+                final WikiSession wikiSession = SessionMonitor.getInstance( m_engine ).find( httpRequest.getSession() );
                 httpRequest = new WikiRequestWrapper( m_engine, httpRequest );
-                if ( log.isDebugEnabled() )
-                {
+                if ( log.isDebugEnabled() ) {
                     log.debug( "Executed security filters for user=" + wikiSession.getLoginPrincipal().getName() + ", path=" + httpRequest.getRequestURI() );
                 }
-            }
-            catch ( WikiSecurityException e )
-            {
+            } catch( final WikiSecurityException e ) {
                 throw new ServletException( e );
             }
         }
 
-        try
-        {
+        try {
             NDC.push( m_engine.getApplicationName()+":"+httpRequest.getRequestURL() );
-            
             chain.doFilter( httpRequest, response );
-        }
-        finally
-        {
+        } finally {
             NDC.pop();
             NDC.remove();
         }
@@ -172,19 +147,14 @@
     }
 
     /**
-     *  Figures out the wiki context from the request.  This method does not create the
-     *  context if it does not exist.
+     *  Figures out the wiki context from the request.  This method does not create the context if it does not exist.
      *  
      *  @param request The request to examine
      *  @return A valid WikiContext value (or null, if the context could not be located).
      */
-    protected WikiContext getWikiContext( ServletRequest  request )
-    {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-    
-        WikiContext ctx = (WikiContext) httpRequest.getAttribute( WikiTagBase.ATTR_CONTEXT );
-        
-        return ctx;
+    protected WikiContext getWikiContext( final ServletRequest request ) {
+        final HttpServletRequest httpRequest = (HttpServletRequest) request;
+        return (WikiContext) httpRequest.getAttribute( WikiContext.ATTR_CONTEXT );
     }
 
     /** 
@@ -194,15 +164,11 @@
      * @return <code>true</code> if the request has previously been wrapped;
      * <code>false</code> otherwise
      */
-    private boolean isWrapped( ServletRequest request )
-    {
-        while ( !(request instanceof WikiRequestWrapper )
-            && request != null
-            && request instanceof HttpServletRequestWrapper )
-        {
-            request = ((HttpServletRequestWrapper) request).getRequest();
+    private boolean isWrapped( ServletRequest request ) {
+        while( !(request instanceof WikiRequestWrapper ) && request != null && request instanceof HttpServletRequestWrapper ) {
+            request = ( ( HttpServletRequestWrapper ) request ).getRequest();
         }
-        return request instanceof WikiRequestWrapper ? true : false;
+        return request instanceof WikiRequestWrapper;
     }
 
 }
