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,