diff --git a/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/support/ActivateComparator.java b/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/support/ActivateComparator.java index 7cf7a1b3716..1386efa6aed 100644 --- a/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/support/ActivateComparator.java +++ b/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/support/ActivateComparator.java @@ -1,86 +1,94 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.dubbo.common.extension.support; - -import com.alibaba.dubbo.common.extension.Activate; -import com.alibaba.dubbo.common.extension.ExtensionLoader; -import com.alibaba.dubbo.common.extension.SPI; - -import java.util.Comparator; - -/** - * OrderComparetor - */ -public class ActivateComparator implements Comparator { - - public static final Comparator COMPARATOR = new ActivateComparator(); - - @Override - public int compare(Object o1, Object o2) { - if (o1 == null && o2 == null) { - return 0; - } - if (o1 == null) { - return -1; - } - if (o2 == null) { - return 1; - } - if (o1.equals(o2)) { - return 0; - } - Activate a1 = o1.getClass().getAnnotation(Activate.class); - Activate a2 = o2.getClass().getAnnotation(Activate.class); - if ((a1.before().length > 0 || a1.after().length > 0 - || a2.before().length > 0 || a2.after().length > 0) - && o1.getClass().getInterfaces().length > 0 - && o1.getClass().getInterfaces()[0].isAnnotationPresent(SPI.class)) { - ExtensionLoader extensionLoader = ExtensionLoader.getExtensionLoader(o1.getClass().getInterfaces()[0]); - if (a1.before().length > 0 || a1.after().length > 0) { - String n2 = extensionLoader.getExtensionName(o2.getClass()); - for (String before : a1.before()) { - if (before.equals(n2)) { - return -1; - } - } - for (String after : a1.after()) { - if (after.equals(n2)) { - return 1; - } - } - } - if (a2.before().length > 0 || a2.after().length > 0) { - String n1 = extensionLoader.getExtensionName(o1.getClass()); - for (String before : a2.before()) { - if (before.equals(n1)) { - return 1; - } - } - for (String after : a2.after()) { - if (after.equals(n1)) { - return -1; - } - } - } - } - 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; - } - -} +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.common.extension.support; + +import com.alibaba.dubbo.common.extension.Activate; +import com.alibaba.dubbo.common.extension.ExtensionLoader; +import com.alibaba.dubbo.common.extension.SPI; + +import java.util.Comparator; + +/** + * OrderComparetor + */ +public class ActivateComparator implements Comparator { + + public static final Comparator COMPARATOR = new ActivateComparator(); + + @Override + public int compare(Object o1, Object o2) { + if (o1 == null && o2 == null) { + return 0; + } + if (o1 == null) { + return -1; + } + if (o2 == null) { + return 1; + } + if (o1.equals(o2)) { + return 0; + } + Activate a1 = o1.getClass().getAnnotation(Activate.class); + Activate a2 = o2.getClass().getAnnotation(Activate.class); + Class spiClass = null; + if (o1.getClass().getInterfaces().length > 0) { + for (Class item : o1.getClass().getInterfaces()) { + if (item.isAnnotationPresent(SPI.class)) { + spiClass = item; + break; + } + } + } + if ((a1.before().length > 0 || a1.after().length > 0 + || a2.before().length > 0 || a2.after().length > 0) + && spiClass != null) { + ExtensionLoader extensionLoader = ExtensionLoader.getExtensionLoader(spiClass); + if (a1.before().length > 0 || a1.after().length > 0) { + String n2 = extensionLoader.getExtensionName(o2.getClass()); + for (String before : a1.before()) { + if (before.equals(n2)) { + return -1; + } + } + for (String after : a1.after()) { + if (after.equals(n2)) { + return 1; + } + } + } + if (a2.before().length > 0 || a2.after().length > 0) { + String n1 = extensionLoader.getExtensionName(o1.getClass()); + for (String before : a2.before()) { + if (before.equals(n1)) { + return 1; + } + } + for (String after : a2.after()) { + if (after.equals(n1)) { + return -1; + } + } + } + } + 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; + } + +}