21
21
import org .apache .dubbo .common .extension .support .ActivateComparator ;
22
22
import org .apache .dubbo .common .logger .Logger ;
23
23
import org .apache .dubbo .common .logger .LoggerFactory ;
24
+ import org .apache .dubbo .common .utils .ArrayUtils ;
24
25
import org .apache .dubbo .common .utils .ClassHelper ;
25
26
import org .apache .dubbo .common .utils .ConcurrentHashSet ;
26
27
import org .apache .dubbo .common .utils .ConfigUtils ;
@@ -692,20 +693,9 @@ private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL reso
692
693
+ clazz .getName () + " is not subtype of interface." );
693
694
}
694
695
if (clazz .isAnnotationPresent (Adaptive .class )) {
695
- if (cachedAdaptiveClass == null ) {
696
- cachedAdaptiveClass = clazz ;
697
- } else if (!cachedAdaptiveClass .equals (clazz )) {
698
- throw new IllegalStateException ("More than 1 adaptive class found: "
699
- + cachedAdaptiveClass .getClass ().getName ()
700
- + ", " + clazz .getClass ().getName ());
701
- }
696
+ cacheAdaptiveClass (clazz );
702
697
} else if (isWrapperClass (clazz )) {
703
- Set <Class <?>> wrappers = cachedWrapperClasses ;
704
- if (wrappers == null ) {
705
- cachedWrapperClasses = new ConcurrentHashSet <>();
706
- wrappers = cachedWrapperClasses ;
707
- }
708
- wrappers .add (clazz );
698
+ cacheWrapperClass (clazz );
709
699
} else {
710
700
clazz .getConstructor ();
711
701
if (StringUtils .isEmpty (name )) {
@@ -714,33 +704,87 @@ private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL reso
714
704
throw new IllegalStateException ("No such extension name for the class " + clazz .getName () + " in the config " + resourceURL );
715
705
}
716
706
}
707
+
717
708
String [] names = NAME_SEPARATOR .split (name );
718
- if (names != null && names .length > 0 ) {
719
- Activate activate = clazz .getAnnotation (Activate .class );
720
- if (activate != null ) {
721
- cachedActivates .put (names [0 ], activate );
722
- } else {
723
- // support com.alibaba.dubbo.common.extension.Activate
724
- com .alibaba .dubbo .common .extension .Activate oldActivate = clazz .getAnnotation (com .alibaba .dubbo .common .extension .Activate .class );
725
- if (oldActivate != null ) {
726
- cachedActivates .put (names [0 ], oldActivate );
727
- }
728
- }
709
+ if (ArrayUtils .isNotEmpty (names )) {
710
+ cacheActivateClass (clazz , names [0 ]);
729
711
for (String n : names ) {
730
- if (!cachedNames .containsKey (clazz )) {
731
- cachedNames .put (clazz , n );
732
- }
733
- Class <?> c = extensionClasses .get (n );
734
- if (c == null ) {
735
- extensionClasses .put (n , clazz );
736
- } else if (c != clazz ) {
737
- throw new IllegalStateException ("Duplicate extension " + type .getName () + " name " + n + " on " + c .getName () + " and " + clazz .getName ());
738
- }
712
+ cacheName (clazz , n );
713
+ saveInExtensionClass (extensionClasses , clazz , name );
739
714
}
740
715
}
741
716
}
742
717
}
743
718
719
+ /**
720
+ * cache name
721
+ */
722
+ private void cacheName (Class <?> clazz , String name ) {
723
+ if (!cachedNames .containsKey (clazz )) {
724
+ cachedNames .put (clazz , name );
725
+ }
726
+ }
727
+
728
+ /**
729
+ * put clazz in extensionClasses
730
+ */
731
+ private void saveInExtensionClass (Map <String , Class <?>> extensionClasses , Class <?> clazz , String name ) {
732
+ Class <?> c = extensionClasses .get (name );
733
+ if (c == null ) {
734
+ extensionClasses .put (name , clazz );
735
+ } else if (c != clazz ) {
736
+ throw new IllegalStateException ("Duplicate extension " + type .getName () + " name " + name + " on " + c .getName () + " and " + clazz .getName ());
737
+ }
738
+ }
739
+
740
+ /**
741
+ * cache Activate class which is annotated with <code>Activate</code>
742
+ * <p>
743
+ * for compatibility, also cache class with old alibaba Activate annotation
744
+ */
745
+ private void cacheActivateClass (Class <?> clazz , String name ) {
746
+ Activate activate = clazz .getAnnotation (Activate .class );
747
+ if (activate != null ) {
748
+ cachedActivates .put (name , activate );
749
+ } else {
750
+ // support com.alibaba.dubbo.common.extension.Activate
751
+ com .alibaba .dubbo .common .extension .Activate oldActivate = clazz .getAnnotation (com .alibaba .dubbo .common .extension .Activate .class );
752
+ if (oldActivate != null ) {
753
+ cachedActivates .put (name , oldActivate );
754
+ }
755
+ }
756
+ }
757
+
758
+ /**
759
+ * cache Adaptive class which is annotated with <code>Adaptive</code>
760
+ */
761
+ private void cacheAdaptiveClass (Class <?> clazz ) {
762
+ if (cachedAdaptiveClass == null ) {
763
+ cachedAdaptiveClass = clazz ;
764
+ } else if (!cachedAdaptiveClass .equals (clazz )) {
765
+ throw new IllegalStateException ("More than 1 adaptive class found: "
766
+ + cachedAdaptiveClass .getClass ().getName ()
767
+ + ", " + clazz .getClass ().getName ());
768
+ }
769
+ }
770
+
771
+ /**
772
+ * cache wrapper class
773
+ * <p>
774
+ * like: ProtocolFilterWrapper, ProtocolListenerWrapper
775
+ */
776
+ private void cacheWrapperClass (Class <?> clazz ) {
777
+ if (cachedWrapperClasses == null ) {
778
+ cachedWrapperClasses = new ConcurrentHashSet <>();
779
+ }
780
+ cachedWrapperClasses .add (clazz );
781
+ }
782
+
783
+ /**
784
+ * test if clazz is a wrapper class
785
+ * <p>
786
+ * which has Constructor with given class type as its only argument
787
+ */
744
788
private boolean isWrapperClass (Class <?> clazz ) {
745
789
try {
746
790
clazz .getConstructor (type );
0 commit comments