2121import org .apache .dubbo .common .extension .support .ActivateComparator ;
2222import org .apache .dubbo .common .logger .Logger ;
2323import org .apache .dubbo .common .logger .LoggerFactory ;
24+ import org .apache .dubbo .common .utils .ArrayUtils ;
2425import org .apache .dubbo .common .utils .ClassHelper ;
2526import org .apache .dubbo .common .utils .ConcurrentHashSet ;
2627import org .apache .dubbo .common .utils .ConfigUtils ;
@@ -692,20 +693,9 @@ private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL reso
692693 + clazz .getName () + " is not subtype of interface." );
693694 }
694695 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 );
702697 } 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 );
709699 } else {
710700 clazz .getConstructor ();
711701 if (StringUtils .isEmpty (name )) {
@@ -714,33 +704,87 @@ private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL reso
714704 throw new IllegalStateException ("No such extension name for the class " + clazz .getName () + " in the config " + resourceURL );
715705 }
716706 }
707+
717708 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 ]);
729711 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 );
739714 }
740715 }
741716 }
742717 }
743718
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+ */
744788 private boolean isWrapperClass (Class <?> clazz ) {
745789 try {
746790 clazz .getConstructor (type );
0 commit comments