This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch jakarta-servlet-6
in repository https://gitbox.apache.org/repos/asf/felix-dev.git

commit a0621b6f959002f04cab23672112d21bec4267fb
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Mon Aug 21 15:51:37 2023 +0200

    Port changes from main branch
---
 .../felix/webconsole/DefaultVariableResolver.java  |   2 +
 .../apache/felix/webconsole/VariableResolver.java  |   1 +
 .../felix/webconsole/WebConsoleConstants.java      |   3 +
 .../apache/felix/webconsole/WebConsoleUtil.java    | 302 ---------------------
 .../internal/WebConsolePluginAdapter.java          |  15 +-
 .../webconsole/internal/compendium/LogServlet.java |   8 +-
 .../internal/configuration/ConfigManager.java      |  12 +-
 .../internal/core/BaseUpdateInstallHelper.java     |   2 +-
 .../webconsole/internal/core/BundlesServlet.java   |  12 +-
 .../webconsole/internal/core/InstallHelper.java    |   2 +-
 .../webconsole/internal/core/ServicesServlet.java  |   8 +-
 .../webconsole/internal/core/UpdateHelper.java     |   2 +-
 .../internal/filter/FilteringResponseWrapper.java  |   2 +-
 .../internal/misc/ConfigurationRender.java         |   2 +-
 .../webconsole/internal/misc/LicenseServlet.java   |   8 +-
 .../servlet}/AbstractWebConsolePlugin.java         |  95 ++++---
 .../internal/servlet/JakartaServletAdapter.java    |  45 +--
 .../internal/servlet/JakartaServletTracker.java    | 106 --------
 .../webconsole/internal/servlet/OsgiManager.java   |   2 -
 .../felix/webconsole/internal/servlet/Plugin.java  |   7 +-
 .../webconsole/internal/servlet/PluginHolder.java  |  20 --
 .../servlet}/SimpleWebConsolePlugin.java           |  19 +-
 .../internal/servlet/WebConsoleUtil.java           | 169 ++++++++++++
 .../webconsole/internal/system/VMStatPlugin.java   |   6 +-
 .../servlet}/AbstractWebConsolePluginTest.java     |   4 +-
 25 files changed, 294 insertions(+), 560 deletions(-)

diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/DefaultVariableResolver.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/DefaultVariableResolver.java
index b6885262c1..40fe2a6207 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/DefaultVariableResolver.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/DefaultVariableResolver.java
@@ -22,6 +22,8 @@ package org.apache.felix.webconsole;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
+
 
 /**
  * The <code>DefaultVariableResolver</code> is a <code>HashMap</code> based
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/VariableResolver.java 
b/webconsole/src/main/java/org/apache/felix/webconsole/VariableResolver.java
index 23ffc49a65..47bd0cf12d 100755
--- a/webconsole/src/main/java/org/apache/felix/webconsole/VariableResolver.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/VariableResolver.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.webconsole;
 
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 
 /**
  * The <code>VariableResolver</code> interface defines the API for an object
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/WebConsoleConstants.java 
b/webconsole/src/main/java/org/apache/felix/webconsole/WebConsoleConstants.java
index bc09cf4d1c..fb2b52cb69 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/WebConsoleConstants.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/WebConsoleConstants.java
@@ -18,6 +18,9 @@
  */
 package org.apache.felix.webconsole;
 
+import org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
+
 /**
  * WebConsoleConstants provides some common constants that are used by plugin
  * developers.
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/WebConsoleUtil.java 
b/webconsole/src/main/java/org/apache/felix/webconsole/WebConsoleUtil.java
deleted file mode 100755
index 447d0ccd5b..0000000000
--- a/webconsole/src/main/java/org/apache/felix/webconsole/WebConsoleUtil.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.webconsole;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Array;
-import java.net.URLDecoder;
-
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-
-
-/**
- * The <code>WebConsoleUtil</code> provides various utility methods for use
- * by Web Console plugins.
- */
-public final class WebConsoleUtil
-{
-
-    private WebConsoleUtil()
-    {
-        /* no instantiation */
-    }
-
-    /**
-     * Returns the {@link VariableResolver} for the given request.
-     * <p>
-     * If no resolver has yet be created for the requests, an instance of the
-     * {@link DefaultVariableResolver} is created with preset properties,
-     * placed into the request and returned. The preset properties are
-     * <code>appRoot</code> set to the value of the
-     * {@link WebConsoleConstants#ATTR_APP_ROOT} request attribute and
-     * <code>pluginRoot</code> set to the value of the
-     * {@link WebConsoleConstants#ATTR_PLUGIN_ROOT} request attribute.
-     * <p>
-     * <b>Note</b>: An object not implementing the {@link VariableResolver}
-     * interface already stored as the
-     * {@link WebConsoleConstants#ATTR_CONSOLE_VARIABLE_RESOLVER} attribute
-     * will silently be replaced by the {@link DefaultVariableResolver}
-     * instance.
-     *
-     * @param request The request whose attribute is returned (or set)
-     *
-     * @return The {@link VariableResolver} for the given request.
-     */
-    @SuppressWarnings("unchecked")
-    public static VariableResolver getVariableResolver( final ServletRequest 
request )
-    {
-        final Object resolverObj = request.getAttribute( 
WebConsoleConstants.ATTR_CONSOLE_VARIABLE_RESOLVER );
-        if ( resolverObj instanceof VariableResolver )
-        {
-            return ( VariableResolver ) resolverObj;
-        }
-
-        final DefaultVariableResolver resolver = new DefaultVariableResolver();
-        resolver.put( "appRoot", request.getAttribute( 
WebConsoleConstants.ATTR_APP_ROOT ) );
-        resolver.put( "pluginRoot", request.getAttribute( 
WebConsoleConstants.ATTR_PLUGIN_ROOT ) );
-        setVariableResolver( request, resolver );
-        return resolver;
-    }
-
-
-    /**
-     * Sets the {@link VariableResolver} as the
-     * {@link WebConsoleConstants#ATTR_CONSOLE_VARIABLE_RESOLVER}
-     * attribute in the given request. An attribute of that name already
-     * existing is silently replaced.
-     *
-     * @param request The request whose attribute is set
-     * @param resolver The {@link VariableResolver} to place into the request
-     */
-    public static void setVariableResolver( final ServletRequest request, 
final VariableResolver resolver )
-    {
-        request.setAttribute( 
WebConsoleConstants.ATTR_CONSOLE_VARIABLE_RESOLVER, resolver );
-    }
-
-    /**
-     * Utility method to handle relative redirects.
-     * Some application servers like Web Sphere handle relative redirects 
differently
-     * therefore we should make an absolute URL before invoking send redirect.
-     *
-     * @param request the HTTP request coming from the user
-     * @param response the HTTP response, where data is rendered
-     * @param redirectUrl the redirect URI.
-     * @throws IOException If an input or output exception occurs
-     * @throws IllegalStateException   If the response was committed or if a 
partial
-     *  URL is given and cannot be converted into a valid URL
-     */
-    public static final void sendRedirect(final HttpServletRequest request,
-            final HttpServletResponse response,
-            String redirectUrl) throws IOException {
-        // check for relative URL
-        if ( !redirectUrl.startsWith("/") ) { //$NON-NLS-1$
-            String base = request.getContextPath() + request.getServletPath() 
+ request.getPathInfo();
-            int i = base.lastIndexOf('/');
-            if (i > -1) {
-                base = base.substring(0, i);
-            } else {
-                i = base.indexOf(':');
-                base = (i > -1) ? base.substring(i + 1, base.length()) : ""; 
//$NON-NLS-1$
-            }
-            if (!base.startsWith("/")) { //$NON-NLS-1$
-                base = '/' + base;
-            }
-            redirectUrl = base + '/' + redirectUrl;
-
-        }
-        response.sendRedirect(redirectUrl);
-    }
-
-    /**
-     * Sets response headers to force the client to not cache the response
-     * sent back. This method must be called before the response is committed
-     * otherwise it will have no effect.
-     * <p>
-     * This method sets the <code>Cache-Control</code>, <code>Expires</code>,
-     * and <code>Pragma</code> headers.
-     *
-     * @param response The response for which to set the cache prevention
-     */
-    public static final void setNoCache(final HttpServletResponse response) {
-        response.setHeader("Cache-Control", "no-cache"); //$NON-NLS-1$ 
//$NON-NLS-2$
-        response.addHeader("Cache-Control", "no-store"); //$NON-NLS-1$ 
//$NON-NLS-2$
-        response.addHeader("Cache-Control", "must-revalidate"); //$NON-NLS-1$ 
//$NON-NLS-2$
-        response.addHeader("Cache-Control", "max-age=0"); //$NON-NLS-1$ 
//$NON-NLS-2$
-        response.setHeader("Expires", "Thu, 01 Jan 1970 01:00:00 GMT"); 
//$NON-NLS-1$ //$NON-NLS-2$
-        response.setHeader("Pragma", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * Escapes HTML special chars like: &lt;&gt;&amp;\r\n and space
-     *
-     *
-     * @param text the text to escape
-     * @return the escaped text
-     */
-    public static final String escapeHtml(String text)
-    {
-        StringBuilder sb = new StringBuilder(text.length() * 4 / 3);
-        char ch, oldch = '_';
-        for (int i = 0; i < text.length(); i++)
-        {
-            switch (ch = text.charAt(i))
-            {
-            case '<':
-                sb.append("&lt;"); //$NON-NLS-1$
-                break;
-            case '>':
-                sb.append("&gt;"); //$NON-NLS-1$
-                break;
-            case '&':
-                sb.append("&amp;"); //$NON-NLS-1$
-                break;
-            case ' ':
-                sb.append("&nbsp;"); //$NON-NLS-1$
-                break;
-            case '\'':
-                sb.append("&apos;"); //$NON-NLS-1$
-                break;
-            case '"':
-                sb.append("&quot;"); //$NON-NLS-1$
-                break;
-            case '\r':
-            case '\n':
-                if (oldch != '\r' && oldch != '\n') // don't add twice <br>
-                    sb.append("<br/>\n"); //$NON-NLS-1$
-                break;
-            default:
-                sb.append(ch);
-            }
-            oldch = ch;
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Retrieves a request parameter and converts it to int.
-     *
-     * @param request the HTTP request
-     * @param name the name of the request parameter
-     * @param _default the default value returned if the parameter is not set 
or is not a valid integer.
-     * @return the request parameter if set and is valid integer, or the 
default value
-     */
-    public static final int getParameterInt(HttpServletRequest request, String 
name,
-            int _default)
-    {
-        int ret = _default;
-        String param = request.getParameter(name);
-        try
-        {
-            if (param != null)
-                ret = Integer.parseInt(param);
-        }
-        catch (NumberFormatException nfe)
-        {
-            // don't care, will return default
-        }
-
-        return ret;
-    }
-
-    /**
-     * Decode the given value expected to be URL encoded.
-     * <p>
-     * This method first tries to use the Java 1.4 method
-     * <code>URLDecoder.decode(String, String)</code> method and falls back to
-     * the now deprecated <code>URLDecoder.decode(String, String)</code>
-     * which uses the platform character set to decode the string. This is
-     * because the platforms before 1.4 and most notably some OSGi Execution
-     * Environments (such as Minimum EE) do not provide the newer method.
-     *
-     * @param value the value to decode
-     * @return the decoded string
-     */
-    @SuppressWarnings("deprecation")
-    public static String urlDecode( final String value )
-    {
-        // shortcut for empty or missing values
-        if ( value == null || value.length() == 0 )
-        {
-            return value;
-        }
-
-        try {
-            return URLDecoder.decode( value, "UTF-8" );
-        } catch (UnsupportedEncodingException e) {
-            return URLDecoder.decode( value );
-        }
-    }
-
-    /**
-     * This method will stringify a Java object. It is mostly used to print 
the values
-     * of unknown properties. This method will correctly handle if the passed 
object
-     * is array and will property display it.
-     *
-     * If the value is byte[] the elements are shown as Hex
-     *
-     * @param value the value to convert
-     * @return the string representation of the value
-     */
-    public static final String toString(Object value)
-    {
-        if (value == null)
-        {
-            return "n/a"; //$NON-NLS-1$
-        }
-        else if (value.getClass().isArray())
-        {
-            final StringBuilder sb = new StringBuilder();
-            final int len = Array.getLength(value);
-            sb.append('[');
-            for (int i = 0; i < len; i++)
-            {
-                final Object element = Array.get(value, i);
-                if (element instanceof Byte)
-                {
-                    // convert byte[] to hex string
-                    sb.append("0x"); //$NON-NLS-1$
-                    final String x = Integer.toHexString(((Byte) 
element).intValue() & 0xff);
-                    if (1 == x.length())
-                    {
-                        sb.append('0');
-                    }
-                    sb.append(x);
-                }
-                else
-                {
-                    sb.append(toString(element));
-                }
-
-                if (i < len - 1)
-                {
-                    sb.append(", "); //$NON-NLS-1$
-                }
-            }
-            return sb.append(']').toString();
-        }
-        else
-        {
-            return value.toString();
-        }
-    }
-}
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/WebConsolePluginAdapter.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/WebConsolePluginAdapter.java
index 4eb6742585..ef2c37ff90 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/WebConsolePluginAdapter.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/WebConsolePluginAdapter.java
@@ -21,8 +21,9 @@ package org.apache.felix.webconsole.internal;
 
 import java.io.IOException;
 import java.util.*;
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+
 import org.apache.felix.webconsole.WebConsoleConstants;
+import org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin;
 import org.osgi.framework.ServiceReference;
 
 import jakarta.servlet.Servlet;
@@ -78,7 +79,7 @@ public class WebConsolePluginAdapter extends 
AbstractWebConsolePlugin
     /**
      * Returns the label of this plugin page as defined in the constructor.
      *
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getLabel()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getLabel()
      */
     public String getLabel()
     {
@@ -91,7 +92,7 @@ public class WebConsolePluginAdapter extends 
AbstractWebConsolePlugin
      * {@link WebConsoleConstants#PLUGIN_TITLE} service registration attribute
      * which is exposed as the servlet name in the servlet configuration.
      *
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getTitle()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getTitle()
      */
     public String getTitle()
     {
@@ -106,7 +107,7 @@ public class WebConsolePluginAdapter extends 
AbstractWebConsolePlugin
      * {@link WebConsoleConstants#PLUGIN_CSS_REFERENCES felix.webconsole.css}
      * service registration property of the plugin.
      *
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#getCssReferences()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getCssReferences()
      */
     protected String[] getCssReferences()
     {
@@ -118,7 +119,7 @@ public class WebConsolePluginAdapter extends 
AbstractWebConsolePlugin
      * Call the plugin servlet's service method to render the content of this
      * page.
      *
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     protected void renderContent( HttpServletRequest req, HttpServletResponse 
res ) throws ServletException,
         IOException
@@ -132,7 +133,7 @@ public class WebConsolePluginAdapter extends 
AbstractWebConsolePlugin
      * <code>getResource()</code> method on that object for this plugin to
      * provide additional resources.
      *
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#getResourceProvider()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getResourceProvider()
      */
     protected Object getResourceProvider()
     {
@@ -182,7 +183,7 @@ public class WebConsolePluginAdapter extends 
AbstractWebConsolePlugin
      * method is called without any decorations and without setting any
      * response headers.
      *
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#isHtmlRequest(jakarta.servlet.http.HttpServletRequest)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#isHtmlRequest(jakarta.servlet.http.HttpServletRequest)
      */
     protected boolean isHtmlRequest( final HttpServletRequest request )
     {
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java
index e3a2e147a8..ef2d216fe8 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java
@@ -28,9 +28,9 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.felix.utils.json.JSONWriter;
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
-import org.apache.felix.webconsole.WebConsoleUtil;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -120,7 +120,7 @@ public class LogServlet extends SimpleWebConsolePlugin 
implements OsgiManagerPlu
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     protected void doGet( HttpServletRequest request, HttpServletResponse 
response ) throws ServletException,
     IOException
@@ -141,7 +141,7 @@ public class LogServlet extends SimpleWebConsolePlugin 
implements OsgiManagerPlu
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     protected void renderContent( HttpServletRequest request, 
HttpServletResponse response ) throws IOException
     {
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
index efed40249b..cef84138a3 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
@@ -19,6 +19,8 @@ package org.apache.felix.webconsole.internal.configuration;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -29,12 +31,12 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.felix.utils.json.JSONWriter;
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.felix.webconsole.WebConsoleUtil;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
 import org.apache.felix.webconsole.internal.misc.ServletSupport;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 import org.apache.felix.webconsole.spi.ConfigurationHandler;
 import org.apache.felix.webconsole.spi.ValidationException;
@@ -145,7 +147,7 @@ public class ConfigManager extends SimpleWebConsolePlugin 
implements OsgiManager
         String pid = request.getParameter( ConfigManager.PID );
         if ( pid == null ) {
             String info = request.getPathInfo();
-            pid = WebConsoleUtil.urlDecode( info.substring( info.lastIndexOf( 
'/' ) + 1 ) );
+            pid = URLDecoder.decode( info.substring( info.lastIndexOf( '/' ) + 
1 ), StandardCharsets.UTF_8 );
         }
         // ignore this request if the PID is invalid / not provided
         if ( pid == null || pid.length() == 0 || 
!ConfigurationUtil.isAllowedPid(pid)) {
@@ -224,7 +226,7 @@ public class ConfigManager extends SimpleWebConsolePlugin 
implements OsgiManager
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     @Override
     protected void doGet( HttpServletRequest request, HttpServletResponse 
response )
@@ -351,7 +353,7 @@ public class ConfigManager extends SimpleWebConsolePlugin 
implements OsgiManager
     }
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     @Override
     protected void renderContent( HttpServletRequest request, 
HttpServletResponse response ) throws IOException
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java
index f3ae105e90..bb24b49500 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java
@@ -28,7 +28,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java
index 7c585b58e6..206e8c47a4 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java
@@ -52,13 +52,13 @@ import org.apache.felix.utils.json.JSONWriter;
 import org.apache.felix.utils.manifest.Clause;
 import org.apache.felix.utils.manifest.Parser;
 import org.apache.felix.webconsole.ConfigurationPrinter;
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.felix.webconsole.WebConsoleUtil;
 import org.apache.felix.webconsole.bundleinfo.BundleInfo;
 import org.apache.felix.webconsole.bundleinfo.BundleInfoProvider;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -147,7 +147,7 @@ public class BundlesServlet extends SimpleWebConsolePlugin 
implements OsgiManage
     }
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#activate(org.osgi.framework.BundleContext)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#activate(org.osgi.framework.BundleContext)
      */
     @Override
     public void activate( BundleContext bundleContext ) {
@@ -203,7 +203,7 @@ public class BundlesServlet extends SimpleWebConsolePlugin 
implements OsgiManage
 
 
     /**
-     * @see org.apache.felix.webconsole.SimpleWebConsolePlugin#deactivate()
+     * @see 
org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin#deactivate()
      */
     @Override
     public void deactivate()
@@ -322,7 +322,7 @@ public class BundlesServlet extends SimpleWebConsolePlugin 
implements OsgiManage
     //---------- BaseWebConsolePlugin
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     @Override
     protected void doGet( HttpServletRequest request, HttpServletResponse 
response ) throws ServletException,
@@ -516,7 +516,7 @@ public class BundlesServlet extends SimpleWebConsolePlugin 
implements OsgiManage
     }
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     @Override
     protected void renderContent( HttpServletRequest request, 
HttpServletResponse response ) throws IOException
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java
index 6801df2f6c..fb5a135349 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java
@@ -22,7 +22,7 @@ package org.apache.felix.webconsole.internal.core;
 import java.io.File;
 import java.io.InputStream;
 
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
index 284f3bcda1..e5aa362dff 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
@@ -30,12 +30,12 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.felix.utils.json.JSONWriter;
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.felix.webconsole.WebConsoleUtil;
 import org.apache.felix.webconsole.bundleinfo.BundleInfoProvider;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -377,7 +377,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jalarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jalarta.servlet.http.HttpServletResponse)
      */
     protected void doGet( HttpServletRequest request, HttpServletResponse 
response ) throws ServletException,
     IOException
@@ -404,7 +404,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     protected void renderContent( HttpServletRequest request, 
HttpServletResponse response ) throws IOException
     {
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java
index c9616a4dd6..7d052a751d 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java
@@ -23,7 +23,7 @@ import java.io.File;
 import java.io.InputStream;
 
 import org.apache.felix.bundlerepository.Reason;
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/filter/FilteringResponseWrapper.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/filter/FilteringResponseWrapper.java
index e262be2954..899ddef4dc 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/filter/FilteringResponseWrapper.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/filter/FilteringResponseWrapper.java
@@ -27,7 +27,7 @@ import jakarta.servlet.ServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpServletResponseWrapper;
 
-import org.apache.felix.webconsole.WebConsoleUtil;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 
 
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ConfigurationRender.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ConfigurationRender.java
index ac3aed49ed..9cdb380c8d 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ConfigurationRender.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ConfigurationRender.java
@@ -19,7 +19,7 @@ package org.apache.felix.webconsole.internal.misc;
 
 import java.io.PrintWriter;
 
-import org.apache.felix.webconsole.WebConsoleUtil;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 
 
 public class ConfigurationRender
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java
index 639abf2c3d..869ae3b782 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java
@@ -42,10 +42,10 @@ import jakarta.servlet.http.HttpServletResponse;
 import org.apache.felix.utils.json.JSONWriter;
 import org.apache.felix.utils.manifest.Clause;
 import org.apache.felix.utils.manifest.Parser;
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
-import org.apache.felix.webconsole.WebConsoleUtil;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 import org.osgi.framework.Bundle;
 
@@ -86,7 +86,7 @@ public final class LicenseServlet extends 
SimpleWebConsolePlugin implements Osgi
     }
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#doGet(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     protected void doGet(HttpServletRequest request, HttpServletResponse 
response)
             throws ServletException, IOException
@@ -107,7 +107,7 @@ public final class LicenseServlet extends 
SimpleWebConsolePlugin implements Osgi
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     protected void renderContent( HttpServletRequest request, 
HttpServletResponse res ) throws IOException
     {
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/AbstractWebConsolePlugin.java
similarity index 93%
rename from 
webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
rename to 
webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/AbstractWebConsolePlugin.java
index 097cf31625..fffdf69d08 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/AbstractWebConsolePlugin.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.webconsole;
+package org.apache.felix.webconsole.internal.servlet;
 
 
 import java.io.IOException;
@@ -44,7 +44,10 @@ import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
-import org.apache.felix.webconsole.internal.servlet.OsgiManager;
+import org.apache.felix.webconsole.BrandingPlugin;
+import org.apache.felix.webconsole.DefaultBrandingPlugin;
+import org.apache.felix.webconsole.WebConsoleConstants;
+import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.log.LogService;
@@ -77,7 +80,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
      *
      *  @see #getResourceProvider()
      */
-    public static final String GET_RESOURCE_METHOD_NAME = "getResource"; 
//$NON-NLS-1$
+    public static final String GET_RESOURCE_METHOD_NAME = "getResource";
 
     /**
      * The header fragment read from the templates/main_header.html file
@@ -182,9 +185,9 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
                 renderTopNavigation( request, pw );
 
                 // wrap content in a separate div
-                pw.println( "<div id='content'>" ); //$NON-NLS-1$
+                pw.println( "<div id='content'>" );
                 renderContent( request, response );
-                pw.println( "</div>" ); //$NON-NLS-1$
+                pw.println( "</div>" );
 
                 // close the main div, body, and html
                 endResponse( pw );
@@ -565,7 +568,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
                 long lastModified = connection.getLastModified();
                 if ( lastModified > 0 )
                 {
-                    long ifModifiedSince = request.getDateHeader( 
"If-Modified-Since" ); //$NON-NLS-1$
+                    long ifModifiedSince = request.getDateHeader( 
"If-Modified-Since" );
                     if ( ifModifiedSince >= ( lastModified / 1000 * 1000 ) )
                     {
                         // Round down to the nearest second for a proper 
compare
@@ -576,12 +579,12 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
                     }
 
                     // have to send, so set the last modified header now
-                    response.setDateHeader( "Last-Modified", lastModified ); 
//$NON-NLS-1$
+                    response.setDateHeader( "Last-Modified", lastModified );
                 }
 
                 // describe the contents
                 response.setContentType( getServletContext().getMimeType( pi ) 
);
-                response.setIntHeader( "Content-Length", 
connection.getContentLength() ); //$NON-NLS-1$
+                response.setIntHeader( "Content-Length", 
connection.getContentLength() );
 
                 // spool the actual contents
                 OutputStream out = response.getOutputStream();
@@ -613,11 +616,10 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
      * @throws IOException on I/O error
      * @see #endResponse(PrintWriter)
      */
-    @SuppressWarnings({ "unchecked" })
     protected PrintWriter startResponse( HttpServletRequest request, 
HttpServletResponse response ) throws IOException
     {
-        response.setCharacterEncoding( "utf-8" ); //$NON-NLS-1$
-        response.setContentType( "text/html" ); //$NON-NLS-1$
+        response.setCharacterEncoding( "utf-8" );
+        response.setContentType( "text/html" );
 
         final PrintWriter pw = response.getWriter();
 
@@ -625,24 +627,21 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
 
         // support localization of the plugin title
         String title = getTitle();
-        if ( title.startsWith( "%" ) ) //$NON-NLS-1$
+        if ( title.startsWith( "%" ) )
         {
-            title = "${" + title.substring( 1 ) + "}"; //$NON-NLS-1$ 
//$NON-NLS-2$
+            title = "${" + title.substring( 1 ) + "}";
         }
 
-        VariableResolver resolver = 
WebConsoleUtil.getVariableResolver(request);
-        if (resolver instanceof DefaultVariableResolver) {
-            DefaultVariableResolver r = (DefaultVariableResolver) resolver;
-            r.put("head.title", title); //$NON-NLS-1$
-            r.put("head.label", getLabel()); //$NON-NLS-1$
-            r.put("head.cssLinks", getCssLinks(appRoot)); //$NON-NLS-1$
-            r.put("brand.name", brandingPlugin.getBrandName()); //$NON-NLS-1$
-            r.put("brand.product.url", brandingPlugin.getProductURL()); 
//$NON-NLS-1$
-            r.put("brand.product.name", brandingPlugin.getProductName()); 
//$NON-NLS-1$
-            r.put("brand.product.img", toUrl( 
brandingPlugin.getProductImage(), appRoot )); //$NON-NLS-1$
-            r.put("brand.favicon", toUrl( brandingPlugin.getFavIcon(), appRoot 
)); //$NON-NLS-1$
-            r.put("brand.css", toUrl( brandingPlugin.getMainStyleSheet(), 
appRoot )); //$NON-NLS-1$
-        }
+        RequestVariableResolver r = 
WebConsoleUtil.getRequestVariableResolver(request);
+        r.put("head.title", title);
+        r.put("head.label", getLabel());
+        r.put("head.cssLinks", getCssLinks(appRoot));
+        r.put("brand.name", brandingPlugin.getBrandName());
+        r.put("brand.product.url", brandingPlugin.getProductURL());
+        r.put("brand.product.name", brandingPlugin.getProductName());
+        r.put("brand.product.img", toUrl( brandingPlugin.getProductImage(), 
appRoot ));
+        r.put("brand.favicon", toUrl( brandingPlugin.getFavIcon(), appRoot ));
+        r.put("brand.css", toUrl( brandingPlugin.getMainStyleSheet(), appRoot 
));
         pw.println( getHeader() );
 
         return pw;
@@ -660,7 +659,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
     {
         // assume pathInfo to not be null, else this would not be called
         String current = request.getPathInfo();
-        int slash = current.indexOf( "/", 1 ); //$NON-NLS-1$
+        int slash = current.indexOf( "/", 1 );
         if ( slash < 0 )
         {
             slash = current.length();
@@ -688,14 +687,14 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
             }
             if (!langMap.containsKey(locale))
             {
-                locale = "en"; //$NON-NLS-1$
+                locale = "en";
             }
 
-            pw.println("<div id='langSelect'>"); //$NON-NLS-1$
-            pw.println(" <span>"); //$NON-NLS-1$
+            pw.println("<div id='langSelect'>");
+            pw.println(" <span>");
             printLocaleElement(pw, appRoot, locale, langMap.get(locale));
-            pw.println(" </span>"); //$NON-NLS-1$
-            pw.println(" <span class='flags ui-helper-hidden'>"); //$NON-NLS-1$
+            pw.println(" </span>");
+            pw.println(" <span class='flags ui-helper-hidden'>");
             for (Iterator li = langMap.keySet().iterator(); li.hasNext();)
             {
                 // <img src="us.gif" alt="en" title="English"/>
@@ -706,8 +705,8 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
                 }
             }
 
-            pw.println(" </span>"); //$NON-NLS-1$
-            pw.println("</div>"); //$NON-NLS-1$
+            pw.println(" </span>");
+            pw.println("</div>");
         }
     }
 
@@ -759,15 +758,15 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
 
     private static final void printLocaleElement( PrintWriter pw, String 
appRoot, Object langCode, Object langName )
     {
-        pw.print("  <img src='"); //$NON-NLS-1$
+        pw.print("  <img src='");
         pw.print(appRoot);
-        pw.print("/res/flags/"); //$NON-NLS-1$
+        pw.print("/res/flags/");
         pw.print(langCode);
-        pw.print(".gif' alt='"); //$NON-NLS-1$
+        pw.print(".gif' alt='");
         pw.print(langCode);
-        pw.print("' title='"); //$NON-NLS-1$
+        pw.print("' title='");
         pw.print(langName);
-        pw.println("'/>"); //$NON-NLS-1$
+        pw.println("'/>");
     }
 
     /**
@@ -841,7 +840,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
         //    (for example plugin provided CSS links)
         if ( HEADER == null )
         {
-            HEADER = readTemplateFile( AbstractWebConsolePlugin.class, 
"/templates/main_header.html" ); //$NON-NLS-1$
+            HEADER = readTemplateFile( AbstractWebConsolePlugin.class, 
"/templates/main_header.html" );
         }
         return HEADER;
     }
@@ -851,7 +850,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
     {
         if ( FOOTER == null )
         {
-            FOOTER = readTemplateFile( AbstractWebConsolePlugin.class, 
"/templates/main_footer.html" ); //$NON-NLS-1$
+            FOOTER = readTemplateFile( AbstractWebConsolePlugin.class, 
"/templates/main_footer.html" );
         }
         return FOOTER;
     }
@@ -903,12 +902,12 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
         catch ( IOException e )
         {
             // don't use new Exception(message, cause) because cause is 1.4+
-            throw new RuntimeException( "readTemplateFile: Error loading " + 
templateFile + ": " + e ); //$NON-NLS-1$ //$NON-NLS-2$
+            throw new RuntimeException( "readTemplateFile: Error loading " + 
templateFile + ": " + e ); //$NON-NLS-2$
         }
 
         // template file does not exist, return an empty string
-        log( LogService.LOG_ERROR, "readTemplateFile: File '" + templateFile + 
"' not found through class " + clazz ); //$NON-NLS-1$ //$NON-NLS-2$
-        return ""; //$NON-NLS-1$
+        log( LogService.LOG_ERROR, "readTemplateFile: File '" + templateFile + 
"' not found through class " + clazz ); //$NON-NLS-2$
+        return "";
     }
 
 
@@ -918,16 +917,16 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
         final String[] cssRefs = getCssReferences();
         if ( cssRefs == null )
         {
-            return ""; //$NON-NLS-1$
+            return "";
         }
 
         // build the CSS links from the references
         final StringBuilder buf = new StringBuilder();
         for ( int i = 0; i < cssRefs.length; i++ )
         {
-            buf.append( "<link href='" ); //$NON-NLS-1$
+            buf.append( "<link href='" );
             buf.append( toUrl( cssRefs[i], appRoot ) );
-            buf.append( "' rel='stylesheet' type='text/css' />" ); 
//$NON-NLS-1$
+            buf.append( "' rel='stylesheet' type='text/css' />" );
         }
 
         return buf.toString();
@@ -948,7 +947,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet
      */
     private static final String toUrl( final String url, final String appRoot )
     {
-        if ( url.startsWith( "/" ) ) //$NON-NLS-1$
+        if ( url.startsWith( "/" ) )
         {
             return appRoot + url;
         }
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/JakartaServletAdapter.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/JakartaServletAdapter.java
index a4c1d1d86d..73dc625749 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/JakartaServletAdapter.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/JakartaServletAdapter.java
@@ -22,21 +22,17 @@ package org.apache.felix.webconsole.internal.servlet;
 import java.io.IOException;
 import java.util.*;
 
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.felix.http.jakartawrappers.HttpServletRequestWrapper;
-import org.apache.felix.http.jakartawrappers.HttpServletResponseWrapper;
-import org.apache.felix.http.jakartawrappers.ServletConfigWrapper;
-import org.apache.felix.http.javaxwrappers.ServletExceptionUtil;
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.servlet.AbstractServlet;
 import org.apache.felix.webconsole.servlet.ServletConstants;
 import org.osgi.framework.ServiceReference;
 
+import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponseWrapper;
+
 /**
  * The <code>JakartaServletAdapter</code> is an adapter to the
  * {@link AbstractWebConsolePlugin} for regular servlets registered with the
@@ -98,12 +94,7 @@ public class JakartaServletAdapter extends 
AbstractWebConsolePlugin {
     @Override
     protected void renderContent( final HttpServletRequest req, final 
HttpServletResponse res )
     throws ServletException, IOException {
-        try {
-            plugin.renderContent( 
(jakarta.servlet.http.HttpServletRequest)HttpServletRequestWrapper.getWrapper(req),
 
-                
(jakarta.servlet.http.HttpServletResponse)HttpServletResponseWrapper.getWrapper(res)
 );
-        } catch (final jakarta.servlet.ServletException s) {
-            throw ServletExceptionUtil.getServletException(s);
-        }
+        plugin.renderContent(req, res); 
     }
 
     /**
@@ -111,9 +102,9 @@ public class JakartaServletAdapter extends 
AbstractWebConsolePlugin {
      * <code>getResource()</code> method on that object for this plugin to
      * provide additional resources.
      *
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#getResourceProvider()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getResourceProvider()
      */
-    protected Object getResourceProvider() {
+    public Object getResourceProvider() {
         return plugin;
     }
 
@@ -133,11 +124,7 @@ public class JakartaServletAdapter extends 
AbstractWebConsolePlugin {
             super.init( config );
 
             // plugin initialization
-            try {
-                plugin.init( new ServletConfigWrapper(config) );
-            } catch ( final jakarta.servlet.ServletException s) {
-                throw ServletExceptionUtil.getServletException(s);
-            }
+            plugin.init( config );
         } catch ( ServletException se ) {
             // if init fails, the plugin will not be destroyed and thus
             // the plugin not deactivated. Do it here
@@ -189,10 +176,9 @@ public class JakartaServletAdapter extends 
AbstractWebConsolePlugin {
             super.setStatus(sc);
         }
 
-        @Override
         public void setStatus(final int sc, final String sm) {
             this.done = true;
-            super.setStatus(sc, sm);
+            super.setStatus(sc);
         }        
     }
 
@@ -209,12 +195,7 @@ public class JakartaServletAdapter extends 
AbstractWebConsolePlugin {
     throws ServletException, IOException {
         final CheckHttpServletResponse checkResponse = new 
CheckHttpServletResponse(resp);
         // call plugin first
-        try {
-            plugin.service( 
(jakarta.servlet.http.HttpServletRequest)HttpServletRequestWrapper.getWrapper(req),
 
-                
(jakarta.servlet.http.HttpServletResponse)HttpServletResponseWrapper.getWrapper(resp)
 );
-        } catch (final jakarta.servlet.ServletException s) {
-            throw ServletExceptionUtil.getServletException(s);
-        }
+        plugin.service(req, resp); 
         // if a GET request and plugin did not create a response yet, call 
super to get full HTML response
         if ( !checkResponse.isDone() && req.getMethod().equals( "GET" ) ) {
             // handle the GET request here and call into plugin on 
renderContent
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/JakartaServletTracker.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/JakartaServletTracker.java
deleted file mode 100755
index b0e1a140a1..0000000000
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/JakartaServletTracker.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.webconsole.internal.servlet;
-
-
-import java.io.Closeable;
-
-import org.apache.felix.http.javaxwrappers.ServletWrapper;
-import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.felix.webconsole.internal.Util;
-import org.apache.felix.webconsole.internal.servlet.Plugin.ServletPlugin;
-import org.apache.felix.webconsole.servlet.AbstractServlet;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-
-import jakarta.servlet.Servlet;
-
-public class JakartaServletTracker implements Closeable, 
ServiceTrackerCustomizer<Servlet, JakartaServletTracker.JakartaServletPlugin> {
-
-    private final ServiceTracker<Servlet, JakartaServletPlugin> servletTracker;
-
-    private final PluginHolder pluginHolder;
-
-    public JakartaServletTracker( final PluginHolder pluginHolder, final 
BundleContext context ) {
-        this.pluginHolder = pluginHolder;
-        Filter filter = null;
-        try {
-            filter = context.createFilter("(&(" + Constants.OBJECTCLASS + "=" 
+ Servlet.class.getName() + 
-                ")(" + WebConsoleConstants.PLUGIN_LABEL + "=*))");
-        } catch (final InvalidSyntaxException e) {
-            // not expected, thus fail hard
-            throw new InternalError( "Failed creating filter: " + 
e.getMessage() );
-        }
-        this.servletTracker = new ServiceTracker<>(context, filter, this);
-        servletTracker.open();
-    }
-
-    @Override
-    public void close() {
-        servletTracker.close();
-    }
-
-    @Override
-    public JakartaServletPlugin addingService( final 
org.osgi.framework.ServiceReference<Servlet> reference ) {
-        final String label = Util.getStringProperty( reference, 
WebConsoleConstants.PLUGIN_LABEL );
-        if ( label != null ) {
-            final JakartaServletPlugin plugin = new 
JakartaServletPlugin(this.pluginHolder, reference, label);
-            pluginHolder.addPlugin(plugin);
-            return plugin;
-        }
-        return null;
-    }
-
-    @Override
-    public void modifiedService( final 
org.osgi.framework.ServiceReference<Servlet> reference, final 
JakartaServletPlugin service ) {
-        this.removedService(reference, service);
-        this.addingService(reference);
-    }
-
-    @Override
-    public void removedService( final 
org.osgi.framework.ServiceReference<Servlet> reference, final 
JakartaServletPlugin service ) {
-        this.pluginHolder.removePlugin(service);
-    }
-
-    public static class JakartaServletPlugin extends ServletPlugin {
-            
-        @SuppressWarnings({"unchecked", "rawtypes"})
-        public JakartaServletPlugin(PluginHolder holder, 
ServiceReference<jakarta.servlet.Servlet> serviceReference,
-                String label) {
-            super(holder, (ServiceReference)serviceReference, label);
-        }
-
-        @SuppressWarnings({"unchecked", "rawtypes"})
-        protected javax.servlet.Servlet getService() {
-            final Servlet servlet = (Servlet) 
getHolder().getBundleContext().getService( 
(ServiceReference)this.getServiceReference() );
-            if (servlet != null) {
-                if ( servlet instanceof AbstractServlet ) {
-                    return new JakartaServletAdapter((AbstractServlet)servlet, 
this.getServiceReference());
-                }
-                return new ServletWrapper(servlet);
-            }
-            return null;
-        }
-    }
-}
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
index ea763fe8e1..522dc9b38c 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
@@ -39,14 +39,12 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListSet;
 
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.BrandingPlugin;
 import org.apache.felix.webconsole.User;
 import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.felix.webconsole.WebConsoleSecurityProvider;
 import org.apache.felix.webconsole.WebConsoleSecurityProvider2;
 import org.apache.felix.webconsole.WebConsoleSecurityProvider3;
-import org.apache.felix.webconsole.WebConsoleUtil;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
 import org.apache.felix.webconsole.internal.core.BundlesServlet;
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/Plugin.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/Plugin.java
index c9c5e32ef7..815c557b28 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/Plugin.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/Plugin.java
@@ -22,11 +22,11 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.NoSuchElementException;
 
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
 import org.apache.felix.webconsole.internal.WebConsolePluginAdapter;
+import org.apache.felix.webconsole.servlet.AbstractServlet;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -199,10 +199,13 @@ public abstract class Plugin implements ServletConfig, 
Comparable<Plugin> {
         }
 
         protected AbstractWebConsolePlugin doGetConsolePlugin() {
-            final Servlet service = getService();
+            Servlet service = getService();
             if ( service != null ) {
                 this.title = Util.getStringProperty( 
this.getServiceReference(), WebConsoleConstants.PLUGIN_TITLE );
                 this.category = Util.getStringProperty( 
this.getServiceReference(), WebConsoleConstants.PLUGIN_CATEGORY );
+                if ( service instanceof AbstractServlet ) {
+                    service = new 
JakartaServletAdapter((AbstractServlet)service, this.getServiceReference());
+                }
                 final AbstractWebConsolePlugin servlet;
                 if ( service instanceof AbstractWebConsolePlugin ) {
                     servlet = ( AbstractWebConsolePlugin ) service;
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java
index f4671525c9..0e22c614f1 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java
@@ -18,8 +18,6 @@
  */
 package org.apache.felix.webconsole.internal.servlet;
 
-import java.io.Closeable;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -28,7 +26,6 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.ResourceBundle;
 
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.felix.webconsole.internal.Util;
 import org.apache.felix.webconsole.internal.i18n.ResourceBundleManager;
@@ -69,8 +66,6 @@ class PluginHolder implements 
ServiceTrackerCustomizer<Servlet, Plugin> {
 
     private final ServiceTracker<Servlet, Plugin> servletTracker;
 
-    private volatile Closeable jakartaTracker;
-
     PluginHolder( final OsgiManager osgiManager, final BundleContext context ) 
{
         this.osgiManager = osgiManager;
         this.bundleContext = context;
@@ -95,13 +90,6 @@ class PluginHolder implements 
ServiceTrackerCustomizer<Servlet, Plugin> {
      */
     void open() {
         this.servletTracker.open();
-        try {
-            this.jakartaTracker = new JakartaServletTracker(this, 
this.getBundleContext());
-            this.osgiManager.log(LogService.LOG_INFO, "Jakarta Servlet bridge 
enabled");
-        } catch ( final Throwable t) {
-            // ignore
-            this.osgiManager.log(LogService.LOG_INFO, "Jakarta Servlet bridge 
not enabled");
-        }
     }
 
     /**
@@ -110,14 +98,6 @@ class PluginHolder implements 
ServiceTrackerCustomizer<Servlet, Plugin> {
      * held plugin services.
      */
     void close() {
-        if (this.jakartaTracker != null) {
-            try {
-                this.jakartaTracker.close();
-            } catch (final IOException e) {
-                // ignore
-            }
-            this.jakartaTracker = null;
-        }
         this.servletTracker.close();
 
         this.plugins.clear();
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/SimpleWebConsolePlugin.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/SimpleWebConsolePlugin.java
similarity index 92%
rename from 
webconsole/src/main/java/org/apache/felix/webconsole/SimpleWebConsolePlugin.java
rename to 
webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/SimpleWebConsolePlugin.java
index ead43171a3..fc3be5b0eb 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/SimpleWebConsolePlugin.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/SimpleWebConsolePlugin.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.webconsole;
+package org.apache.felix.webconsole.internal.servlet;
 
 
 import java.net.URL;
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.ResourceBundle;
 
 import org.apache.felix.webconsole.i18n.LocalizationHelper;
+import org.apache.felix.webconsole.servlet.ServletConstants;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -155,7 +156,7 @@ public abstract class SimpleWebConsolePlugin extends 
AbstractWebConsolePlugin
     }
 
     /**
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getLabel()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getLabel()
      */
     public final String getLabel()
     {
@@ -164,7 +165,7 @@ public abstract class SimpleWebConsolePlugin extends 
AbstractWebConsolePlugin
 
 
     /**
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getTitle()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getTitle()
      */
     public final String getTitle()
     {
@@ -173,7 +174,7 @@ public abstract class SimpleWebConsolePlugin extends 
AbstractWebConsolePlugin
 
 
     /**
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getCategory()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getCategory()
      */
     public String getCategory()
     {
@@ -182,7 +183,7 @@ public abstract class SimpleWebConsolePlugin extends 
AbstractWebConsolePlugin
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#getCssReferences()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#getCssReferences()
      */
     protected final String[] getCssReferences()
     {
@@ -225,10 +226,10 @@ public abstract class SimpleWebConsolePlugin extends 
AbstractWebConsolePlugin
             activate( bc ); // don't know why this is needed!
 
             final Dictionary<String, Object> props = new Hashtable<>();
-            props.put( WebConsoleConstants.PLUGIN_LABEL, getLabel() );
-            props.put( WebConsoleConstants.PLUGIN_TITLE, getTitle() );
+            props.put( ServletConstants.PLUGIN_LABEL, getLabel() );
+            props.put( ServletConstants.PLUGIN_TITLE, getTitle() );
             if ( getCategory() != null ) {
-                props.put( WebConsoleConstants.PLUGIN_CATEGORY, getCategory() 
);
+                props.put( ServletConstants.PLUGIN_CATEGORY, getCategory() );
             }
             reg = bc.registerService( Servlet.class, this, props ); 
//$NON-NLS-1$
         }
@@ -302,7 +303,7 @@ public abstract class SimpleWebConsolePlugin extends 
AbstractWebConsolePlugin
      * {@link #getService(String)} method. If you override this method, don't
      * forget to call the super.
      *
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#deactivate()
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#deactivate()
      */
     public void deactivate() {
         for ( Iterator<ServiceTracker<?, ?>> ti = 
services.values().iterator(); ti.hasNext(); ) {
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/WebConsoleUtil.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/WebConsoleUtil.java
new file mode 100755
index 0000000000..60a8e25aaf
--- /dev/null
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/WebConsoleUtil.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.webconsole.internal.servlet;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+
+import org.apache.felix.webconsole.servlet.RequestVariableResolver;
+
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+
+/**
+ * The <code>WebConsoleUtil</code> provides various utility methods for use
+ * by Web Console plugins.
+ */
+public final class WebConsoleUtil
+{
+
+    private WebConsoleUtil()
+    {
+        /* no instantiation */
+    }
+
+    /**
+     * Utility method to handle relative redirects.
+     * Some application servers like Web Sphere handle relative redirects 
differently
+     * therefore we should make an absolute URL before invoking send redirect.
+     *
+     * @param request the HTTP request coming from the user
+     * @param response the HTTP response, where data is rendered
+     * @param redirectUrl the redirect URI.
+     * @throws IOException If an input or output exception occurs
+     * @throws IllegalStateException   If the response was committed or if a 
partial
+     *  URL is given and cannot be converted into a valid URL
+     */
+    public static final void sendRedirect(final HttpServletRequest request,
+            final HttpServletResponse response,
+            String redirectUrl) throws IOException {
+        // check for relative URL
+        if ( !redirectUrl.startsWith("/") ) { //$NON-NLS-1$
+            String base = request.getContextPath() + request.getServletPath() 
+ request.getPathInfo();
+            int i = base.lastIndexOf('/');
+            if (i > -1) {
+                base = base.substring(0, i);
+            } else {
+                i = base.indexOf(':');
+                base = (i > -1) ? base.substring(i + 1, base.length()) : ""; 
//$NON-NLS-1$
+            }
+            if (!base.startsWith("/")) { //$NON-NLS-1$
+                base = '/' + base;
+            }
+            redirectUrl = base + '/' + redirectUrl;
+
+        }
+        response.sendRedirect(redirectUrl);
+    }
+
+    /**
+     * Sets response headers to force the client to not cache the response
+     * sent back. This method must be called before the response is committed
+     * otherwise it will have no effect.
+     * <p>
+     * This method sets the <code>Cache-Control</code>, <code>Expires</code>,
+     * and <code>Pragma</code> headers.
+     *
+     * @param response The response for which to set the cache prevention
+     */
+    public static final void setNoCache(final HttpServletResponse response) {
+        response.setHeader("Cache-Control", "no-cache"); //$NON-NLS-1$ 
//$NON-NLS-2$
+        response.addHeader("Cache-Control", "no-store"); //$NON-NLS-1$ 
//$NON-NLS-2$
+        response.addHeader("Cache-Control", "must-revalidate"); //$NON-NLS-1$ 
//$NON-NLS-2$
+        response.addHeader("Cache-Control", "max-age=0"); //$NON-NLS-1$ 
//$NON-NLS-2$
+        response.setHeader("Expires", "Thu, 01 Jan 1970 01:00:00 GMT"); 
//$NON-NLS-1$ //$NON-NLS-2$
+        response.setHeader("Pragma", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+    /**
+     * Retrieves a request parameter and converts it to int.
+     *
+     * @param request the HTTP request
+     * @param name the name of the request parameter
+     * @param _default the default value returned if the parameter is not set 
or is not a valid integer.
+     * @return the request parameter if set and is valid integer, or the 
default value
+     */
+    public static final int getParameterInt(HttpServletRequest request, String 
name,
+            int _default)
+    {
+        int ret = _default;
+        String param = request.getParameter(name);
+        try
+        {
+            if (param != null)
+                ret = Integer.parseInt(param);
+        }
+        catch (NumberFormatException nfe)
+        {
+            // don't care, will return default
+        }
+
+        return ret;
+    }
+
+    public static RequestVariableResolver getRequestVariableResolver( final 
ServletRequest request) {
+        return (RequestVariableResolver) 
request.getAttribute(RequestVariableResolver.REQUEST_ATTRIBUTE);
+    }
+
+
+    /**
+     * This method will stringify a Java object. It is mostly used to print 
the values
+     * of unknown properties. This method will correctly handle if the passed 
object
+     * is array and will property display it.
+     *
+     * If the value is byte[] the elements are shown as Hex
+     *
+     * @param value the value to convert
+     * @return the string representation of the value
+     */
+    public static final String toString(Object value) {
+        if (value == null) {
+            return "n/a";
+        } else if (value.getClass().isArray()) {
+            final StringBuilder sb = new StringBuilder();
+            int len = Array.getLength(value);
+            sb.append('[');
+
+            for(int i = 0; i < len; ++i) {
+                final Object element = Array.get(value, i);
+                if (element instanceof Byte) {
+                    sb.append("0x");
+                    final String x = 
Integer.toHexString(((Byte)element).intValue() & 255);
+                    if (1 == x.length()) {
+                        sb.append('0');
+                    }
+
+                    sb.append(x);
+                } else {
+                    sb.append(toString(element));
+                }
+
+                if (i < len - 1) {
+                    sb.append(", ");
+                }
+            }
+
+            return sb.append(']').toString();
+        } else {
+            return value.toString();
+        }
+     }
+}
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/system/VMStatPlugin.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/system/VMStatPlugin.java
index 2f48a2c7d6..25929bfd0a 100755
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/system/VMStatPlugin.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/system/VMStatPlugin.java
@@ -31,11 +31,11 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.felix.utils.json.JSONWriter;
-import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.felix.webconsole.WebConsoleUtil;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.servlet.OsgiManager;
+import org.apache.felix.webconsole.internal.servlet.SimpleWebConsolePlugin;
+import org.apache.felix.webconsole.internal.servlet.WebConsoleUtil;
 import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
@@ -169,7 +169,7 @@ public class VMStatPlugin extends SimpleWebConsolePlugin 
implements OsgiManagerP
 
 
     /**
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
+     * @see 
org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin#renderContent(jakarta.servlet.http.HttpServletRequest,
 jakarta.servlet.http.HttpServletResponse)
      */
     protected void renderContent( HttpServletRequest request, 
HttpServletResponse response ) throws IOException
     {
diff --git 
a/webconsole/src/test/java/org/apache/felix/webconsole/AbstractWebConsolePluginTest.java
 
b/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/AbstractWebConsolePluginTest.java
similarity index 97%
rename from 
webconsole/src/test/java/org/apache/felix/webconsole/AbstractWebConsolePluginTest.java
rename to 
webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/AbstractWebConsolePluginTest.java
index f69505e82e..b29c370b65 100755
--- 
a/webconsole/src/test/java/org/apache/felix/webconsole/AbstractWebConsolePluginTest.java
+++ 
b/webconsole/src/test/java/org/apache/felix/webconsole/internal/servlet/AbstractWebConsolePluginTest.java
@@ -16,12 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.webconsole;
+package org.apache.felix.webconsole.internal.servlet;
 
 
 import java.lang.reflect.Method;
 import java.net.URL;
 
+import org.apache.felix.webconsole.internal.servlet.AbstractWebConsolePlugin;
+
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 

Reply via email to