29
29
import java .util .ArrayList ;
30
30
import java .util .List ;
31
31
import java .util .Map ;
32
+ import java .util .Objects ;
32
33
import java .util .concurrent .ConcurrentHashMap ;
33
34
34
35
@@ -43,7 +44,7 @@ public class EventMeshExtensionFactory {
43
44
44
45
private static final List <ExtensionClassLoader > EXTENSION_CLASS_LOADERS = new ArrayList <>();
45
46
46
- private static final ConcurrentHashMap <String , Object > EXTENSION_INSTANCE_CACHE = new ConcurrentHashMap <>(16 );
47
+ private static final ConcurrentHashMap <Extension , Object > EXTENSION_INSTANCE_CACHE = new ConcurrentHashMap <>(16 );
47
48
48
49
static {
49
50
EXTENSION_CLASS_LOADERS .add (MetaInfExtensionClassLoader .getInstance ());
@@ -56,52 +57,72 @@ private EventMeshExtensionFactory() {
56
57
}
57
58
58
59
/**
59
- * @param extensionType extension plugin class type
60
- * @param extensionName extension instance name
61
- * @param <T> the type of the plugin
60
+ * Get an instance of an extension plugin.
61
+ *
62
+ * @param extensionClass extension plugin class type
63
+ * @param extensionName extension instance name
64
+ * @param <T> the type of the plugin
62
65
* @return plugin instance
63
66
*/
64
- public static <T > T getExtension (Class <T > extensionType , String extensionName ) {
65
- if (extensionType == null ) {
66
- throw new ExtensionException ("extensionType is null" );
67
+ public static <T > T getExtension (Class <T > extensionClass , String extensionName ) {
68
+ if (extensionClass == null ) {
69
+ throw new ExtensionException ("extensionClass is null" );
67
70
}
68
71
if (StringUtils .isEmpty (extensionName )) {
69
72
throw new ExtensionException ("extensionName is null" );
70
73
}
71
- if (!extensionType .isInterface () || !extensionType .isAnnotationPresent (EventMeshSPI .class )) {
72
- throw new ExtensionException (String .format ("extensionType :%s is invalided" , extensionType ));
74
+ if (!extensionClass .isInterface () || !extensionClass .isAnnotationPresent (EventMeshSPI .class )) {
75
+ throw new ExtensionException (String .format ("extensionClass :%s is invalided" , extensionClass ));
73
76
}
74
- EventMeshSPI eventMeshSPIAnnotation = extensionType .getAnnotation (EventMeshSPI .class );
77
+ EventMeshSPI eventMeshSPIAnnotation = extensionClass .getAnnotation (EventMeshSPI .class );
75
78
if (eventMeshSPIAnnotation .isSingleton ()) {
76
- return getSingletonExtension (extensionType , extensionName );
79
+ return getSingletonExtension (extensionClass , eventMeshSPIAnnotation , extensionName );
77
80
}
78
- return getPrototypeExtension (extensionType , extensionName );
81
+ return getPrototypeExtension (extensionClass , extensionName );
79
82
}
80
83
84
+ /**
85
+ * Get a singleton instance of an extension plugin.
86
+ *
87
+ * @param extensionClass the type of the extension plugin
88
+ * @param spi the type of the spi
89
+ * @param extensionInstanceName the name of the extension instance
90
+ * @param <T> the type of the extension plugin
91
+ * @return a singleton instance of the extension plugin
92
+ */
81
93
@ SuppressWarnings ("unchecked" )
82
- private static <T > T getSingletonExtension (Class <T > extensionType , String extensionInstanceName ) {
83
- return (T ) EXTENSION_INSTANCE_CACHE .computeIfAbsent (extensionInstanceName , name -> {
84
- Class <T > extensionInstanceClass = getExtensionInstanceClass (extensionType , extensionInstanceName );
94
+ private static <T > T getSingletonExtension (Class <T > extensionClass , EventMeshSPI spi , String extensionInstanceName ) {
95
+ return (T ) EXTENSION_INSTANCE_CACHE .computeIfAbsent (new Extension ( spi , extensionInstanceName ) , name -> {
96
+ Class <T > extensionInstanceClass = getExtensionInstanceClass (extensionClass , extensionInstanceName );
85
97
if (extensionInstanceClass == null ) {
98
+ log .warn ("Get extension instance class {} is null" , extensionClass .getName ());
86
99
return null ;
87
100
}
88
101
try {
89
102
T extensionInstance = extensionInstanceClass .getDeclaredConstructor ().newInstance ();
90
103
ConfigService .getInstance ().populateConfigForObject (extensionInstance );
91
104
92
- log .info ("initialize extension instance success, extensionType : {}, extensionInstanceName: {}" ,
93
- extensionType , extensionInstanceName );
105
+ log .info ("initialize extension instance success, extensionClass : {}, extensionInstanceName: {}" ,
106
+ extensionClass , extensionInstanceName );
94
107
return extensionInstance ;
95
108
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e ) {
96
109
throw new ExtensionException ("Extension initialize error" , e );
97
110
} catch (NoSuchFieldException | IOException e ) {
98
- log .error ("initialize extension instance config failed, extensionType : {}, extensionInstanceName: {}" ,
99
- extensionType , extensionInstanceName , e );
111
+ log .error ("initialize extension instance config failed, extensionClass : {}, extensionInstanceName: {}" ,
112
+ extensionClass , extensionInstanceName , e );
100
113
throw new ExtensionException ("Extension initialize error" , e );
101
114
}
102
115
});
103
116
}
104
117
118
+ /**
119
+ * Get a new instance of an extension plugin.
120
+ *
121
+ * @param extensionType the type of the extension plugin
122
+ * @param extensionInstanceName the name of the extension instance
123
+ * @param <T> the type of the extension plugin
124
+ * @return a new instance of the extension plugin
125
+ */
105
126
private static <T > T getPrototypeExtension (Class <T > extensionType , String extensionInstanceName ) {
106
127
Class <T > extensionInstanceClass = getExtensionInstanceClass (extensionType , extensionInstanceName );
107
128
if (extensionInstanceClass == null ) {
@@ -123,6 +144,14 @@ private static <T> T getPrototypeExtension(Class<T> extensionType, String extens
123
144
}
124
145
}
125
146
147
+ /**
148
+ * Get the class of an extension instance.
149
+ *
150
+ * @param extensionType the type of the extension instance
151
+ * @param extensionInstanceName the name of the extension instance
152
+ * @param <T> the type of the extension instance
153
+ * @return the class of the extension instance
154
+ */
126
155
@ SuppressWarnings ("unchecked" )
127
156
private static <T > Class <T > getExtensionInstanceClass (Class <T > extensionType , String extensionInstanceName ) {
128
157
for (ExtensionClassLoader extensionClassLoader : EXTENSION_CLASS_LOADERS ) {
@@ -134,4 +163,33 @@ private static <T> Class<T> getExtensionInstanceClass(Class<T> extensionType, St
134
163
}
135
164
return null ;
136
165
}
166
+
167
+ private static class Extension {
168
+
169
+ private EventMeshSPI spi ;
170
+
171
+ private String extensionInstanceName ;
172
+
173
+ public Extension (EventMeshSPI spi , String extensionInstanceName ) {
174
+ this .spi = spi ;
175
+ this .extensionInstanceName = extensionInstanceName ;
176
+ }
177
+
178
+ @ Override
179
+ public boolean equals (Object o ) {
180
+ if (this == o ) {
181
+ return true ;
182
+ }
183
+ if (!(o instanceof Extension )) {
184
+ return false ;
185
+ }
186
+ Extension extension = (Extension ) o ;
187
+ return Objects .equals (spi , extension .spi ) && Objects .equals (extensionInstanceName , extension .extensionInstanceName );
188
+ }
189
+
190
+ @ Override
191
+ public int hashCode () {
192
+ return Objects .hash (spi , extensionInstanceName );
193
+ }
194
+ }
137
195
}
0 commit comments