diff options
author | Thomas Watson | 2019-05-15 19:51:15 +0000 |
---|---|---|
committer | Thomas Watson | 2019-05-15 20:52:05 +0000 |
commit | a81dff381261aa69c327637026d701f6f48d29ec (patch) | |
tree | 189b6d508eebef7c84de387c0ea5c7ba9698bbd9 | |
parent | 01c94e7419c45d92da9b8c012aea3d5d2c47452d (diff) | |
download | rt.equinox.bundles-a81dff381261aa69c327637026d701f6f48d29ec.tar.gz rt.equinox.bundles-a81dff381261aa69c327637026d701f6f48d29ec.tar.xz rt.equinox.bundles-a81dff381261aa69c327637026d701f6f48d29ec.zip |
Bug 547270 - [Http] Create and register a ServletContextHelper for theI20190515-1800
default HttpContext for each bundle
Change-Id: I0bea6492f7e8ef3649d619893b7cac9d5cdff096
Signed-off-by: Anjum Fatima <anjum.eclipse@gmail.com>
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
5 files changed, 48 insertions, 23 deletions
diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java index 304ab2324..4913da399 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java @@ -54,12 +54,7 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService { public synchronized HttpContext createDefaultHttpContext() { checkShutdown(); - DefaultServletContextHelper defaultServletContextHelper = bundle.getBundleContext().getService(httpServiceRuntime.defaultContextReg.getReference()); - HttpContextHolder httpContextHolder = new HttpContextHolder(defaultServletContextHelper, httpServiceRuntime.defaultContextReg); - httpContextHolder.incrementUseCount(); - httpServiceRuntime.legacyContextMap.putIfAbsent(defaultServletContextHelper, httpContextHolder); - - return defaultServletContextHelper; + return new DefaultServletContextHelper(bundle); } /** @@ -74,8 +69,8 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService { throws ServletException { checkShutdown(); - httpContext = httpContext == null ? createDefaultHttpContext() : registerContext(httpContext); - final HttpContextHolder httpContextHolder = httpServiceRuntime.legacyContextMap.get(httpContext); + + final HttpContextHolder httpContextHolder = getHttpContextHolder(httpContext); try { AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() { @Override @@ -91,6 +86,14 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService { } + private HttpContextHolder getHttpContextHolder(HttpContext httpContext) { + if (httpContext == null) { + httpContext = createDefaultHttpContext(); + } + registerContext(httpContext); + return httpServiceRuntime.legacyContextMap.get(httpContext); + } + /** * @throws NamespaceException * @see HttpService#registerResources(String, String, HttpContext) @@ -100,8 +103,7 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService { throws NamespaceException { checkShutdown(); - httpContext = httpContext == null ? createDefaultHttpContext() : registerContext(httpContext); - final HttpContextHolder httpContextHolder = httpServiceRuntime.legacyContextMap.get(httpContext); + final HttpContextHolder httpContextHolder = getHttpContextHolder(httpContext); try { AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() { @Override @@ -127,8 +129,7 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService { throws ServletException, NamespaceException { checkShutdown(); - httpContext = httpContext == null ? createDefaultHttpContext() : registerContext(httpContext); - final HttpContextHolder httpContextHolder = httpServiceRuntime.legacyContextMap.get(httpContext); + final HttpContextHolder httpContextHolder = getHttpContextHolder(httpContext); try { AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() { @Override @@ -183,7 +184,7 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService { HttpContextHolder httpContextHolder = httpServiceRuntime.legacyContextMap.get(httpContext); if (httpContextHolder == null) { - String legacyId = httpContext.getClass().getName().replaceAll("[^a-zA-Z_0-9\\-]", "_") + "-" + generateLegacyId(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + String legacyId= httpContext.getClass().getName().replaceAll("[^a-zA-Z_0-9\\-]", "_") + "-" + generateLegacyId(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HTTP_WHITEBOARD_CONTEXT_NAME, legacyId); props.put(HTTP_WHITEBOARD_CONTEXT_PATH, "/"); //$NON-NLS-1$ @@ -198,6 +199,8 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService { httpContextHolder.incrementUseCount(); httpServiceRuntime.legacyContextMap.put(httpContext, httpContextHolder); + } else { + httpContextHolder.incrementUseCount(); } return httpContext; diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java index ecd7b2c12..c0e9df3b0 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java @@ -57,7 +57,6 @@ public class HttpServiceRuntimeImpl HttpServiceRuntime, ServiceTrackerCustomizer<ServletContextHelper, AtomicReference<ContextController>> { - @SuppressWarnings("unchecked") public HttpServiceRuntimeImpl( BundleContext trackingContext, BundleContext consumingContext, ServletContext parentServletContext, Dictionary<String, Object> attributes) { @@ -110,9 +109,9 @@ public class HttpServiceRuntimeImpl defaultContextProps.put(Constants.SERVICE_RANKING, Integer.MIN_VALUE); defaultContextProps.put(HTTP_WHITEBOARD_CONTEXT_PATH, Const.SLASH); defaultContextProps.put(HTTP_WHITEBOARD_TARGET, this.targetFilter); - defaultContextProps.put(HTTP_SERVICE_CONTEXT_PROPERTY, HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME); - defaultContextReg = (ServiceRegistration<DefaultServletContextHelper>) consumingContext.registerService( - new String [] {ServletContextHelper.class.getName(), DefaultServletContextHelper.class.getName()}, new DefaultServletContextHelperFactory(), defaultContextProps); + defaultContextProps.put(Const.EQUINOX_HTTP_WHITEBOARD_CONTEXT_HELPER_DEFAULT, Boolean.TRUE); + defaultContextReg = consumingContext.registerService( + ServletContextHelper.class, new DefaultServletContextHelperFactory(), defaultContextProps); } public synchronized void open() { @@ -689,7 +688,8 @@ public class HttpServiceRuntimeImpl props.put(HTTP_WHITEBOARD_TARGET, targetFilter); props.put(HTTP_WHITEBOARD_FILTER_PATTERN, alias); props.put(HTTP_WHITEBOARD_FILTER_NAME, filterName); - props.put(HTTP_WHITEBOARD_CONTEXT_SELECT, getFilter(httpContextHolder.getServiceReference())); + props.put(HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + Const.EQUINOX_LEGACY_CONTEXT_HELPER + "=true)"); //$NON-NLS-1$ //$NON-NLS-2$ + props.put(Const.EQUINOX_LEGACY_CONTEXT_SELECT, getFilter(httpContextHolder.getServiceReference())); props.put(Const.EQUINOX_LEGACY_TCCL_PROP, Thread.currentThread().getContextClassLoader()); props.put(Constants.SERVICE_RANKING, findFilterPriority(initparams)); fillInitParams(props, initparams, HTTP_WHITEBOARD_FILTER_INIT_PARAM_PREFIX); @@ -700,7 +700,6 @@ public class HttpServiceRuntimeImpl // check that init got called and did not throw an exception filterFactory.checkForError(); - httpContextHolder.incrementUseCount(); objectRegistration = new HttpServiceObjectRegistration(filter, registration, httpContextHolder, bundle); Set<HttpServiceObjectRegistration> objectRegistrations = bundleRegistrations.get(bundle); @@ -802,7 +801,6 @@ public class HttpServiceRuntimeImpl props.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); props.put(Const.EQUINOX_LEGACY_TCCL_PROP, Thread.currentThread().getContextClassLoader()); registration = bundle.getBundleContext().registerService(String.class, "resource", props); //$NON-NLS-1$ - httpContextHolder.incrementUseCount(); objectRegistration = new HttpServiceObjectRegistration(fullAlias, registration, httpContextHolder, bundle); @@ -891,7 +889,6 @@ public class HttpServiceRuntimeImpl // check that init got called and did not throw an exception legacyServlet.checkForError(); - httpContextHolder.incrementUseCount(); objectRegistration = new HttpServiceObjectRegistration(fullAlias, registration, httpContextHolder, bundle); @@ -1284,7 +1281,7 @@ public class HttpServiceRuntimeImpl private final Map<String, Object> attributes; private final String targetFilter; - final ServiceRegistration<DefaultServletContextHelper> defaultContextReg; + final ServiceRegistration<ServletContextHelper> defaultContextReg; private final ServletContext parentServletContext; private final BundleContext trackingContext; private final BundleContext consumingContext; diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java index 7b131d7ac..093e2b888 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java @@ -905,6 +905,12 @@ public class ContextController { } private boolean visibleContextHelper(ServiceReference<?> whiteBoardService) { + if (consumingContext.getBundle().equals(serviceReference.getBundle())) { + Boolean defaultContextHelper = (Boolean) serviceReference.getProperty(Const.EQUINOX_HTTP_WHITEBOARD_CONTEXT_HELPER_DEFAULT); + if (defaultContextHelper == null) { + return true; + } + } try { if (whiteBoardService.getBundle().getBundleContext().getAllServiceReferences(ServletContextHelper.class.getName(), servletContextHelperRefFilter) != null) { return true; diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/registration/FilterRegistration.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/registration/FilterRegistration.java index e3e5dcd99..491305aa4 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/registration/FilterRegistration.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/registration/FilterRegistration.java @@ -25,6 +25,8 @@ import org.eclipse.equinox.http.servlet.internal.context.ServiceHolder; import org.eclipse.equinox.http.servlet.internal.servlet.FilterChainImpl; import org.eclipse.equinox.http.servlet.internal.servlet.Match; import org.eclipse.equinox.http.servlet.internal.util.Const; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.wiring.BundleWiring; import org.osgi.service.http.runtime.dto.FilterDTO; @@ -56,7 +58,22 @@ public class FilterRegistration } else { classLoader = filterHolder.getBundle().adapt(BundleWiring.class).getClassLoader(); } - initDestoyWithContextController = true; + String legacyContextFilter = (String) filterHolder.getServiceReference().getProperty(Const.EQUINOX_LEGACY_CONTEXT_SELECT); + if (legacyContextFilter != null) { + // This is a legacy Filter registration. + // This filter tells us the real context controller, + // backed by an HttpContext that should be used to init/destroy this Filter + org.osgi.framework.Filter f = null; + try { + f = FrameworkUtil.createFilter(legacyContextFilter); + } + catch (InvalidSyntaxException e) { + // nothing + } + initDestoyWithContextController = f == null || contextController.matches(f); + } else { + initDestoyWithContextController = true; + } needDecode = MatchableRegistration.patternsRequireDecode(filterDTO.patterns); } diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/util/Const.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/util/Const.java index 2a725ff97..95367b159 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/util/Const.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/util/Const.java @@ -48,8 +48,10 @@ public class Const { public static final String EQUINOX_HTTP_MULTIPART_MAXFILESIZE = "equinox.http.whiteboard.servlet.multipart.maxFileSize"; //$NON-NLS-1$ public static final String EQUINOX_HTTP_MULTIPART_MAXREQUESTSIZE = "equinox.http.whiteboard.servlet.multipart.maxRequestSize"; //$NON-NLS-1$ public static final String EQUINOX_LEGACY_TCCL_PROP = "equinox.legacy.tccl"; //$NON-NLS-1$ + public static final String EQUINOX_LEGACY_CONTEXT_SELECT = "equinox.context.select"; //$NON-NLS-1$ public static final String EQUINOX_LEGACY_CONTEXT_HELPER = "equinox.legacy.context.helper"; //$NON-NLS-1$ public static final String EQUINOX_LEGACY_HTTP_CONTEXT_INITIATING_ID = "equinox.legacy.http.context.initiating.id"; //$NON-NLS-1$ + public static final String EQUINOX_HTTP_WHITEBOARD_CONTEXT_HELPER_DEFAULT = "equinox.http.whiteboard.context.helper.default"; //$NON-NLS-1$ public static final String UTF8 = "UTF-8"; //$NON-NLS-1$ } |