Adding extra methods to the ServiceStateMBean to enable better support for getting the services of a Bundle
diff --git a/org.eclipse.gemini.mgmt/build.properties b/org.eclipse.gemini.mgmt/build.properties
index 60212e4..e139d50 100644
--- a/org.eclipse.gemini.mgmt/build.properties
+++ b/org.eclipse.gemini.mgmt/build.properties
@@ -1,3 +1,4 @@
 source.. = src/main/java/

 output.. = target/

 bin.includes = META-INF/,.

+src.excludes = src/test/java/

diff --git a/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java
index 1f88db1..10cc1b2 100644
--- a/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java
@@ -25,7 +25,31 @@
  *
  */
 public interface CustomServiceStateMBean extends ServiceStateMBean {
-
+	
+	/**
+	 * Answer the list of services representing the services this bundle exports
+	 * 
+	 * @param bundleId - the bundle identifier
+	 * @return the list of services
+	 * @throws IOException
+	 *             if the operation fails
+	 * @throws IllegalArgumentException
+	 *             if the bundle indicated does not exist
+	 */
+	CompositeData[] getRegisteredServices(long bundleId) throws IOException;
+	
+	/**
+	 * Answer the list of services which refer to the the services this bundle is using
+	 * 
+	 * @param bundleIdentifier - the bundle identifier
+	 * @return the list of servics
+	 * @throws IOException
+	 *             if the operation fails
+	 * @throws IllegalArgumentException
+	 *             if the bundle indicated does not exist
+	 */
+	CompositeData[] getServicesInUse(long bundleIdentifier) throws IOException;
+	
 	//New methods from the JMX Update RFC 169
 
 	/**
diff --git a/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/ServiceState.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/ServiceState.java
index 2cee22f..dc44225 100644
--- a/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/ServiceState.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/ServiceState.java
@@ -103,6 +103,26 @@
 		return OSGiService.getBundlesUsing(getServiceReference(serviceId));

 	}

 

+	//Local extensions to the API

+

+	/**

+	 * {@inheritDoc}

+	 */

+	public CompositeData[] getRegisteredServices(long bundleId) throws IOException {

+		Bundle bundle = this.getBundle(bundleId);

+		ServiceReference<?>[] registeredServices = bundle.getRegisteredServices();

+		return this.getServicesAsCompositeDatas(registeredServices);

+	}

+

+	/**

+	 * {@inheritDoc}

+	 */

+	public CompositeData[] getServicesInUse(long bundleId) throws IOException {

+		Bundle bundle = this.getBundle(bundleId);

+		ServiceReference<?>[] servicesInUse = bundle.getServicesInUse();

+		return this.getServicesAsCompositeDatas(servicesInUse);

+	}

+	

 	//New methods from the JMX Update RFC 169

 	

 	/**

@@ -188,6 +208,27 @@
 			throw new IOException(e);

 		}

 	}

+

+	private Bundle getBundle(long bundleId){

+		Bundle bundle = bundleContext.getBundle(bundleId);

+		if(bundle == null) {

+			throw new IllegalArgumentException("No such bundle '" + bundleId + "'");

+		}

+		return bundle;

+	}

+	

+	private CompositeData[] getServicesAsCompositeDatas(ServiceReference<?>[] services){

+		CompositeData[] servicesInUseCompositeData;

+		if (services != null) {

+			servicesInUseCompositeData = new CompositeData[services.length];

+			for (int i = 0; i < services.length; i++) {

+				servicesInUseCompositeData[i] = new OSGiService(services[i]).asCompositeData();

+			}

+		} else {

+			servicesInUseCompositeData = new CompositeData[0]; 

+		}

+		return servicesInUseCompositeData;

+	}

 	

 	private ServiceReference<?> getServiceReference(long serviceId) throws IOException {

 		Filter filter;