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: <>&\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("<"); //$NON-NLS-1$ - break; - case '>': - sb.append(">"); //$NON-NLS-1$ - break; - case '&': - sb.append("&"); //$NON-NLS-1$ - break; - case ' ': - sb.append(" "); //$NON-NLS-1$ - break; - case '\'': - sb.append("'"); //$NON-NLS-1$ - break; - case '"': - sb.append("""); //$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;
