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&lt;String, String&gt; keyPropertyList = objectName.getKeyPropertyList();
-     * Hashtable&lt;String, String&gt; translatedKeyPropertyList = new Hashtable&lt;String, String&gt;(keyPropertyList);
-     * translatedKeyPropertyList.put(&quot;X&quot;, &quot;Y&quot;);
-     * try {
-     *     return new ObjectName(domain, translatedKeyPropertyList);
-     * } catch (MalformedObjectNameException e) {
-     *     throw new RuntimeException(&quot;Unexpected exception&quot;, e);
-     * }
-     * </pre>
-     * 
-     * @param objectName the {@link ObjectName} to be translated
-     * @return the translated {@link ObjectName}
-     */
-    ObjectName translate(ObjectName objectName);
-
-}