Initial work for the ct tests
diff --git a/gemini.management.releng/.project b/gemini.management.releng/.project
index 74f243e..37ff578 100644
--- a/gemini.management.releng/.project
+++ b/gemini.management.releng/.project
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>gemini.mgmt.releng</name>
+ <name>gemini.management.releng</name>
<comment></comment>
<projects>
</projects>
diff --git a/gemini.management.releng/pom.xml b/gemini.management.releng/pom.xml
index 634a687..f62b2c7 100644
--- a/gemini.management.releng/pom.xml
+++ b/gemini.management.releng/pom.xml
@@ -4,7 +4,7 @@
<groupId>org.eclipse.gemini.management</groupId>
<artifactId>org.eclipse.gemini.management_parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.0.0.RELEASE</version>
<packaging>pom</packaging>
<name>Gemini Management Parent POM</name>
@@ -37,7 +37,7 @@
<artifact>
<groupId>org.eclipse.gemini.management</groupId>
<artifactId>target-platform</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.0.0.RELEASE</version>
<classifier>gemini-management</classifier>
</artifact>
</target>
diff --git a/gemini.management.repository/.project b/gemini.management.repository/.project
index 3697839..20ce796 100644
--- a/gemini.management.repository/.project
+++ b/gemini.management.repository/.project
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>gemini.mgmt.repository</name>
+ <name>gemini.management.repository</name>
<comment></comment>
<projects>
</projects>
diff --git a/gemini.management.repository/pom.xml b/gemini.management.repository/pom.xml
index a5e24b7..35ff953 100644
--- a/gemini.management.repository/pom.xml
+++ b/gemini.management.repository/pom.xml
@@ -5,7 +5,7 @@
<parent>
<groupId>org.eclipse.gemini.management</groupId>
<artifactId>org.eclipse.gemini.management_parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.0.0.RELEASE</version>
<relativePath>../gemini.management.releng/pom.xml</relativePath>
</parent>
@@ -14,8 +14,8 @@
<name>Gemini Management Update Site</name>
<properties>
- <site-folder-name>nightly</site-folder-name>
- <zip-folder-name>nightly-zips</zip-folder-name>
+ <site-folder-name>release</site-folder-name>
+ <zip-folder-name>release-zips</zip-folder-name>
</properties>
<build>
diff --git a/gemini.management.repository/site.xml b/gemini.management.repository/site.xml
index 9681d8e..628d367 100644
--- a/gemini.management.repository/site.xml
+++ b/gemini.management.repository/site.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site>
- <feature url="features/org.eclipse.gemini.management.feature_0.0.0.jar" id="org.eclipse.gemini.management.feature" version="0.0.0">
+ <feature url="features/org.eclipse.gemini.management.feature_2.0.0.RELEASE.jar" id="org.eclipse.gemini.management.feature" version="2.0.0.RELEASE">
<category name="gemini.management"/>
</feature>
<category-def name="gemini.management" label="Gemini Management"/>
diff --git a/org.eclipse.gemini.management.feature/.project b/org.eclipse.gemini.management.feature/.project
index a0225b8..42be35c 100644
--- a/org.eclipse.gemini.management.feature/.project
+++ b/org.eclipse.gemini.management.feature/.project
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>org.eclipse.gemini.mgmt.feature</name>
+ <name>org.eclipse.gemini.management.feature</name>
<comment></comment>
<projects>
</projects>
diff --git a/org.eclipse.gemini.management.feature/feature.xml b/org.eclipse.gemini.management.feature/feature.xml
index aa9799b..866e6c7 100644
--- a/org.eclipse.gemini.management.feature/feature.xml
+++ b/org.eclipse.gemini.management.feature/feature.xml
@@ -2,7 +2,7 @@
<feature
id="org.eclipse.gemini.management.feature"
label="Feature"
- version="2.0.0.qualifier">
+ version="2.0.0.RELEASE">
<description url="http://www.example.com/description">
[Enter Feature Description here.]
diff --git a/org.eclipse.gemini.management.feature/pom.xml b/org.eclipse.gemini.management.feature/pom.xml
index 00a0788..b0675e3 100644
--- a/org.eclipse.gemini.management.feature/pom.xml
+++ b/org.eclipse.gemini.management.feature/pom.xml
@@ -5,7 +5,7 @@
<parent>
<groupId>org.eclipse.gemini.management</groupId>
<artifactId>org.eclipse.gemini.management_parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.0.0.RELEASE</version>
<relativePath>../gemini.management.releng/pom.xml</relativePath>
</parent>
diff --git a/org.eclipse.gemini.management.target/pom.xml b/org.eclipse.gemini.management.target/pom.xml
index 545f29f..2306022 100755
--- a/org.eclipse.gemini.management.target/pom.xml
+++ b/org.eclipse.gemini.management.target/pom.xml
@@ -6,7 +6,7 @@
<parent>
<groupId>org.eclipse.gemini.management</groupId>
<artifactId>org.eclipse.gemini.management_parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.0.0.RELEASE</version>
<relativePath>../gemini.management.releng/pom.xml</relativePath>
</parent>
diff --git a/org.eclipse.gemini.management.tests/.project b/org.eclipse.gemini.management.tests/.project
index e4ddbc0..691ae49 100644
--- a/org.eclipse.gemini.management.tests/.project
+++ b/org.eclipse.gemini.management.tests/.project
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>org.eclipse.gemini.mgmt.tests</name>
+ <name>org.eclipse.gemini.management.tests</name>
<comment></comment>
<projects>
</projects>
diff --git a/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF b/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF
index b744cfe..1b353af 100644
--- a/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: Gemini Management Tests
Bundle-SymbolicName: org.eclipse.gemini.management.tests
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.0.RELEASE
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: javax.management,
javax.management.remote,
diff --git a/org.eclipse.gemini.management.tests/pom.xml b/org.eclipse.gemini.management.tests/pom.xml
index 734fe39..5ba6210 100644
--- a/org.eclipse.gemini.management.tests/pom.xml
+++ b/org.eclipse.gemini.management.tests/pom.xml
@@ -5,7 +5,7 @@
<parent>
<groupId>org.eclipse.gemini.management</groupId>
<artifactId>org.eclipse.gemini.management_parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.0.0.RELEASE</version>
<relativePath>../gemini.management.releng/pom.xml</relativePath>
</parent>
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java
index 71ea963..365d245 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java
@@ -22,16 +22,22 @@
import org.eclipse.gemini.management.Activator;
import org.junit.BeforeClass;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
-public class AbstractOSGiMBeanTest {
+public abstract class AbstractOSGiMBeanTest {
+
+ private static BundleContext bc;
protected String mBeanObjectName;
+ protected boolean addFrameworkAndUUID = false;
+
@BeforeClass
public static void setup(){
BundleContext bc = FrameworkUtil.getBundle(Activator.class).getBundleContext();
+ AbstractOSGiMBeanTest.bc = bc;
ServiceReference<MBeanServer> ref = bc.getServiceReference(MBeanServer.class);
if (ref == null) {
bc.registerService(MBeanServer.class.getCanonicalName(), ManagementFactory.getPlatformMBeanServer(), null);
@@ -44,7 +50,7 @@
JMXServiceURL jmxURL = new JMXServiceURL(url);
connector = JMXConnectorFactory.connect(jmxURL);
MBeanServerConnection connection = connector.getMBeanServerConnection();
- ObjectName name = new ObjectName(mBeanObjectName);
+ ObjectName name = new ObjectName(getMBeanObjectName());
Object result = connection.invoke(name, operation, arguments, types);
return returnType.cast(result);
}
@@ -55,9 +61,19 @@
JMXServiceURL jmxURL = new JMXServiceURL(url);
connector = JMXConnectorFactory.connect(jmxURL);
MBeanServerConnection connection = connector.getMBeanServerConnection();
- ObjectName name = new ObjectName(mBeanObjectName);
+ ObjectName name = new ObjectName(getMBeanObjectName());
Object result = connection.getAttribute(name, attribute);
return returnType.cast(result);
}
+ private String getMBeanObjectName(){
+ String newObjectName = this.mBeanObjectName;
+ if(this.addFrameworkAndUUID){
+ newObjectName = newObjectName +
+ ",framework=" + AbstractOSGiMBeanTest.bc.getBundle(0).getSymbolicName() +
+ ",uuid=" + AbstractOSGiMBeanTest.bc.getBundle(0).getBundleContext().getProperty(Constants.FRAMEWORK_UUID);
+ }
+ return newObjectName;
+ }
+
}
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java
index 02a1aed..6401248 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java
@@ -77,6 +77,7 @@
public BundleStateTest() {
super.mBeanObjectName = BundleStateMBean.OBJECTNAME;
+ super.addFrameworkAndUUID = true;
}
@Before
@@ -244,13 +245,13 @@
private Long[] getRequiredBundles(Bundle bundle) {
BundleWiring wiring = bundle.adapt(BundleWiring.class);
- List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);
+ List<BundleWire> requiredWires = wiring.getRequiredWires(null);//BundleRevision.BUNDLE_NAMESPACE);
return bundleWiresToProviderIds(requiredWires);
}
private Long[] getRequiringBundles(Bundle bundle) {
BundleWiring wiring = bundle.adapt(BundleWiring.class);
- List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);
+ List<BundleWire> providedWires = wiring.getProvidedWires(null);//BundleRevision.BUNDLE_NAMESPACE);
return bundleWiresToRequirerIds(providedWires);
}
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java
index 82537ef..e51a505 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java
@@ -47,6 +47,7 @@
public BundleWiringStateTest() {
super.mBeanObjectName = BundleWiringStateMBean.OBJECTNAME;
+ super.addFrameworkAndUUID = true;
}
@Before
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java
index bfb21e7..02d6f40 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java
@@ -24,6 +24,7 @@
public FrameworkTest() {
super.mBeanObjectName = FrameworkMBean.OBJECTNAME;
+ super.addFrameworkAndUUID = true;
}
@Test
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java
index e0683b8..26ca58b 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java
@@ -45,6 +45,7 @@
public ServiceStateTest() {
super.mBeanObjectName = ServiceStateMBean.OBJECTNAME;
+ super.addFrameworkAndUUID = true;
}
@Before
diff --git a/org.eclipse.gemini.management/.project b/org.eclipse.gemini.management/.project
index 4375a9f..bd4183e 100644
--- a/org.eclipse.gemini.management/.project
+++ b/org.eclipse.gemini.management/.project
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>org.eclipse.gemini.mgmt</name>
+ <name>org.eclipse.gemini.management</name>
<comment></comment>
<projects>
</projects>
diff --git a/org.eclipse.gemini.management/META-INF/MANIFEST.MF b/org.eclipse.gemini.management/META-INF/MANIFEST.MF
index b7239d2..edac088 100644
--- a/org.eclipse.gemini.management/META-INF/MANIFEST.MF
+++ b/org.eclipse.gemini.management/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: Gemini Management
Bundle-SymbolicName: org.eclipse.gemini.management
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.0.RELEASE
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Activator: org.eclipse.gemini.management.Activator
Import-Package: javax.management,
diff --git a/org.eclipse.gemini.management/pom.xml b/org.eclipse.gemini.management/pom.xml
index f5479ca..72de671 100644
--- a/org.eclipse.gemini.management/pom.xml
+++ b/org.eclipse.gemini.management/pom.xml
@@ -5,7 +5,7 @@
<parent>
<groupId>org.eclipse.gemini.management</groupId>
<artifactId>org.eclipse.gemini.management_parent</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.0.0.RELEASE</version>
<relativePath>../gemini.management.releng/pom.xml</relativePath>
</parent>
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 b58762d..a5b8588 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,7 +16,6 @@
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;
@@ -43,6 +42,7 @@
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.jmx.framework.BundleStateMBean;
import org.osgi.jmx.framework.FrameworkMBean;
@@ -69,12 +69,20 @@
public class Activator implements BundleActivator {
private static final String REGION_KEY = "region";
+
+ private static final String FRAMEWORK_KEY = "framework";
+
+ private static final String UUID_KEY = "uuid";
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 final Object myLock = new Object();
+
+ private final AtomicBoolean shuttingdown = new AtomicBoolean(false);
private ObjectName frameworkName;
@@ -136,15 +144,15 @@
private void createObjectNames() {
try {
- frameworkName = translateObjectName(FrameworkMBean.OBJECTNAME);
- bundleStateName = translateObjectName(BundleStateMBean.OBJECTNAME);
- bundleWiringStateName = translateObjectName(BundleWiringStateMBean.OBJECTNAME);
- serviceStateName = translateObjectName(CustomServiceStateMBean.OBJECTNAME);
- packageStateName = translateObjectName(PackageStateMBean.OBJECTNAME);
- configAdminName = translateObjectName(ConfigurationAdminMBean.OBJECTNAME);
- permissionAdminName = translateObjectName(PermissionAdminMBean.OBJECTNAME);
- provisioningServiceName = translateObjectName(ProvisioningServiceMBean.OBJECTNAME);
- userAdminName = translateObjectName(UserAdminMBean.OBJECTNAME);
+ frameworkName = translateObjectName(FrameworkMBean.OBJECTNAME, true);
+ bundleStateName = translateObjectName(BundleStateMBean.OBJECTNAME, true);
+ bundleWiringStateName = translateObjectName(BundleWiringStateMBean.OBJECTNAME, true);
+ serviceStateName = translateObjectName(CustomServiceStateMBean.OBJECTNAME, true);
+ packageStateName = translateObjectName(PackageStateMBean.OBJECTNAME, false);
+ configAdminName = translateObjectName(ConfigurationAdminMBean.OBJECTNAME, false);
+ permissionAdminName = translateObjectName(PermissionAdminMBean.OBJECTNAME, false);
+ provisioningServiceName = translateObjectName(ProvisioningServiceMBean.OBJECTNAME, false);
+ userAdminName = translateObjectName(UserAdminMBean.OBJECTNAME, false);
} catch (Exception e) {
throw new IllegalStateException("Unable to start Gemini Management, Object name creation failed.", e);
}
@@ -154,6 +162,7 @@
* {@inheritDoc}
*/
public void start(BundleContext bundleContext) throws Exception {
+ this.bundleContext = bundleContext;
logServiceTracker = new ServiceTracker<LogService, Object>(bundleContext, LogService.class, new LogServiceTracker());
logServiceTracker.open();
String regionSupportProperty = bundleContext.getProperty(REGION_SUPPORT);
@@ -165,26 +174,22 @@
this.regionName = null;
}
createObjectNames();
- this.bundleContext = bundleContext;
registerDefaultMBeanServer();
this.mbeanServiceTracker = new ServiceTracker<MBeanServer, Object>(this.bundleContext, MBeanServer.class, new MBeanServiceTracker());
log(LogService.LOG_INFO, "Awaiting initial MBeanServer service registration");
this.mbeanServiceTracker.open();
}
- private ObjectName translateObjectName(String objectName) throws MalformedObjectNameException {
- 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 ObjectName translateObjectName(String objectName, boolean addFrameworkAndUUID) throws MalformedObjectNameException {
+ StringBuilder builder = new StringBuilder(objectName);
+ if(addFrameworkAndUUID){
+ builder.append("," + FRAMEWORK_KEY + "=" + this.bundleContext.getBundle(0).getSymbolicName());
+ builder.append("," + UUID_KEY + "=" + this.bundleContext.getBundle(0).getBundleContext().getProperty(Constants.FRAMEWORK_UUID));
}
+ if(this.regionName != null){
+ builder.append("," + REGION_KEY + "=" + regionName);
+ }
+ return new ObjectName(builder.toString());
}
private void registerDefaultMBeanServer () {
@@ -203,9 +208,12 @@
* {@inheritDoc}
*/
public void stop(BundleContext arg0) throws Exception {
+ this.shuttingdown.set(true);
mbeanServiceTracker.close();
- for (MBeanServer mbeanServer : mbeanServers) {
- deregisterServices(mbeanServer);
+ synchronized (myLock) {
+ for (MBeanServer mbeanServer : mbeanServers) {
+ deregisterServices(mbeanServer);
+ }
}
mbeanServers.clear();
logServiceTracker.close();
@@ -222,7 +230,9 @@
}
log(LogService.LOG_INFO, "Deregistering framework with MBeanServer: " + mbeanServer);
try {
- mbeanServer.unregisterMBean(frameworkName);
+ if(mbeanServer.isRegistered(frameworkName)){
+ mbeanServer.unregisterMBean(frameworkName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_INFO, "FrameworkMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -232,7 +242,9 @@
log(LogService.LOG_INFO, "Deregistering bundle state with MBeanServer: " + mbeanServer);
try {
- mbeanServer.unregisterMBean(bundleStateName);
+ if(mbeanServer.isRegistered(bundleStateName)){
+ mbeanServer.unregisterMBean(bundleStateName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_INFO, "OSGi BundleStateMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -242,7 +254,9 @@
log(LogService.LOG_INFO, "Deregistering bundle wiring state with MBeanServer: " + mbeanServer);
try {
- mbeanServer.unregisterMBean(bundleWiringStateName);
+ if(mbeanServer.isRegistered(bundleWiringStateName)){
+ mbeanServer.unregisterMBean(bundleWiringStateName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_DEBUG, "OSGi BundleWiringStateMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -252,7 +266,9 @@
log(LogService.LOG_INFO, "Deregistering services monitor with MBeanServer: " + mbeanServer);
try {
- mbeanServer.unregisterMBean(serviceStateName);
+ if(mbeanServer.isRegistered(serviceStateName)){
+ mbeanServer.unregisterMBean(serviceStateName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_DEBUG, "OSGi ServiceStateMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -262,7 +278,9 @@
log(LogService.LOG_INFO, "Deregistering packages monitor with MBeanServer: " + mbeanServer);
try {
- mbeanServer.unregisterMBean(packageStateName);
+ if(mbeanServer.isRegistered(packageStateName)){
+ mbeanServer.unregisterMBean(packageStateName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_DEBUG, "OSGi PackageStateMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -273,7 +291,9 @@
log(LogService.LOG_INFO, "Deregistering config admin with MBeanServer: " + mbeanServer);
configAdminTracker.close();
try {
- mbeanServer.unregisterMBean(configAdminName);
+ if(mbeanServer.isRegistered(configAdminName)){
+ mbeanServer.unregisterMBean(configAdminName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_DEBUG, "OSGi ConfigAdminMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -284,7 +304,9 @@
log(LogService.LOG_INFO, "Deregistering permission admin with MBeanServer: " + mbeanServer);
permissionAdminTracker.close();
try {
- mbeanServer.unregisterMBean(permissionAdminName);
+ if(mbeanServer.isRegistered(permissionAdminName)){
+ mbeanServer.unregisterMBean(permissionAdminName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_DEBUG, "OSGi PermissionAdminMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -295,7 +317,9 @@
log(LogService.LOG_INFO, "Deregistering provisioning service admin with MBeanServer: " + mbeanServer);
provisioningServiceTracker.close();
try {
- mbeanServer.unregisterMBean(provisioningServiceName);
+ if(mbeanServer.isRegistered(provisioningServiceName)){
+ mbeanServer.unregisterMBean(provisioningServiceName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_DEBUG, "OSGi ProvisioningServiceMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -306,7 +330,9 @@
log(LogService.LOG_INFO, "Deregistering user admin with MBeanServer: " + mbeanServer);
userAdminTracker.close();
try {
- mbeanServer.unregisterMBean(userAdminName);
+ if(mbeanServer.isRegistered(userAdminName)){
+ mbeanServer.unregisterMBean(userAdminName);
+ }
} catch (InstanceNotFoundException e) {
log(LogService.LOG_DEBUG, "OSGi UserAdminMBean not found on deregistration", e);
} catch (MBeanRegistrationException e) {
@@ -322,6 +348,9 @@
* @param mbeanServer MBean Server to register the MBeans in
*/
private synchronized void registerServices(MBeanServer mbeanServer) {
+ if(shuttingdown.get()){
+ return;
+ }
try {
framework = new StandardMBean(new Framework(bundleContext), FrameworkMBean.class);
} catch (NotCompliantMBeanException e) {
@@ -743,14 +772,12 @@
}
@Override
- public void modifiedService(ServiceReference<LogService> reference,
- Object service) {
+ public void modifiedService(ServiceReference<LogService> reference, Object service) {
// no op
}
@Override
- public void removedService(ServiceReference<LogService> reference,
- Object service) {
+ public void removedService(ServiceReference<LogService> reference, Object service) {
logger = null;
}
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java
index 41ba1bf..c8b3d22 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java
@@ -100,8 +100,7 @@
for (Bundle bundle : bundleContext.getBundles()) {
bundles.add(new OSGiBundle(bundle));
}
- TabularData table = OSGiBundle.tableFrom(bundles, bundleTypeItems);
- return table;
+ return OSGiBundle.tableFrom(bundles, bundleTypeItems);
} catch (Throwable e) {
throw new IOException(e);
}
@@ -185,8 +184,8 @@
/**
* {@inheritDoc}
*/
- public long[] getServicesInUse(long bundleIdentifier) throws IOException {
- ServiceReference<?>[] servicesInUse = retrieveBundle(bundleIdentifier).getServicesInUse();
+ public long[] getServicesInUse(long bundleId) throws IOException {
+ ServiceReference<?>[] servicesInUse = retrieveBundle(bundleId).getServicesInUse();
return convertToPrimativeArray(OSGiBundle.serviceIds(servicesInUse));
}
@@ -194,18 +193,14 @@
* {@inheritDoc}
*/
public long[] getRequiringBundles(long bundleId) throws IOException {
- BundleWiring wiring = retrieveBundle(bundleId).adapt(BundleWiring.class);
- List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);
- return convertToPrimativeArray(OSGiBundle.bundleWiresToRequirerIds(providedWires));
+ return convertToPrimativeArray(BundleUtil.getRequiringBundles(retrieveBundle(bundleId)));
}
/**
* {@inheritDoc}
*/
- public long[] getRequiredBundles(long bundleIdentifier) throws IOException {
- BundleWiring wiring = retrieveBundle(bundleIdentifier).adapt(BundleWiring.class);
- List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);
- return convertToPrimativeArray(OSGiBundle.bundleWiresToProviderIds(requiredWires));
+ public long[] getRequiredBundles(long bundleId) throws IOException {
+ return convertToPrimativeArray(BundleUtil.getRequiredBundles(retrieveBundle(bundleId)));
}
/**
@@ -289,8 +284,14 @@
}
private long[] convertToPrimativeArray(Long[] src){
+ if(src == null || src.length == 0){
+ return new long[0];
+ }
long[] dest = new long[src.length];
- System.arraycopy(src, 0, dest, 0, src.length);
+ int i = 0;
+ for (Long long1 : src) {
+ dest[i++] = long1;
+ }
return dest;
}
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java
index 420acc0..3384757 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java
@@ -77,7 +77,7 @@
BundleWiring wiring = getBundle(bundleId).adapt(BundleWiring.class);
OSGiBundleRevisionIdTracker revisionTracker = new OSGiBundleRevisionIdTracker();
if(wiring != null){
- return new OSGiBundleWiring(wiring).asCompositeData(namespace, revisionTracker);
+ return new OSGiBundleWiring(wiring).asCompositeData(namespace, bundleId, revisionTracker);
}else{
return null;
}
@@ -140,7 +140,7 @@
for (BundleRevision bundleRevision : bundleRevisions) {
BundleWiring wiring = bundleRevision.getWiring();
if(wiring != null){
- table.put(new OSGiBundleWiring(wiring).asCompositeData(namespace, revisionTracker));
+ table.put(new OSGiBundleWiring(wiring).asCompositeData(namespace, bundleId, revisionTracker));
}
}
return table;
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java
index 4cbe35d..5ce5ec9 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java
@@ -248,11 +248,7 @@
try {
bundle(bundleIdentifiers[i]).adapt(BundleStartLevel.class).setStartLevel(newlevels[i]);
} catch (Throwable e) {
- Long[] completed = new Long[i];
- System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
- Long[] remaining = new Long[bundleIdentifiers.length - i - 1];
- System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);
- return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();
+ return this.handleUpdateException(bundleIdentifiers, i, e);
}
}
return new BundleBatchActionResult().asCompositeData();
@@ -317,11 +313,7 @@
try {
bundle(bundleIdentifiers[i]).start();
} catch (Throwable e) {
- Long[] completed = new Long[i];
- System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
- Long[] remaining = new Long[bundleIdentifiers.length - i - 1];
- System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);
- return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();
+ return this.handleUpdateException(bundleIdentifiers, i, e);
}
}
return new BundleBatchActionResult().asCompositeData();
@@ -349,11 +341,7 @@
try {
bundle(bundleIdentifiers[i]).stop();
} catch (Throwable e) {
- Long[] completed = new Long[i];
- System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
- Long[] remaining = new Long[bundleIdentifiers.length - i - 1];
- System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);
- return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();
+ return this.handleUpdateException(bundleIdentifiers, i, e);
}
}
return new BundleBatchActionResult().asCompositeData();
@@ -381,11 +369,7 @@
try {
bundle(bundleIdentifiers[i]).uninstall();
} catch (Throwable e) {
- Long[] completed = new Long[i];
- System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
- Long[] remaining = new Long[bundleIdentifiers.length - i - 1];
- System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);
- return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();
+ return this.handleUpdateException(bundleIdentifiers, i, e);
}
}
return new BundleBatchActionResult().asCompositeData();
@@ -433,11 +417,7 @@
try {
bundle(bundleIdentifiers[i]).update();
} catch (Throwable e) {
- Long[] completed = new Long[i];
- System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
- Long[] remaining = new Long[bundleIdentifiers.length - i - 1];
- System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);
- return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();
+ return this.handleUpdateException(bundleIdentifiers, i, e);
}
}
return new BundleBatchActionResult().asCompositeData();
@@ -456,11 +436,7 @@
is = new URL(urls[i]).openStream();
bundle(bundleIdentifiers[i]).update(is);
} catch (Throwable e) {
- Long[] completed = new Long[i];
- System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
- Long[] remaining = new Long[bundleIdentifiers.length - i - 1];
- System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);
- return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();
+ return this.handleUpdateException(bundleIdentifiers, i, e);
} finally {
if (is != null) {
try {
@@ -472,6 +448,15 @@
}
return new BundleBatchActionResult().asCompositeData();
}
+
+ private CompositeData handleUpdateException(long[] bundleIdentifiers, int currentPostion, Throwable e){
+ Long[] completed = this.convertToNonPrimativeArray(bundleIdentifiers, currentPostion);
+ Long[] remaining = new Long[bundleIdentifiers.length - currentPostion - 1];
+ for (int j = 0; j < remaining.length; j++) {
+ remaining[j] = bundleIdentifiers[currentPostion + 1 + j];
+ }
+ return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[currentPostion], remaining).asCompositeData();
+ }
/**
* {@inheritDoc}
@@ -492,8 +477,7 @@
long[] result = new long[bundles.size()];
int i = 0;
for (Bundle bundle : bundles) {
- result[i] = bundle.getBundleId();
- i++;
+ result[i++] = bundle.getBundleId();
}
return result;
}
@@ -513,8 +497,7 @@
long[] result = new long[removalPendingBundles.size()];
int i = 0;
for (Bundle bundle : removalPendingBundles) {
- result[i] = bundle.getBundleId();
- i++;
+ result[i++] = bundle.getBundleId();
}
return result;
}
@@ -534,12 +517,13 @@
* {@inheritDoc}
*/
public CompositeData refreshBundlesAndWait(long[] bundleIdentifiers) throws IOException {
- Collection<Bundle> bundles = bundleIdentifiers == null ? null : this.getBundles(bundleIdentifiers);
+ if(bundleIdentifiers == null){
+ return new BundleBatchResolveResult(new Long[0], true).asCompositeData();
+ }
+ Collection<Bundle> bundles = this.getBundles(bundleIdentifiers);
StandardFrameworkListener standardFrameworkListener = new StandardFrameworkListener();
this.frameworkWiring.refreshBundles(bundles, standardFrameworkListener);
- Long[] completedBundles = new Long[bundleIdentifiers.length];
- System.arraycopy(bundleIdentifiers, 0, completedBundles, 0, bundleIdentifiers.length);
- return new BundleBatchResolveResult(completedBundles, standardFrameworkListener.getResult()).asCompositeData();
+ return new BundleBatchResolveResult(convertToNonPrimativeArray(bundleIdentifiers), standardFrameworkListener.getResult()).asCompositeData();
}
/**
@@ -549,21 +533,20 @@
boolean result;
Long[] completedBundles;
if(bundleIdentifiers == null){
- Collection<Long> unresolvedBundles = new HashSet<Long>();
Bundle[] allBundles = this.bundleContext.getBundles();
+ long[] tmpBundles = new long[allBundles.length];
+ int i = 0;
for (Bundle bundle : allBundles) {
if(bundle.getState() == Bundle.INSTALLED){
- unresolvedBundles.add(bundle.getBundleId());
+ tmpBundles[i++] = bundle.getBundleId();
}
}
- completedBundles = new Long[unresolvedBundles.size()];
- unresolvedBundles.toArray(completedBundles);
+ completedBundles = convertToNonPrimativeArray(tmpBundles);
result = this.frameworkWiring.resolveBundles(null);
}else{
Collection<Bundle> bundles = this.getBundles(bundleIdentifiers);
result = this.frameworkWiring.resolveBundles(bundles);
- completedBundles = new Long[bundleIdentifiers.length];
- System.arraycopy(bundleIdentifiers, 0, completedBundles, 0, bundleIdentifiers.length);
+ completedBundles = convertToNonPrimativeArray(bundleIdentifiers);
}
return new BundleBatchResolveResult(completedBundles, result).asCompositeData();
}
@@ -583,6 +566,21 @@
}
return b;
}
+
+ private Long[] convertToNonPrimativeArray(long[] src, int length){
+ if(src == null || src.length == 0){
+ return new Long[0];
+ }
+ Long[] dest = new Long[length];
+ for (int i = 0; i < length; i++) {
+ dest[i] = src[i];
+ }
+ return dest;
+ }
+
+ private Long[] convertToNonPrimativeArray(long[] src){
+ return this.convertToNonPrimativeArray(src, src.length);
+ }
/**
*
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java
index eec6f20..7b3be2c 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java
@@ -350,9 +350,7 @@
* @throws IOException
*/
private Long[] getRequiredBundles() throws IOException {
- BundleWiring wiring = bundle.adapt(BundleWiring.class);
- List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);
- return OSGiBundle.bundleWiresToProviderIds(requiredWires);
+ return BundleUtil.getRequiredBundles(bundle);
}
/**
@@ -360,9 +358,7 @@
* @throws IOException
*/
private Long[] getRequiringBundles() throws IOException {
- BundleWiring wiring = bundle.adapt(BundleWiring.class);
- List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);
- return OSGiBundle.bundleWiresToRequirerIds(providedWires);
+ return BundleUtil.getRequiringBundles(bundle);
}
/**
@@ -459,11 +455,14 @@
if (refs == null) {
return new Long[0];
}
- Long[] ids = new Long[refs.length];
+ List<Long> idsList = new ArrayList<Long>();
for (int i = 0; i < refs.length; i++) {
- ids[i] = (Long) refs[i].getProperty(Constants.SERVICE_ID);
+ Object serviceIdProperty = refs[i].getProperty(Constants.SERVICE_ID);
+ if(serviceIdProperty != null){
+ idsList.add((Long) serviceIdProperty);
+ }
}
- return ids;
+ return idsList.toArray(new Long[idsList.size()]);
}
}
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java
index 7a5a38c..a856e22 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java
@@ -43,25 +43,6 @@
/**
*
* @param namespace
- * @param revisionCounter
- * @return
- */
- public CompositeData asCompositeData(String namespace, OSGiBundleRevisionIdTracker revisionTracker) {
- Map<String, Object> items = new HashMap<String, Object>();
- int myRevisionId = revisionTracker.getRevisionId(wiring.getRevision());
- this.addCapabilityAndRequirementItems(items, namespace);
- this.addRevisionedProvidedAndRequiredWireItems(items, namespace, revisionTracker);
- items.put(BundleWiringStateMBean.BUNDLE_REVISION_ID, myRevisionId);
- try {
- return new CompositeDataSupport(BundleWiringStateMBean.BUNDLE_WIRING_TYPE, items);
- } catch (OpenDataException e) {
- throw new IllegalStateException("Cannot form bundle revisions wiring open data", e);
- }
- }
-
- /**
- *
- * @param namespace
* @param bundleId
* @param revisionCounter
* @return
@@ -76,7 +57,7 @@
try {
return new CompositeDataSupport(BundleWiringStateMBean.BUNDLE_WIRING_TYPE, items);
} catch (OpenDataException e) {
- throw new IllegalStateException("Cannot form bundle revisions wiring closures open data", e);
+ throw new IllegalStateException("Cannot form bundle revisions wiring closures open data (" + e.getMessage() + ")", e);
}
}
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java
index 3799aae..a74a512 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java
@@ -15,9 +15,11 @@
package org.eclipse.gemini.management.internal;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import org.eclipse.gemini.management.framework.internal.OSGiBundle;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.startlevel.BundleStartLevel;
@@ -68,10 +70,10 @@
if (wiring == null) {
return new String[0];
}
- List<BundleWire> providedWires = wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE);
+ List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE);
List<String> packages = new ArrayList<String>();
- for(BundleWire wire: providedWires){
- String packageName = String.format("%s;%s", wire.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE), wire.getCapability().getAttributes().get(Constants.VERSION_ATTRIBUTE));
+ for(BundleWire requiredWire: requiredWires){
+ String packageName = String.format("%s;%s", requiredWire.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE), requiredWire.getCapability().getAttributes().get(Constants.VERSION_ATTRIBUTE));
if(!packages.contains(packageName)){
packages.add(packageName);
}
@@ -154,6 +156,32 @@
BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
return startLevel.isActivationPolicyUsed();
}
+
+ /**
+ * @return the list of identifiers of bundles required by this bundle
+ * @throws IOException
+ */
+ public static Long[] getRequiredBundles(Bundle bundle) throws IOException {
+ BundleWiring wiring = bundle.adapt(BundleWiring.class);
+ if(wiring == null){
+ return new Long[0];
+ }
+ List<BundleWire> requiredWires = wiring.getRequiredWires(null);//BundleRevision.BUNDLE_NAMESPACE);
+ return OSGiBundle.bundleWiresToProviderIds(requiredWires);
+ }
+
+ /**
+ * @return the list of identifiers of bundles which require this bundle
+ * @throws IOException
+ */
+ public static Long[] getRequiringBundles(Bundle bundle) throws IOException {
+ BundleWiring wiring = bundle.adapt(BundleWiring.class);
+ if(wiring == null){
+ return new Long[0];
+ }
+ List<BundleWire> providedWires = wiring.getProvidedWires(null);//BundleRevision.BUNDLE_NAMESPACE);
+ return OSGiBundle.bundleWiresToRequirerIds(providedWires);
+ }
/**
* Answer true if the bundle is required
@@ -165,7 +193,7 @@
public static boolean isRequired(Bundle bundle) {
BundleWiring wiring = bundle.adapt(BundleWiring.class);
if (wiring != null) {
- return wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE).size() > 0;
+ return wiring.getProvidedWires(null/*BundleRevision.BUNDLE_NAMESPACE*/).size() > 0;
} else {
return false;
}
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java
index a0845dc..5736416 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java
@@ -264,7 +264,9 @@
builder.append(',');
}
}
- builder.deleteCharAt(builder.length()-1);
+ if(builder.length() > 0){
+ builder.deleteCharAt(builder.length()-1);
+ }
return propertyData(key, builder.toString(), JmxConstants.ARRAY_OF + typeOf(componentClazz));
}