[BROOKLYN-183] Provide access to management context in OSGi In order to keep both the monolithic launcher and have the OSGi launcher working we need a temporary solution that works both ways. This OSGi antipattern should be removed as soon as client code gets better.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/94de4642 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/94de4642 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/94de4642 Branch: refs/heads/master Commit: 94de46427eb84b97449456c02863fcd9ff164b7c Parents: cbb58ba Author: Ciprian Ciubotariu <cheepe...@gmx.net> Authored: Thu Nov 19 20:44:31 2015 +0200 Committer: Ciprian Ciubotariu <cheepe...@gmx.net> Committed: Thu Nov 19 20:44:31 2015 +0200 ---------------------------------------------------------------------- .../apache/brooklyn/util/core/osgi/Compat.java | 69 ++++++++++++++++++++ .../BrooklynJavascriptGuiLauncherTest.java | 5 +- .../BrooklynPropertiesSecurityFilter.java | 4 +- .../rest/filter/HaMasterCheckFilter.java | 4 +- .../resources/AbstractBrooklynRestResource.java | 4 +- .../apache/brooklyn/rest/util/OsgiCompat.java | 46 +++++++++++++ .../util/json/BrooklynJacksonJsonProvider.java | 6 +- .../brooklyn/rest/BrooklynRestApiLauncher.java | 4 +- .../BrooklynRestApiLauncherTestFixture.java | 4 +- 9 files changed, 129 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/core/src/main/java/org/apache/brooklyn/util/core/osgi/Compat.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/osgi/Compat.java b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Compat.java new file mode 100644 index 0000000..1f5d88b --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Compat.java @@ -0,0 +1,69 @@ +/* + * Copyright 2015 The Apache Software Foundation. + * + * Licensed 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.brooklyn.util.core.osgi; + +import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.util.tracker.ServiceTracker; + +/** + * Compatibility methods between karaf launcher and monolithic launcher. + * + * @todo Remove after transition to karaf launcher. + */ +public class Compat { + + /* synchronized by class initialization */ + private static class SingletonHolder { + + private static final Compat instance = new Compat(); + } + + public static Compat getInstance() { + return SingletonHolder.instance; + } + + private final ServiceTracker managementContextTracker; + + private Compat() { + Bundle bundle = FrameworkUtil.getBundle(Compat.class); + if (bundle != null) { + BundleContext bundleContext = bundle.getBundleContext(); + managementContextTracker = new ServiceTracker(bundleContext, ManagementContext.class, null); + managementContextTracker.open(); + } else { + managementContextTracker = null; + } + } + + /** + * Provides the management context service. + * + * Either from the encompassing OSGi framework or from the servlet context, depending on which launcher was used. + * + * @todo This does not allow ungetting the service after usage, so the bundle will remain blocked until all dependent bundles are + * stopped. + * @fixme Drop this for good after switching to karaf launcher. + */ + public ManagementContext getManagementContext() { + if (managementContextTracker != null) { + return (ManagementContext) managementContextTracker.getService(); + } + return null; + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java ---------------------------------------------------------------------- diff --git a/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java b/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java index 16c5996..86eb4fa 100644 --- a/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java +++ b/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java @@ -18,7 +18,6 @@ */ package org.apache.brooklyn.rest.jsgui; -import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.test.HttpTestUtils; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; @@ -26,8 +25,8 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.server.BrooklynServiceAttributes; import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture; +import org.apache.brooklyn.rest.util.OsgiCompat; import org.eclipse.jetty.server.NetworkConnector; /** Convenience and demo for launching programmatically. */ @@ -76,7 +75,7 @@ public class BrooklynJavascriptGuiLauncherTest { } private ManagementContext getManagementContextFromJettyServerAttributes(Server server) { - return (ManagementContext) ((ContextHandler)server.getHandler()).getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + return OsgiCompat.getManagementContext((ContextHandler) server.getHandler()); } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java index 5e43f20..07afa7a 100644 --- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java @@ -36,11 +36,11 @@ import org.slf4j.LoggerFactory; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; import org.apache.brooklyn.core.mgmt.entitlement.WebEntitlementContext; -import org.apache.brooklyn.core.server.BrooklynServiceAttributes; import org.apache.brooklyn.rest.security.provider.DelegatingSecurityProvider; import org.apache.brooklyn.util.text.Strings; import com.sun.jersey.core.util.Base64; +import org.apache.brooklyn.rest.util.OsgiCompat; /** * Provides basic HTTP authentication. @@ -155,7 +155,7 @@ public class BrooklynPropertiesSecurityFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { - ManagementContext mgmt = (ManagementContext) config.getServletContext().getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + ManagementContext mgmt = OsgiCompat.getManagementContext(config.getServletContext()); provider = new DelegatingSecurityProvider(mgmt); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/HaMasterCheckFilter.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/HaMasterCheckFilter.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/HaMasterCheckFilter.java index 2020c13..71c6c27 100644 --- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/HaMasterCheckFilter.java +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/filter/HaMasterCheckFilter.java @@ -36,12 +36,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState; -import org.apache.brooklyn.core.server.BrooklynServiceAttributes; import org.apache.brooklyn.rest.domain.ApiError; import org.apache.brooklyn.rest.util.WebResourceUtils; import org.apache.brooklyn.util.text.Strings; import com.google.common.collect.Sets; +import org.apache.brooklyn.rest.util.OsgiCompat; /** * Checks that for requests that want HA master state, the server is up and in that state. @@ -62,7 +62,7 @@ public class HaMasterCheckFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { servletContext = config.getServletContext(); - mgmt = (ManagementContext) servletContext.getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + mgmt = OsgiCompat.getManagementContext(servletContext); } static String lookForProblemIfServerNotRunning(ManagementContext mgmt) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java index 1e058f8..a8cc909 100644 --- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java @@ -26,8 +26,8 @@ import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.core.config.render.RendererHints; import org.apache.brooklyn.core.mgmt.ManagementContextInjectable; -import org.apache.brooklyn.core.server.BrooklynServiceAttributes; import org.apache.brooklyn.rest.util.BrooklynRestResourceUtils; +import org.apache.brooklyn.rest.util.OsgiCompat; import org.apache.brooklyn.rest.util.WebResourceUtils; import org.apache.brooklyn.rest.util.json.BrooklynJacksonJsonProvider; import org.apache.brooklyn.util.core.task.Tasks; @@ -53,7 +53,7 @@ public abstract class AbstractBrooklynRestResource implements ManagementContextI protected synchronized Maybe<ManagementContext> mgmtMaybe() { if (managementContext!=null) return Maybe.of(managementContext); - managementContext = (ManagementContext) servletContext.getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + managementContext = OsgiCompat.getManagementContext(servletContext); if (managementContext!=null) return Maybe.of(managementContext); return Maybe.absent("ManagementContext not available for Brooklyn Jersey Resource "+this); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/OsgiCompat.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/OsgiCompat.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/OsgiCompat.java new file mode 100644 index 0000000..1570efc --- /dev/null +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/OsgiCompat.java @@ -0,0 +1,46 @@ +/* + * Copyright 2015 The Apache Software Foundation. + * + * Licensed 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.brooklyn.rest.util; + +import javax.servlet.ServletContext; +import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.core.server.BrooklynServiceAttributes; +import org.apache.brooklyn.util.core.osgi.Compat; +import org.eclipse.jetty.server.handler.ContextHandler; + +/** + * Compatibility methods between karaf launcher and monolithic launcher. + * + * @todo Remove after transition to karaf launcher. + */ +public class OsgiCompat { + + public static ManagementContext getManagementContext(ServletContext servletContext) { + ManagementContext managementContext = Compat.getInstance().getManagementContext(); + if (managementContext == null && servletContext != null) { + managementContext = (ManagementContext) servletContext.getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + } + return managementContext; + } + + public static ManagementContext getManagementContext(ContextHandler jettyServerHandler) { + ManagementContext managementContext = Compat.getInstance().getManagementContext(); + if (managementContext == null && jettyServerHandler != null) { + managementContext = (ManagementContext) jettyServerHandler.getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + } + return managementContext; + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java index f6f0e2d..a58531c 100644 --- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java @@ -28,6 +28,7 @@ import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.core.internal.BrooklynProperties; import org.apache.brooklyn.core.mgmt.ManagementContextInjectable; import org.apache.brooklyn.core.server.BrooklynServiceAttributes; +import org.apache.brooklyn.rest.util.OsgiCompat; import org.codehaus.jackson.Version; import org.codehaus.jackson.jaxrs.JacksonJsonProvider; import org.codehaus.jackson.map.ObjectMapper; @@ -158,10 +159,7 @@ public class BrooklynJacksonJsonProvider extends JacksonJsonProvider implements } public static ManagementContext getManagementContext(ServletContext servletContext) { - if (servletContext == null) - return null; - - return (ManagementContext) servletContext.getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + return OsgiCompat.getManagementContext(servletContext); } @Override http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java index d35247c..d003b76 100644 --- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java +++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java @@ -70,8 +70,8 @@ import com.google.common.io.Files; import com.sun.jersey.api.core.DefaultResourceConfig; import com.sun.jersey.api.core.ResourceConfig; import com.sun.jersey.spi.container.servlet.ServletContainer; -import org.eclipse.jetty.server.NetworkConnector; import org.apache.brooklyn.rest.filter.SwaggerFilter; +import org.apache.brooklyn.rest.util.OsgiCompat; import org.eclipse.jetty.server.NetworkConnector; /** Convenience and demo for launching programmatically. Also used for automated tests. @@ -359,7 +359,7 @@ public class BrooklynRestApiLauncher { FilterHolder filterHolder = new FilterHolder(new ServletContainer(config)); context.addFilter(filterHolder, "/*", EnumSet.allOf(DispatcherType.class)); - ManagementContext mgmt = (ManagementContext) context.getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + ManagementContext mgmt = OsgiCompat.getManagementContext(context); config.getSingletons().add(new ManagementContextProvider(mgmt)); config.getSingletons().add(new ShutdownHandlerProvider(shutdownListener)); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/94de4642/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java index 6cb2970..b2c5031 100644 --- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java +++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java @@ -28,8 +28,8 @@ import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.internal.BrooklynProperties; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.server.BrooklynServerConfig; -import org.apache.brooklyn.core.server.BrooklynServiceAttributes; import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; +import org.apache.brooklyn.rest.util.OsgiCompat; import org.apache.brooklyn.util.exceptions.Exceptions; import org.eclipse.jetty.server.NetworkConnector; @@ -104,7 +104,7 @@ public abstract class BrooklynRestApiLauncherTestFixture { } public static ManagementContext getManagementContextFromJettyServerAttributes(Server server) { - return (ManagementContext) ((ContextHandler) server.getHandler()).getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); + return OsgiCompat.getManagementContext((ContextHandler) server.getHandler()); } }