From e692d8a87af4c995d1824dfaa10f12daf57be2cb Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Sat, 2 Feb 2019 10:43:50 +0800 Subject: [PATCH] implement pull request #3412 on master branch (#3418) --- .../extension/support/ActivateComparator.java | 129 ++++++++++-------- 1 file changed, 74 insertions(+), 55 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java index 766099fafa7..5dcedc38cc4 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/support/ActivateComparator.java @@ -19,7 +19,9 @@ import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.extension.SPI; +import org.apache.dubbo.common.utils.ArrayUtils; +import java.util.Arrays; import java.util.Comparator; /** @@ -44,75 +46,92 @@ public int compare(Object o1, Object o2) { return 0; } - // to support com.alibab.dubbo.common.extension.Activate - String[] a1Before, a2Before, a1After, a2After; - int a1Order, a2Order; - Class inf = null; - if (o1.getClass().getInterfaces().length > 0) { - inf = o1.getClass().getInterfaces()[0]; + Class inf = findSpi(o1.getClass()); - if (inf.getInterfaces().length > 0) { - inf = inf.getInterfaces()[0]; - } - } + ActivateInfo a1 = parseActivate(o1.getClass()); + ActivateInfo a2 = parseActivate(o2.getClass()); - Activate a1 = o1.getClass().getAnnotation(Activate.class); - if (a1 != null) { - a1Before = a1.before(); - a1After = a1.after(); - a1Order = a1.order(); - } else { - com.alibaba.dubbo.common.extension.Activate oa1 = o1.getClass().getAnnotation(com.alibaba.dubbo.common.extension.Activate.class); - a1Before = oa1.before(); - a1After = oa1.after(); - a1Order = oa1.order(); - } - Activate a2 = o2.getClass().getAnnotation(Activate.class); - if (a2 != null) { - a2Before = a2.before(); - a2After = a2.after(); - a2Order = a2.order(); - } else { - com.alibaba.dubbo.common.extension.Activate oa2 = o2.getClass().getAnnotation(com.alibaba.dubbo.common.extension.Activate.class); - a2Before = oa2.before(); - a2After = oa2.after(); - a2Order = oa2.order(); - } - if ((a1Before.length > 0 || a1After.length > 0 - || a2Before.length > 0 || a2After.length > 0) - && inf != null && inf.isAnnotationPresent(SPI.class)) { + if ((a1.applicableToCompare() || a2.applicableToCompare()) && inf != null) { ExtensionLoader extensionLoader = ExtensionLoader.getExtensionLoader(inf); - if (a1Before.length > 0 || a1After.length > 0) { + if (a1.applicableToCompare()) { String n2 = extensionLoader.getExtensionName(o2.getClass()); - for (String before : a1Before) { - if (before.equals(n2)) { - return -1; - } + if (a1.isLess(n2)) { + return -1; } - for (String after : a1After) { - if (after.equals(n2)) { - return 1; - } + + if (a1.isMore(n2)) { + return 1; } } - if (a2Before.length > 0 || a2After.length > 0) { + + if (a2.applicableToCompare()) { String n1 = extensionLoader.getExtensionName(o1.getClass()); - for (String before : a2Before) { - if (before.equals(n1)) { - return 1; - } + if (a2.isLess(n1)) { + return 1; } - for (String after : a2After) { - if (after.equals(n1)) { - return -1; - } + + if (a2.isMore(n1)) { + return -1; } } } - int n1 = a1 == null ? 0 : a1Order; - int n2 = a2 == null ? 0 : a2Order; + int n1 = a1 == null ? 0 : a1.order; + int n2 = a2 == null ? 0 : a2.order; // never return 0 even if n1 equals n2, otherwise, o1 and o2 will override each other in collection like HashSet return n1 > n2 ? 1 : -1; } + private Class findSpi(Class clazz) { + if (clazz.getInterfaces().length <= 0) { + return null; + } + + for (Class intf : clazz.getInterfaces()) { + if (intf.isAnnotationPresent(SPI.class)) { + return intf; + } else { + Class result = findSpi(intf); + if (result != null) { + return result; + } + } + } + + return null; + } + + private ActivateInfo parseActivate(Class clazz) { + ActivateInfo info = new ActivateInfo(); + if (clazz.isAnnotationPresent(Activate.class)) { + Activate activate = clazz.getAnnotation(Activate.class); + info.before = activate.before(); + info.after = activate.after(); + info.order = activate.order(); + } else { + com.alibaba.dubbo.common.extension.Activate activate = clazz.getAnnotation( + com.alibaba.dubbo.common.extension.Activate.class); + info.before = activate.before(); + info.after = activate.after(); + info.order = activate.order(); + } + return info; + } + + private static class ActivateInfo { + private String[] before; + private String[] after; + private int order; + + private boolean applicableToCompare() { + return ArrayUtils.isNotEmpty(before) || ArrayUtils.isNotEmpty(after); + } + + private boolean isLess(String name) { + return Arrays.asList(before).contains(name); + } + + private boolean isMore(String name) { + return Arrays.asList(after).contains(name); + } + } }