394913 adding support for regions without any code dependancy on regions
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/DefaultObjectNameTranslatorTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/DefaultObjectNameTranslatorTest.java
deleted file mode 100755
index 0cd7dfe..0000000
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/DefaultObjectNameTranslatorTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 VMware Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * VMware Inc. - initial contribution
- *******************************************************************************/
-
-package org.eclipse.gemini.management;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.List;
-
-import org.easymock.EasyMock;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-import org.osgi.service.log.LogService;
-
-public class DefaultObjectNameTranslatorTest {
-
- private static final String NOT_A_OBJECT_NAME_TRANSLATOR_CLASS_NAME = DefaultObjectNameTranslatorTest.class.getName();
-
- private static final ClassNotFoundException TEST_CLASS_NOT_FOUND_EXCEPTION = new ClassNotFoundException("Test");
-
- private static final String TEST_OBJECT_NAME_TRANSLATOR_CLASS_NAME = TestObjectNameTranslator.class.getName();
-
- private static final String UNLOADABLE_CLASS_NAME = "BAD";
-
- private static final String UNINSTANTIABLE_OBJECT_NAME_TRANSLATOR_CLASS_NAME = UninstantiableObjectNameTranslator.class.getName();
-
- private BundleContext mockBundleContext;
-
- private Bundle mockBundle;
-
- private Dictionary<String, String> headers;
-
- private BundleWire mockBundleWire;
-
- private BundleWiring mockBundleWiring;
-
- private LogService stubLogService;
-
- @Before
- public void setUp() throws Exception {
- mockBundleContext = EasyMock.createMock(BundleContext.class);
- mockBundle = EasyMock.createMock(Bundle.class);
- mockBundleWiring = EasyMock.createMock(BundleWiring.class);
- mockBundleWire = EasyMock.createMock(BundleWire.class);
- List<BundleWire> listMockBundleWires = new ArrayList<BundleWire>();
- listMockBundleWires.add(mockBundleWire);
- headers = new Hashtable<String, String>();
- EasyMock.expect(mockBundleContext.getBundle()).andReturn(mockBundle);
- EasyMock.expect(mockBundle.adapt(BundleWiring.class)).andReturn(mockBundleWiring);
- EasyMock.expect(mockBundleWiring.getProvidedWires(BundleRevision.HOST_NAMESPACE)).andReturn(listMockBundleWires);
- EasyMock.expect(mockBundleWire.getRequirerWiring()).andReturn(mockBundleWiring);
- EasyMock.expect(mockBundleWiring.getBundle()).andReturn(mockBundle);
- EasyMock.expect(mockBundle.getHeaders()).andReturn(headers);
- this.stubLogService = new LogService() {
- @Override
- public void log(ServiceReference arg0, int arg1, String arg2, Throwable arg3) {
- }
-
- @Override
- public void log(ServiceReference arg0, int arg1, String arg2) {
- }
-
- @Override
- public void log(int arg0, String arg1, Throwable arg2) {
- }
-
- @Override
- public void log(int arg0, String arg1) {
- }
- };
- }
-
- private void replayMocks() {
- EasyMock.replay(mockBundleContext, mockBundle, mockBundleWiring, mockBundleWire);
- }
-
- @After
- public void tearDown() {
- EasyMock.verify(mockBundleContext, mockBundle, mockBundleWiring, mockBundleWire);
- }
-
- @Test
- public void testDefaultObjectNameTranslator() throws Exception {
- replayMocks();
- ObjectNameTranslator defaultObjectNameTranslator = DefaultObjectNameTranslator.initialiseObjectNameTranslator(mockBundleContext, this.stubLogService);
- Assert.assertTrue("Default ObjectNameTranslator has the wrong type", defaultObjectNameTranslator instanceof DefaultObjectNameTranslator);
- }
-
- @SuppressWarnings("rawtypes")
- @Test
- public void testConfiguredObjectNameTranslator() throws Exception {
- EasyMock.expect((Class) mockBundle.loadClass(TEST_OBJECT_NAME_TRANSLATOR_CLASS_NAME)).andReturn(TestObjectNameTranslator.class);
- replayMocks();
- headers.put(ObjectNameTranslator.HEADER_NAME, TEST_OBJECT_NAME_TRANSLATOR_CLASS_NAME);
- ObjectNameTranslator testObjectNameTranslator = DefaultObjectNameTranslator.initialiseObjectNameTranslator(mockBundleContext, this.stubLogService);
- Assert.assertTrue("Test ObjectNameTranslator has the wrong type", testObjectNameTranslator instanceof TestObjectNameTranslator);
- }
-
- @SuppressWarnings("rawtypes")
- @Test(expected = ClassNotFoundException.class)
- public void testUnloadableObjectNameTranslator() throws Exception {
- EasyMock.expect((Class) mockBundle.loadClass(UNLOADABLE_CLASS_NAME)).andThrow(TEST_CLASS_NOT_FOUND_EXCEPTION);
- replayMocks();
- headers.put(ObjectNameTranslator.HEADER_NAME, UNLOADABLE_CLASS_NAME);
- DefaultObjectNameTranslator.initialiseObjectNameTranslator(mockBundleContext, this.stubLogService);
- }
-
- @SuppressWarnings("rawtypes")
- @Test
- public void testWrongClassObjectNameTranslator() throws Exception {
- EasyMock.expect((Class) mockBundle.loadClass(NOT_A_OBJECT_NAME_TRANSLATOR_CLASS_NAME)).andReturn(DefaultObjectNameTranslatorTest.class);
- replayMocks();
- headers.put(ObjectNameTranslator.HEADER_NAME, NOT_A_OBJECT_NAME_TRANSLATOR_CLASS_NAME);
- ObjectNameTranslator defaultObjectNameTranslator = DefaultObjectNameTranslator.initialiseObjectNameTranslator(mockBundleContext, this.stubLogService);
- Assert.assertTrue("Test ObjectNameTranslator has the wrong type", defaultObjectNameTranslator instanceof DefaultObjectNameTranslator);
- }
-
- @SuppressWarnings("rawtypes")
- public void testUninstantiableObjectNameTranslator() throws Exception {
- EasyMock.expect((Class) mockBundle.loadClass(UNINSTANTIABLE_OBJECT_NAME_TRANSLATOR_CLASS_NAME)).andReturn(UninstantiableObjectNameTranslator.class);
- replayMocks();
- headers.put(ObjectNameTranslator.HEADER_NAME, UNINSTANTIABLE_OBJECT_NAME_TRANSLATOR_CLASS_NAME);
- ObjectNameTranslator defaultObjectNameTranslator = DefaultObjectNameTranslator.initialiseObjectNameTranslator(mockBundleContext, this.stubLogService);
- Assert.assertTrue("Default ObjectNameTranslator has the wrong type", defaultObjectNameTranslator instanceof DefaultObjectNameTranslator);
- }
-
-}
\ No newline at end of file
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/TestObjectNameTranslator.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/TestObjectNameTranslator.java
deleted file mode 100755
index 6fc9f57..0000000
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/TestObjectNameTranslator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 VMware Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * VMware Inc. - initial contribution
- *******************************************************************************/
-
-package org.eclipse.gemini.management;
-
-import javax.management.ObjectName;
-
-import org.osgi.framework.BundleContext;
-
-public class TestObjectNameTranslator implements ObjectNameTranslator {
-
- public TestObjectNameTranslator(BundleContext context) {
-
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public ObjectName translate(ObjectName objectName) {
- return objectName;
- }
-
-}
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/UninstantiableObjectNameTranslator.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/UninstantiableObjectNameTranslator.java
deleted file mode 100755
index 90d2484..0000000
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/UninstantiableObjectNameTranslator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 VMware Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * VMware Inc. - initial contribution
- *******************************************************************************/
-
-package org.eclipse.gemini.management;
-
-public class UninstantiableObjectNameTranslator {
-
- private UninstantiableObjectNameTranslator() {
- }
-
-}
diff --git a/org.eclipse.gemini.management/META-INF/MANIFEST.MF b/org.eclipse.gemini.management/META-INF/MANIFEST.MF
index 1a89800..b7239d2 100644
--- a/org.eclipse.gemini.management/META-INF/MANIFEST.MF
+++ b/org.eclipse.gemini.management/META-INF/MANIFEST.MF
@@ -7,6 +7,7 @@
Bundle-Activator: org.eclipse.gemini.management.Activator
Import-Package: javax.management,
javax.management.openmbean,
+ org.eclipse.equinox.region;resolution:="optional",
org.osgi.framework;version="1.3.0",
org.osgi.framework.startlevel;version="1.0.0",
org.osgi.framework.wiring;version="1.0.0",
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java
index 18367f2..b58762d 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java
@@ -16,6 +16,7 @@
package org.eclipse.gemini.management;
import java.lang.management.ManagementFactory;
+import java.util.Hashtable;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -39,6 +40,7 @@
import org.eclipse.gemini.management.permissionadmin.PermissionManager;
import org.eclipse.gemini.management.provisioning.Provisioning;
import org.eclipse.gemini.management.useradmin.UserManager;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
@@ -65,13 +67,15 @@
*/
@SuppressWarnings("deprecation")
public class Activator implements BundleActivator {
+
+ private static final String REGION_KEY = "region";
+ private static final String REGION_SUPPORT = "org.eclipse.gemini.management.region.support";
+
private final List<MBeanServer> mbeanServers = new CopyOnWriteArrayList<MBeanServer>();
private final AtomicBoolean servicesRegistered = new AtomicBoolean(false);
-
- private ObjectNameTranslator objectNameTranslator;
-
+
private ObjectName frameworkName;
private ObjectName bundleStateName;
@@ -113,7 +117,9 @@
private ServiceTracker<UserAdmin, ?> userAdminTracker;
private ServiceTracker<LogService, ?> logServiceTracker;
-
+
+ private String regionName;
+
private LogService logger;
private void log (int level, String message) {
@@ -149,8 +155,15 @@
*/
public void start(BundleContext bundleContext) throws Exception {
logServiceTracker = new ServiceTracker<LogService, Object>(bundleContext, LogService.class, new LogServiceTracker());
- logServiceTracker.open();
- objectNameTranslator = DefaultObjectNameTranslator.initialiseObjectNameTranslator(bundleContext, logger);
+ logServiceTracker.open();
+ String regionSupportProperty = bundleContext.getProperty(REGION_SUPPORT);
+ if(regionSupportProperty != null && Boolean.valueOf(regionSupportProperty)){
+ ServiceReference<?> service = bundleContext.getServiceReference("org.eclipse.equinox.region.Region");
+ Object regionService = bundleContext.getService(service);
+ this.regionName = (String) regionService.getClass().getDeclaredMethod("getRegion", Bundle.class).invoke(regionService, bundleContext.getBundle());
+ } else {
+ this.regionName = null;
+ }
createObjectNames();
this.bundleContext = bundleContext;
registerDefaultMBeanServer();
@@ -160,7 +173,18 @@
}
private ObjectName translateObjectName(String objectName) throws MalformedObjectNameException {
- return this.objectNameTranslator.translate(new ObjectName(objectName));
+ ObjectName originalName = new ObjectName(objectName);
+ if(this.regionName != null){
+ Hashtable<String, String> keyPropertyList = originalName.getKeyPropertyList();
+ keyPropertyList.put(REGION_KEY, regionName);
+ try {
+ return new ObjectName(originalName.getDomain(), keyPropertyList);
+ } catch (Exception e) {
+ throw new RuntimeException("Error modifying ObjectName for '" + originalName.getCanonicalName() + "'", e);
+ }
+ }else{
+ return originalName;
+ }
}
private void registerDefaultMBeanServer () {
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/DefaultObjectNameTranslator.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/DefaultObjectNameTranslator.java
deleted file mode 100755
index a1fc255..0000000
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/DefaultObjectNameTranslator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 VMware Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * VMware Inc. - initial contribution
- *******************************************************************************/
-
-package org.eclipse.gemini.management;
-
-import java.util.List;
-
-import javax.management.ObjectName;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-import org.osgi.service.log.LogService;
-
-/**
- * {@link DefaultObjectNameTranslator} is a default implementation of {@link ObjectNameTranslator} which maps each
- * {@link ObjectName} to itself.
- * <p />
- *
- * <strong>Concurrent Semantics</strong><br />
- * Thread safe.
- */
-final class DefaultObjectNameTranslator implements ObjectNameTranslator {
-
-// private static final Logger LOGGER = Logger.getLogger(DefaultObjectNameTranslator.class.getCanonicalName());
-
- /**
- * {@inheritDoc}
- */
- @Override
- public ObjectName translate(ObjectName objectName) {
- return objectName;
- }
-
- /**
- * Creates an {@link ObjectNameTranslator} instance based on the headers of the given bundle. This is either one
- * configured by an attached fragment or, by default, an instance of this class.
- *
- * @param bundleContext the bundle which may contain a header to define an {@link ObjectNameTranslator}
- * @return an {@link ObjectNameTranslator}
- * @throws ClassNotFoundException if the configured class cannot be loaded
- * @throws InstantiationException if the configured class cannot be instantiated
- * @throws IllegalAccessException if the configured class or its default constructor is not accessible
- */
- static ObjectNameTranslator initialiseObjectNameTranslator(BundleContext bundleContext, LogService logger) throws ClassNotFoundException, InstantiationException,
- IllegalAccessException {
- Bundle bundle = bundleContext.getBundle();
- BundleWiring wiring = bundle.adapt(BundleWiring.class);
- List<BundleWire> requiredWires = wiring.getProvidedWires(BundleRevision.HOST_NAMESPACE);
- for (BundleWire bundleWire : requiredWires) {
- Bundle fragment = bundleWire.getRequirerWiring().getBundle();
- String objectNameTranslator = fragment.getHeaders().get(ObjectNameTranslator.HEADER_NAME);
- if(objectNameTranslator != null){
- Class<?> objectNameTranslatorClass = bundle.loadClass(objectNameTranslator);
- if(ObjectNameTranslator.class.isAssignableFrom(objectNameTranslatorClass)){
- try {
- return (ObjectNameTranslator) objectNameTranslatorClass.getConstructor(BundleContext.class).newInstance(bundleContext);
- } catch (Exception e) {
- if (logger != null) {
- logger.log(LogService.LOG_WARNING, String.format("Unable to create ObjectNameTranslator from fragment %d '%s'", fragment.getBundleId(), e.getMessage()));
- }
- }
- } else {
- if (logger != null) {
- logger.log(LogService.LOG_WARNING, String.format("Unable to create ObjectNameTranslator as specified class '%s' is not an assignable to '%s'", objectNameTranslator, ObjectNameTranslator.class.getName()));
- }
- }
- }
- }
- return new DefaultObjectNameTranslator();
- }
-
-}
\ No newline at end of file
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/ObjectNameTranslator.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/ObjectNameTranslator.java
deleted file mode 100644
index a86145c..0000000
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/ObjectNameTranslator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 VMware Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * VMware Inc. - initial contribution
- *******************************************************************************/
-
-package org.eclipse.gemini.management;
-
-import javax.management.ObjectName;
-
-/**
- * {@link ObjectNameTranslator} maps JMX object names defined by Gemini Management before they are used to publish
- * mbeans. The purpose is to allow multiple instances of Gemini Management to run in a single OSGi framework without
- * their object names colliding.
- * <p />
- * For more background, see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=366235#c1">bug 366235</a>.
- * <p />
- * One and only one implementation of this interface may be configured into Gemini Management by attaching a fragment to
- * Gemini Management including the implementation class and a manifest header like this:
- * <p />
- * <code>GeminiManagement-ObjectNameTranslator: MyObjectNameTranslator</code>
- * <p />
- * The default behaviour of Gemini Management when no object name translator is configured is the same as if an object
- * name translator was configured which translates each object name to itself.
- * <p />
- * <strong>Concurrent Semantics</strong><br />
- * Implementations of this interface must be thread safe.
- */
-public interface ObjectNameTranslator {
-
- public static final String HEADER_NAME = "GeminiManagement-ObjectNameTranslator";
-
- /**
- * Translates the given {@link ObjectName}. The translation must be injective, which means that translations of
- * distinct object names must be distinct.
- * <p />
- * Example implementation:
- *
- * <pre>
- * String domain = objectName.getDomain();
- * Hashtable<String, String> keyPropertyList = objectName.getKeyPropertyList();
- * Hashtable<String, String> translatedKeyPropertyList = new Hashtable<String, String>(keyPropertyList);
- * translatedKeyPropertyList.put("X", "Y");
- * try {
- * return new ObjectName(domain, translatedKeyPropertyList);
- * } catch (MalformedObjectNameException e) {
- * throw new RuntimeException("Unexpected exception", e);
- * }
- * </pre>
- *
- * @param objectName the {@link ObjectName} to be translated
- * @return the translated {@link ObjectName}
- */
- ObjectName translate(ObjectName objectName);
-
-}