diff --git a/core/src/main/java/hudson/Extension.java b/core/src/main/java/hudson/Extension.java index 8588dad85b..7a7b971c4c 100644 --- a/core/src/main/java/hudson/Extension.java +++ b/core/src/main/java/hudson/Extension.java @@ -68,4 +68,13 @@ import java.lang.annotation.Target; @Target({TYPE, FIELD, METHOD}) @Documented public @interface Extension { + /** + * Used for sorting extensions. + * + * Extensions will be sorted in the descending order of the ordinal. + * This is a rather poor approach to the problem, so its use is generally discouraged. + * + * @since 1.306 + */ + double ordinal() default 0; } diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index 65355cf7f7..f3c1849c0d 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -35,6 +35,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Vector; +import java.util.Comparator; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -199,6 +200,20 @@ public class ExtensionList extends AbstractList { * The implementation should copy a list, do a sort, and return the new instance. */ protected List sort(List r) { + r = new ArrayList(r); + Collections.sort(r,new Comparator() { + public int compare(T lhs, T rhs) { + Extension el = lhs.getClass().getAnnotation(Extension.class); + Extension er = rhs.getClass().getAnnotation(Extension.class); + // Extension used to be Retention.SOURCE, and we may also end up loading extensions from other places + // like Plexus that don't have any annotations, so we need to be defensive + double l = el!=null ? el.ordinal() : 0; + double r = er!=null ? er.ordinal() : 0; + if(l>r) return -1; + if(l i return DESCRIPTOR; } - @Extension + @Extension(ordinal=1000) public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); public static final class DescriptorImpl extends AbstractProjectDescriptor { diff --git a/maven-plugin/src/main/java/hudson/maven/MavenModuleSet.java b/maven-plugin/src/main/java/hudson/maven/MavenModuleSet.java index c0e3e58968..167683c544 100644 --- a/maven-plugin/src/main/java/hudson/maven/MavenModuleSet.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenModuleSet.java @@ -649,7 +649,7 @@ public final class MavenModuleSet extends AbstractMavenProject