You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2017/02/02 11:47:34 UTC

karaf git commit: [KARAF-4974] Fix for ArrayIndexOutOfBoundsException in service list

Repository: karaf
Updated Branches:
  refs/heads/master 0a92dab2a -> 4dbd30403


[KARAF-4974] Fix for ArrayIndexOutOfBoundsException in service list


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/4dbd3040
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/4dbd3040
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/4dbd3040

Branch: refs/heads/master
Commit: 4dbd30403bb37b59244a856e60c7ff9630b6a5d0
Parents: 0a92dab
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Thu Feb 2 12:47:16 2017 +0100
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Thu Feb 2 12:47:16 2017 +0100

----------------------------------------------------------------------
 .../karaf/service/command/ListServices.java     | 24 +++++++++++++++-----
 .../service/command/ObjectClassMatcherTest.java |  3 +--
 .../service/command/TestBundleFactory.java      |  7 ++++--
 3 files changed, 24 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/4dbd3040/service/core/src/main/java/org/apache/karaf/service/command/ListServices.java
----------------------------------------------------------------------
diff --git a/service/core/src/main/java/org/apache/karaf/service/command/ListServices.java b/service/core/src/main/java/org/apache/karaf/service/command/ListServices.java
index aed352e..c4036cd 100644
--- a/service/core/src/main/java/org/apache/karaf/service/command/ListServices.java
+++ b/service/core/src/main/java/org/apache/karaf/service/command/ListServices.java
@@ -101,9 +101,11 @@ public class ListServices implements Action {
             if (services != null) {
                 for (ServiceReference<?> serviceReference : services) {
                     String[] names = (String[])serviceReference.getProperty(Constants.OBJECTCLASS);
-                    for (String name : names) {
-                        int curCount = (serviceNames.containsKey(name)) ? serviceNames.get(name) : 0;
-                        serviceNames.put(name, curCount + 1);
+                    if (names != null) {
+                    	for (String name : names) {
+                    		int curCount = (serviceNames.containsKey(name)) ? serviceNames.get(name) : 0;
+                    		serviceNames.put(name, curCount + 1);
+                    	}
                     }
                 }
             }
@@ -152,13 +154,23 @@ public class ListServices implements Action {
     public final class ServiceClassComparator implements Comparator<ServiceReference<?>> {
         @Override
         public int compare(ServiceReference<?> o1, ServiceReference<?> o2) {
-            String[] classes1 = (String[])o1.getProperty(Constants.OBJECTCLASS);
-            String[] classes2 = (String[])o2.getProperty(Constants.OBJECTCLASS);
-            return classes1[0].compareTo(classes2[0]);
+        	String class1 = getObjectClass(o1);
+        	String class2 = getObjectClass(o2);
+            return class1.compareTo(class2);
         }
+
+		private String getObjectClass(ServiceReference<?> o1) {
+			Object value = o1.getProperty(Constants.OBJECTCLASS);
+			if (value == null || !(value instanceof String[])) {
+				return "";
+			}
+			String[] values = (String[]) value; 
+			return values.length == 0 ? "" : values[0];
+		}
     }
 
     public void setBundleContext(BundleContext bundleContext) {
         this.bundleContext = bundleContext;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/4dbd3040/service/core/src/test/java/org/apache/karaf/service/command/ObjectClassMatcherTest.java
----------------------------------------------------------------------
diff --git a/service/core/src/test/java/org/apache/karaf/service/command/ObjectClassMatcherTest.java b/service/core/src/test/java/org/apache/karaf/service/command/ObjectClassMatcherTest.java
index 296b591..890ee04 100644
--- a/service/core/src/test/java/org/apache/karaf/service/command/ObjectClassMatcherTest.java
+++ b/service/core/src/test/java/org/apache/karaf/service/command/ObjectClassMatcherTest.java
@@ -16,8 +16,7 @@
  */
 package org.apache.karaf.service.command;
 
-import junit.framework.Assert;
-
+import org.junit.Assert;
 import org.junit.Test;
 
 public class ObjectClassMatcherTest {

http://git-wip-us.apache.org/repos/asf/karaf/blob/4dbd3040/service/core/src/test/java/org/apache/karaf/service/command/TestBundleFactory.java
----------------------------------------------------------------------
diff --git a/service/core/src/test/java/org/apache/karaf/service/command/TestBundleFactory.java b/service/core/src/test/java/org/apache/karaf/service/command/TestBundleFactory.java
index 3d83670..66e86dc 100644
--- a/service/core/src/test/java/org/apache/karaf/service/command/TestBundleFactory.java
+++ b/service/core/src/test/java/org/apache/karaf/service/command/TestBundleFactory.java
@@ -64,9 +64,11 @@ public class TestBundleFactory {
         ServiceReference<?> ref1 = createServiceRef(Constants.OBJECTCLASS, new String[]{"org.example.MyService"},
             "key1", "value1");
         ServiceReference<?> ref2 = createServiceRef(Constants.OBJECTCLASS, new String[]{"org.example.OtherService"}, "key2", 1);
+        // No ObjectClass which can happen for gogo commands
+        ServiceReference<?> ref3 = createServiceRef(Constants.OBJECTCLASS, new String[]{}, "osgi.command.scope", "task");
 
         addRegisteredServices(bundle1, ref1, ref2);
-        addRegisteredServices(bundle2, ref2);
+        addRegisteredServices(bundle2, ref2, ref3);
         expect(bundle3.getRegisteredServices()).andReturn(null).anyTimes();
 
         expect(bundle1.getServicesInUse()).andReturn(null).anyTimes();
@@ -75,8 +77,9 @@ public class TestBundleFactory {
         
         expect(ref1.getUsingBundles()).andReturn(new Bundle[]{bundle2, bundle3}).anyTimes();
         expect(ref2.getUsingBundles()).andReturn(new Bundle[]{bundle3}).anyTimes();
+        expect(ref3.getUsingBundles()).andReturn(new Bundle[]{bundle3}).anyTimes();
 
-        replay(bundle1, bundle2, bundle3, ref1, ref2);
+        replay(bundle1, bundle2, bundle3, ref1, ref2, ref3);
         return new Bundle[] { bundle1, bundle2, bundle3 };
     }