Fix for bugzilla 394862
diff --git a/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/ScoutTexts.java b/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/ScoutTexts.java
index 7b2291e..e86ce1c 100644
--- a/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/ScoutTexts.java
+++ b/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/ScoutTexts.java
@@ -41,7 +41,7 @@
private final ITextProviderService[] m_textProviders;
public ScoutTexts() {
- this(SERVICES.getServices(ITextProviderService.class));
+ this(SERVICES.getServicesOrdered(ITextProviderService.class));
}
public ScoutTexts(ITextProviderService[] textProviders) {
diff --git a/org.eclipse.scout.service/src/org/eclipse/scout/service/SERVICES.java b/org.eclipse.scout.service/src/org/eclipse/scout/service/SERVICES.java
index d45a21d..2a715a6 100644
--- a/org.eclipse.scout.service/src/org/eclipse/scout/service/SERVICES.java
+++ b/org.eclipse.scout.service/src/org/eclipse/scout/service/SERVICES.java
@@ -12,11 +12,14 @@
import java.lang.reflect.Array;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
import org.eclipse.scout.commons.logger.IScoutLogger;
import org.eclipse.scout.commons.logger.ScoutLogManager;
import org.eclipse.scout.service.internal.Activator;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
@@ -123,8 +126,26 @@
/**
* @return the services in order of registration (not by ranking)
*/
- @SuppressWarnings("unchecked")
public static <T extends Object> T[] getServices(Class<T> serviceInterfaceClass, String filter) {
+ return getServicesInternal(serviceInterfaceClass, null, false);
+ }
+
+ /**
+ * @return the services in order of ranking
+ */
+ public static <T extends Object> T[] getServicesOrdered(Class<T> serviceInterfaceClass) {
+ return getServicesOrdered(serviceInterfaceClass, null);
+ }
+
+ /**
+ * @return the services in order of ranking
+ */
+ public static <T extends Object> T[] getServicesOrdered(Class<T> serviceInterfaceClass, String filter) {
+ return getServicesInternal(serviceInterfaceClass, null, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <T extends Object> T[] getServicesInternal(Class<T> serviceInterfaceClass, String filter, boolean ordered) {
Activator a = Activator.getDefault();
if (a == null || serviceInterfaceClass == null) {
return (T[]) Array.newInstance(serviceInterfaceClass, 0);
@@ -144,6 +165,14 @@
// nop
}
if (refs != null) {
+ if (ordered) {
+ Arrays.sort(refs, new Comparator<ServiceReference>() {
+ @Override
+ public int compare(ServiceReference ref1, ServiceReference ref2) {
+ return ((Comparable) ref2.getProperty(Constants.SERVICE_RANKING)).compareTo(((Comparable) ref1.getProperty(Constants.SERVICE_RANKING)));
+ }
+ });
+ }
ArrayList<T> list = new ArrayList<T>(refs.length);
for (ServiceReference ref : refs) {
T s = resolveService(serviceInterfaceClass, context, ref);