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

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


The following commit(s) were added to refs/heads/master by this push:
     new 190e7ebfee FELIX-6626 : Support jakarta servlet registration
190e7ebfee is described below

commit 190e7ebfee0256fc535d789451a200f4faf0db29
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Mon Aug 21 12:41:07 2023 +0200

    FELIX-6626 : Support jakarta servlet registration
---
 webconsole/pom.xml                                 |  5 +++-
 .../felix/webconsole/AbstractWebConsolePlugin.java | 21 +++++----------
 .../webconsole/internal/core/ServicesServlet.java  | 31 +++++++++++-----------
 .../internal/filter/FilteringResponseWrapper.java  | 31 +++++++---------------
 .../internal/misc/SystemPropertiesPrinter.java     |  4 +--
 .../internal/servlet/JakartaServletAdapter.java    | 24 -----------------
 .../webconsole/internal/servlet/OsgiManager.java   | 10 ++++++-
 7 files changed, 48 insertions(+), 78 deletions(-)

diff --git a/webconsole/pom.xml b/webconsole/pom.xml
index 3a3258d334..7b3e7ed916 100644
--- a/webconsole/pom.xml
+++ b/webconsole/pom.xml
@@ -42,6 +42,7 @@
             org.apache.felix.webconsole;provide:=true,
             org.apache.felix.webconsole.bundleinfo;provide:=true,
             org.apache.felix.webconsole.i18n;provide:=true,
+            org.apache.felix.webconsole.servlet,
             org.apache.felix.webconsole.spi
        </webconsole.exports>
     </properties>
@@ -118,6 +119,7 @@
                             javax.servlet.*;version="[3,5)",
                             !javax.portlet,
                             !jakarta.servlet,
+                            !jakarta.servlet.http,
                             !org.apache.felix.http.javaxwrappers,
                             !org.apache.felix.bundlerepository,
                             !org.osgi.service.obr,
@@ -141,7 +143,8 @@
                             org.osgi.service.permissionadmin;version="[1.2,2)",
                             org.osgi.service.prefs;version="[1.1,2)",
                             org.osgi.service.wireadmin;version="[1.0,2)",
-                            jakarta.servlet;version="[1,2)",
+                            jakarta.servlet;version="[5,6)",
+                            jakarta.servlet.http;version="[5,6)",
                             org.apache.felix.http.javaxwrappers;version="[4,6)"
                         </DynamicImport-Package>
                         <Embed-Dependency>
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
index 374d6f305f..4592249c36 100644
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
@@ -193,14 +193,11 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet {
      * @see 
javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
      *      javax.servlet.http.HttpServletResponse)
      */
-    protected void doGet( HttpServletRequest request, HttpServletResponse 
response ) throws ServletException,
-        IOException
-    {
-        if ( !spoolResource( request, response ) )
-        {
+    protected void doGet( HttpServletRequest request, HttpServletResponse 
response )
+    throws ServletException, IOException {
+        if ( !spoolResource( request, response ) ) {
             // detect if this is an html request
-            if ( isHtmlRequest(request) )
-            {
+            if ( isHtmlRequest(request) ) {
                 // start the html response, write the header, open body and 
main div
                 PrintWriter pw = startResponse( request, response );
 
@@ -214,9 +211,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet {
 
                 // close the main div, body, and html
                 endResponse( pw );
-            }
-            else
-            {
+            } else {
                 renderContent( request, response );
             }
         }
@@ -232,8 +227,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet {
      * @param request the original request passed from the HTTP server
      * @return <code>true</code> if the page should have headers and footers 
rendered
      */
-    protected boolean isHtmlRequest( final HttpServletRequest request )
-    {
+    protected boolean isHtmlRequest( final HttpServletRequest request ) {
         return true;
     }
 
@@ -649,8 +643,7 @@ public abstract class AbstractWebConsolePlugin extends 
HttpServlet {
 
         // support localization of the plugin title
         String title = getTitle();
-        if ( title.startsWith( "%" ) )
-        {
+        if ( title.startsWith( "%" ) ) {
             title = "${" + title.substring( 1 ) + "}";
         }
 
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 4aeea6b73f..4f872e30d4 100644
--- 
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
@@ -33,6 +33,7 @@ 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.servlet.RequestVariableResolver;
@@ -123,7 +124,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
         TEMPLATE = readTemplateFile( "/templates/services.html" ); 
//$NON-NLS-1$
     }
 
-    private ServiceRegistration bipReg;
+    private ServiceRegistration<BundleInfoProvider> bipReg;
 
     public void activate(BundleContext bundleContext)
     {
@@ -141,7 +142,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
     }
 
 
-    final ServiceReference getServiceById( String pathInfo )
+    final ServiceReference<?> getServiceById( String pathInfo )
     {
         // only use last part of the pathInfo
         pathInfo = pathInfo.substring( pathInfo.lastIndexOf( '/' ) + 1 );
@@ -152,7 +153,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
         String filterStr = filter.toString();
         try
         {
-            ServiceReference[] refs = 
BundleContextUtil.getWorkingBundleContext(this.getBundleContext()).getAllServiceReferences(
 null, filterStr );
+            ServiceReference<?>[] refs = 
BundleContextUtil.getWorkingBundleContext(this.getBundleContext()).getAllServiceReferences(
 null, filterStr );
             if ( refs == null || refs.length != 1 )
             {
                 return null;
@@ -168,7 +169,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
     }
 
 
-    private final ServiceReference[] getServices(String filter)
+    private final ServiceReference<?>[] getServices(String filter)
     {
         // empty filter string will return nothing, must set it to null to 
return all services
         if (filter != null && filter.trim().length() == 0) {
@@ -176,7 +177,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
         }
         try
         {
-            final ServiceReference[] refs = 
BundleContextUtil.getWorkingBundleContext(this.getBundleContext()).getAllServiceReferences(
 null, filter );
+            final ServiceReference<?>[] refs = 
BundleContextUtil.getWorkingBundleContext(this.getBundleContext()).getAllServiceReferences(
 null, filter );
             if ( refs != null )
             {
                 return refs;
@@ -192,7 +193,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
     }
 
 
-    static final String getStatusLine( final ServiceReference[] services )
+    static final String getStatusLine( final ServiceReference<?>[] services )
     {
         final int count = services.length;
         final StringBuilder buffer = new StringBuilder();
@@ -205,14 +206,14 @@ public class ServicesServlet extends 
SimpleWebConsolePlugin implements OsgiManag
     }
 
 
-    static final String propertyAsString( ServiceReference ref, String name )
+    static final String propertyAsString( ServiceReference<?> ref, String name 
)
     {
         final Object value = ref.getProperty( name );
         return WebConsoleUtil.toString( value );
     }
 
 
-    private void renderJSON( final HttpServletResponse response, final 
ServiceReference service, final Locale locale )
+    private void renderJSON( final HttpServletResponse response, final 
ServiceReference<?> service, final Locale locale )
             throws IOException
     {
         response.setContentType( "application/json" );
@@ -233,7 +234,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
         }
     }
 
-    private void serviceDetails( JSONWriter jw, ServiceReference service ) 
throws IOException
+    private void serviceDetails( JSONWriter jw, ServiceReference<?> service ) 
throws IOException
     {
         String[] keys = service.getPropertyKeys();
 
@@ -267,7 +268,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
     }
 
 
-    private void usingBundles( JSONWriter jw, ServiceReference service, Locale 
locale ) throws IOException
+    private void usingBundles( JSONWriter jw, ServiceReference<?> service, 
Locale locale ) throws IOException
     {
         jw.key( "usingBundles" );
         jw.array();
@@ -288,7 +289,7 @@ public class ServicesServlet extends SimpleWebConsolePlugin 
implements OsgiManag
     }
 
 
-    private void serviceInfo( JSONWriter jw, ServiceReference service, boolean 
details, final Locale locale )
+    private void serviceInfo( JSONWriter jw, ServiceReference<?> service, 
boolean details, final Locale locale )
             throws IOException
     {
         jw.object();
@@ -334,19 +335,19 @@ public class ServicesServlet extends 
SimpleWebConsolePlugin implements OsgiManag
     }
 
 
-    private void writeJSON(final Writer pw, final ServiceReference service, 
final Locale locale, final String filter) throws IOException
+    private void writeJSON(final Writer pw, final ServiceReference<?> service, 
final Locale locale, final String filter) throws IOException
     {
         writeJSON( pw, service, false, locale, filter );
     }
 
 
-    private void writeJSON( final Writer pw, final ServiceReference service, 
final boolean fullDetails, final Locale locale, final String filter )
+    private void writeJSON( final Writer pw, final ServiceReference<?> 
service, final boolean fullDetails, final Locale locale, final String filter )
             throws IOException
     {
-        final ServiceReference[] allServices = this.getServices(filter);
+        final ServiceReference<?>[] allServices = this.getServices(filter);
         final String statusLine = getStatusLine( allServices );
 
-        final ServiceReference[] services = ( service != null ) ? new 
ServiceReference[]
+        final ServiceReference<?>[] services = ( service != null ) ? new 
ServiceReference[]
                 { service } : allServices;
 
                 final JSONWriter jw = new JSONWriter( pw );
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 6b6d41b279..6d27cc099c 100644
--- 
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
@@ -40,8 +40,7 @@ import 
org.apache.felix.webconsole.servlet.RequestVariableResolver;
  * exists in the resource bundle, the text is written unmodifed (except the
  * wrapping <code>${}</code> characters are removed.
  */
-public class FilteringResponseWrapper extends HttpServletResponseWrapper
-{
+public class FilteringResponseWrapper extends HttpServletResponseWrapper {
 
     // the resource bundle providing translations for the output
     private final ResourceBundle locale;
@@ -62,15 +61,14 @@ public class FilteringResponseWrapper extends 
HttpServletResponseWrapper
      * @param locale a resource bundle, that will be used for translation of 
the strings
      * @param request the original request - used to obtain the variable 
resolver
      */
-    public FilteringResponseWrapper( final HttpServletResponse response, final 
ResourceBundle locale,
-        final ServletRequest request )
-    {
+    public FilteringResponseWrapper( final HttpServletResponse response, 
+        final ResourceBundle locale,
+        final ServletRequest request ) {
         super( response );
         this.locale = locale;
         this.request = request;
     }
 
-
     /**
      * Returns a <code>PrintWriter</code> for the response. If 
<code>text/html</code>
      * is being generated a filtering writer is returned which translates
@@ -79,19 +77,14 @@ public class FilteringResponseWrapper extends 
HttpServletResponseWrapper
      *
      * @see javax.servlet.ServletResponseWrapper#getWriter()
      */
-    public PrintWriter getWriter() throws IOException
-    {
-        if ( writer == null )
-        {
+    public PrintWriter getWriter() throws IOException {
+        if ( writer == null ) {
             final PrintWriter base = super.getWriter();
-            if ( doWrap() )
-            {
+            if ( doWrap() ) {
                 final RequestVariableResolver vars = 
WebConsoleUtil.getRequestVariableResolver(request);
                 final ResourceFilteringWriter filter = new 
ResourceFilteringWriter( base, locale, vars );
                 writer = new PrintWriter( filter );
-            }
-            else
-            {
+            } else {
                 writer = base;
             }
         }
@@ -99,11 +92,7 @@ public class FilteringResponseWrapper extends 
HttpServletResponseWrapper
         return writer;
     }
 
-
-    private final boolean doWrap()
-    {
-        boolean doWrap = getContentType() != null && getContentType().indexOf( 
"text/html" ) >= 0;
-        return doWrap;
+    private final boolean doWrap() {
+        return getContentType() != null && getContentType().indexOf( 
"text/html" ) >= 0;
     }
-
 }
diff --git 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/SystemPropertiesPrinter.java
 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/SystemPropertiesPrinter.java
index 43183f7aba..acebddea91 100644
--- 
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/SystemPropertiesPrinter.java
+++ 
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/SystemPropertiesPrinter.java
@@ -32,6 +32,7 @@ public class SystemPropertiesPrinter extends 
AbstractConfigurationPrinter {
 
     private static final String TITLE = "System Properties";
 
+    @SuppressWarnings("unused")
     private static final String LABEL = "_systemproperties";
 
 
@@ -41,8 +42,7 @@ public class SystemPropertiesPrinter extends 
AbstractConfigurationPrinter {
     }
 
 
-    public void printConfiguration( PrintWriter printWriter )
-    {
+    public void printConfiguration( PrintWriter printWriter ) {
         Properties props = System.getProperties();
         SortedSet keys = new TreeSet( props.keySet() );
         for ( Iterator ki = keys.iterator(); ki.hasNext(); )
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 458d5d0498..a4c1d1d86d 100644
--- 
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
@@ -148,30 +148,6 @@ public class JakartaServletAdapter extends 
AbstractWebConsolePlugin {
         }
     }
 
-    /**
-     * Detects whether this request is intended to have the headers and
-     * footers of this plugin be rendered or not. The decision is taken based
-     * on whether and what extension the request URI has: If the request URI
-     * has no extension or the the extension is <code>.html</code>, the request
-     * is assumed to be rendered with header and footer. Otherwise the
-     * headers and footers are omitted and the
-     * {@link #renderContent(HttpServletRequest, HttpServletResponse)}
-     * method is called without any decorations and without setting any
-     * response headers.
-     *
-     * @see 
org.apache.felix.webconsole.AbstractWebConsolePlugin#isHtmlRequest(javax.servlet.http.HttpServletRequest)
-     */
-    protected boolean isHtmlRequest( final HttpServletRequest request ) {
-        final String requestUri = request.getRequestURI();
-        if ( requestUri.endsWith( ".html" ) ) {
-            return true;
-        }
-        // check if there is an extension
-        final int lastSlash = requestUri.lastIndexOf('/');
-        final int lastDot = requestUri.indexOf('.', lastSlash + 1);
-        return lastDot < 0;
-    }
-
     private static final class CheckHttpServletResponse extends 
HttpServletResponseWrapper {
 
         private boolean done = false;
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 3945fc4762..e1b2b549c7 100644
--- 
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
@@ -65,6 +65,7 @@ import 
org.apache.felix.webconsole.internal.core.BundlesServlet;
 import org.apache.felix.webconsole.internal.filter.FilteringResponseWrapper;
 import org.apache.felix.webconsole.internal.i18n.ResourceBundleManager;
 import org.apache.felix.webconsole.internal.servlet.Plugin.InternalPlugin;
+import org.apache.felix.webconsole.servlet.RequestVariableResolver;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -630,11 +631,18 @@ public class OsgiManager extends GenericServlet {
         response = wrapResponse(request, response, plugin);
 
         // make sure to set the variable resolver
-        WebConsoleUtil.getVariableResolver(request);
+        initRequestVariableResolver(request);
 
         plugin.service(request, response);
     }
 
+    private void initRequestVariableResolver(final HttpServletRequest request) 
{
+        final RequestVariableResolver resolver = new RequestVariableResolver();
+        request.setAttribute(RequestVariableResolver.REQUEST_ATTRIBUTE, 
resolver);
+        resolver.put( "appRoot", (String) request.getAttribute( 
WebConsoleConstants.ATTR_APP_ROOT ) );
+        resolver.put( "pluginRoot", (String) request.getAttribute( 
WebConsoleConstants.ATTR_PLUGIN_ROOT ) );
+    }
+
     private final void logout(HttpServletRequest request, HttpServletResponse 
response)
         throws IOException {
         final Object securityProvider = securityProviderTracker.getService();

Reply via email to