FELIX-6178: getServicesInUse returns services with usage count = 0 (patch provided by Renat Sabitov - many thanks)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1866509 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/pom.xml b/framework/pom.xml
index f6b290f..77ab2e1 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -121,6 +121,15 @@
</resource>
</resources>
</build>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-core</artifactId>
+ <version>1.3</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
<dependencies>
<dependency>
<groupId>org.osgi</groupId>
@@ -154,7 +163,7 @@
</dependency>
<dependency>
<groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
+ <artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
index 8c94ca8..68bab2c 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
@@ -280,11 +280,23 @@
if (usages != null)
{
final ServiceReference<?>[] refs = new ServiceReference[usages.length];
- for (int i = 0; i < refs.length; i++)
+ int count = 0;
+ for (int i = 0; i < usages.length; i++)
{
- refs[i] = usages[i].m_ref;
+ if (usages[i].m_count.get() > 0) {
+ refs[count++] = usages[i].m_ref;
+ }
}
- return refs;
+
+ if (count == usages.length) {
+ return refs;
+ } else if (count == 0) {
+ return null;
+ }
+
+ ServiceReference<?>[] nrefs = new ServiceReference[count];
+ System.arraycopy(refs, 0, nrefs, 0, count);
+ return nrefs;
}
return null;
}
diff --git a/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java b/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java
index b83eef4..3c8e478 100644
--- a/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java
+++ b/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java
@@ -1237,10 +1237,7 @@
ServiceRegistry sr = new ServiceRegistry(null, null);
Bundle regBundle = Mockito.mock(Bundle.class);
- ServiceRegistration reg = sr.registerService(
- regBundle, new String [] {String.class.getName()}, "hi", null);
- @SuppressWarnings("unchecked")
- ServiceReference<String> ref = reg.getReference();
+ ServiceReference<String> ref = registerService(sr, regBundle, "hi");
final Bundle clientBundle = Mockito.mock(Bundle.class);
Mockito.when(clientBundle.getBundleId()).thenReturn(42L);
@@ -1250,9 +1247,41 @@
Mockito.when(clientBundle.getBundleId()).thenReturn(327L);
assertThat(sr.getService(clientBundle2, ref, false), is("hi"));
- assertThat(sr.ungetService(clientBundle, reg.getReference(), null), is(true));
+ assertThat(sr.ungetService(clientBundle, ref, null), is(true));
- assertThat(sr.getUsingBundles(reg.getReference()), is(new Bundle[]{clientBundle2}));
+ assertThat(sr.getUsingBundles(ref), is(new Bundle[]{clientBundle2}));
+ }
+
+ public void testServicesInUseWithoutZeroCounts() throws Exception
+ {
+ ServiceRegistry sr = new ServiceRegistry(null, null);
+ Bundle regBundle = Mockito.mock(Bundle.class);
+
+ ServiceReference<String> refHi = registerService(sr, regBundle, "hi");
+ ServiceReference<String> refBye = registerService(sr, regBundle, "bye");
+
+ final Bundle clientBundle = Mockito.mock(Bundle.class);
+ Mockito.when(clientBundle.getBundleId()).thenReturn(42L);
+
+ sr.getService(clientBundle, refHi, false);
+ sr.getService(clientBundle, refBye, false);
+ assertThat(sr.getServicesInUse(clientBundle).length, is(2));
+
+ sr.ungetService(clientBundle, refBye, null);
+ assertThat(sr.getServicesInUse(clientBundle), is(new ServiceReference[]{refHi}));
+
+ sr.ungetService(clientBundle, refHi, null);
+ assertThat(sr.getServicesInUse(clientBundle), nullValue());
+ }
+
+ private ServiceReference<String> registerService(ServiceRegistry sr, Bundle regBundle, String svcObj) {
+ ServiceRegistration reg = sr.registerService(
+ regBundle, new String [] {String.class.getName()}, svcObj, null);
+
+ @SuppressWarnings("unchecked")
+ ServiceReference<String> ref = reg.getReference();
+
+ return ref;
}
private Object getPrivateField(Object obj, String fieldName) throws NoSuchFieldException,