[bug 316385] Give priority to non-JSF tools factory delegates if registered. In 3.3 we will improve the API to provide for this explicitly.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java
index 4dde2c0..2a88ad6 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java
@@ -15,6 +15,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -61,7 +62,44 @@
{
if (isValidDelegate(delegate))
{
- _delegates.addIfAbsent(delegate);
+ synchronized(_delegates)
+ {
+ _delegates.addIfAbsent(delegate);
+ if (_delegates.size() > 1)
+ {
+ List<IAdaptable> delegates = new ArrayList<IAdaptable>(_delegates);
+
+ Collections.sort(delegates, new Comparator()
+ {
+ public int compare(Object delegate1, Object delegate2)
+ {
+ final Class<?> clazz1 = delegate1.getClass();
+ final Class<?> clazz2 = delegate2.getClass();
+
+ Package package1 = clazz1.getPackage();
+ Package package2 = clazz2.getPackage();
+ boolean package1IsOSS = package1.getName().startsWith("org.eclipse.jst"); //$NON-NLS-1$
+ boolean package2IsOSS = package2.getName().startsWith("org.eclipse.jst"); //$NON-NLS-1$
+
+ if (package1IsOSS && !package2IsOSS)
+ {
+ // sort the oss one after the non-oss one
+ return 1;
+ }
+ else if (!package1IsOSS && package2IsOSS)
+ {
+ return -1;
+ }
+
+ // otherwise they are either both oss or both non-oss, so just
+ // sort canonically by name.
+ return clazz1.getName().compareTo(clazz2.getName());
+ }
+ });
+ _delegates.clear();
+ _delegates.addAll(delegates);
+ }
+ }
}
}