11package org .keycloak .test .framework .injection ;
22
33import org .junit .jupiter .api .extension .ExtensionContext ;
4- import org .keycloak .test .framework .TestFrameworkExtension ;
5- import org .keycloak .test .framework .config .Config ;
64
75import java .lang .annotation .Annotation ;
86import java .lang .reflect .Field ;
97import java .util .Arrays ;
108import java .util .Comparator ;
11- import java .util .HashSet ;
129import java .util .Iterator ;
1310import java .util .LinkedList ;
1411import java .util .List ;
1512import java .util .Objects ;
16- import java .util .Optional ;
17- import java .util .ServiceLoader ;
1813import java .util .Set ;
19- import java .util .stream .Collectors ;
2014
2115@ SuppressWarnings ({"rawtypes" , "unchecked" })
2216public class Registry implements ExtensionContext .Store .CloseableResource {
2317
24- private RegistryLogger logger ;
18+ private final RegistryLogger logger ;
2519
2620 private ExtensionContext currentContext ;
27- private final List < Supplier <?, ?>> suppliers = new LinkedList <>() ;
21+ private final Extensions extensions ;
2822 private final List <InstanceContext <?, ?>> deployedInstances = new LinkedList <>();
2923 private final List <RequestedInstance <?, ?>> requestedInstances = new LinkedList <>();
3024
3125 public Registry () {
32- loadSuppliers ();
26+ extensions = new Extensions ();
27+ logger = new RegistryLogger (extensions .getValueTypeAlias ());
28+ }
29+
30+ RegistryLogger getLogger () {
31+ return logger ;
3332 }
3433
3534 public ExtensionContext getCurrentContext () {
@@ -48,11 +47,11 @@ public <T> T getDependency(Class<T> typeClass, String ref, InstanceContext depen
4847 return dependency ;
4948 } else {
5049 dependency = getRequestedDependency (typeClass , ref , dependent );
51- if (dependency != null ) {
50+ if (dependency != null ) {
5251 return dependency ;
5352 } else {
5453 dependency = getUnConfiguredDependency (typeClass , ref , dependent );
55- if (dependency != null ) {
54+ if (dependency != null ) {
5655 return dependency ;
5756 }
5857 }
@@ -100,22 +99,18 @@ private <T> T getRequestedDependency(Class<T> typeClass, String ref, InstanceCon
10099
101100 private <T > T getUnConfiguredDependency (Class <T > typeClass , String ref , InstanceContext dependent ) {
102101 InstanceContext dependency ;
103- Optional <Supplier <?, ?>> supplied = suppliers .stream ().filter (s -> s .getValueType ().equals (typeClass )).findFirst ();
104- if (supplied .isPresent ()) {
105- Supplier <T , ?> supplier = (Supplier <T , ?>) supplied .get ();
106- Annotation defaultAnnotation = DefaultAnnotationProxy .proxy (supplier .getAnnotationClass ());
107- dependency = new InstanceContext (-1 , this , supplier , defaultAnnotation , typeClass );
102+ Supplier <?, ?> supplier = extensions .findSupplierByType (typeClass );
103+ Annotation defaultAnnotation = DefaultAnnotationProxy .proxy (supplier .getAnnotationClass ());
104+ dependency = new InstanceContext (-1 , this , supplier , defaultAnnotation , typeClass );
108105
109- dependency .registerDependency (dependent );
110- dependency .setValue (supplier .getValue (dependency ));
106+ dependency .registerDependency (dependent );
107+ dependency .setValue (supplier .getValue (dependency ));
111108
112- deployedInstances .add (dependency );
109+ deployedInstances .add (dependency );
113110
114- logger .logDependencyInjection (dependent , dependency , RegistryLogger .InjectionType .UN_CONFIGURED );
111+ logger .logDependencyInjection (dependent , dependency , RegistryLogger .InjectionType .UN_CONFIGURED );
115112
116- return (T ) dependency .getValue ();
117- }
118- return null ;
113+ return (T ) dependency .getValue ();
119114 }
120115
121116 public void beforeEach (Object testInstance ) {
@@ -127,6 +122,14 @@ public void beforeEach(Object testInstance) {
127122 }
128123
129124 private void findRequestedInstances (Object testInstance ) {
125+ List <Class <?>> alwaysEnabledValueTypes = extensions .getAlwaysEnabledValueTypes ();
126+ for (Class <?> valueType : alwaysEnabledValueTypes ) {
127+ RequestedInstance requestedInstance = createRequestedInstance (null , valueType );
128+ if (requestedInstance != null ) {
129+ requestedInstances .add (requestedInstance );
130+ }
131+ }
132+
130133 Class testClass = testInstance .getClass ();
131134 RequestedInstance requestedServerInstance = createRequestedInstance (testClass .getAnnotations (), null );
132135 if (requestedServerInstance != null ) {
@@ -178,7 +181,7 @@ private void deployRequestedInstances() {
178181 private void injectFields (Object testInstance ) {
179182 for (Field f : listFields (testInstance .getClass ())) {
180183 InstanceContext <?, ?> instance = getDeployedInstance (f .getType (), f .getAnnotations ());
181- if (instance == null ) { // a test class might have fields not meant for injection
184+ if (instance == null ) { // a test class might have fields not meant for injection
182185 continue ;
183186 }
184187 try {
@@ -221,16 +224,23 @@ public void close() {
221224 }
222225
223226 List <Supplier <?, ?>> getSuppliers () {
224- return suppliers ;
227+ return extensions . getSuppliers () ;
225228 }
226229
227230 private RequestedInstance <?, ?> createRequestedInstance (Annotation [] annotations , Class <?> valueType ) {
228- for (Annotation a : annotations ) {
229- for (Supplier s : suppliers ) {
230- if (s .getAnnotationClass ().equals (a .annotationType ())) {
231- return new RequestedInstance (s , a , valueType );
231+ if (annotations != null ) {
232+ for (Annotation annotation : annotations ) {
233+ Supplier <?, ?> supplier = extensions .findSupplierByAnnotation (annotation );
234+ if (supplier != null ) {
235+ return new RequestedInstance (supplier , annotation , valueType );
232236 }
233237 }
238+ } else {
239+ Supplier <?, ?> supplier = extensions .findSupplierByType (valueType );
240+ if (supplier != null ) {
241+ Annotation defaultAnnotation = DefaultAnnotationProxy .proxy (supplier .getAnnotationClass ());
242+ return new RequestedInstance (supplier , defaultAnnotation , valueType );
243+ }
234244 }
235245 return null ;
236246 }
@@ -241,7 +251,7 @@ public void close() {
241251 Supplier supplier = i .getSupplier ();
242252 if (supplier .getAnnotationClass ().equals (a .annotationType ())
243253 && valueType .isAssignableFrom (i .getValue ().getClass ())
244- && Objects .equals (supplier .getRef (a ), i .getRef ()) ) {
254+ && Objects .equals (supplier .getRef (a ), i .getRef ())) {
245255 return i ;
246256 }
247257 }
@@ -264,7 +274,7 @@ private InstanceContext getDeployedInstance(RequestedInstance requestedInstance)
264274 String requestedRef = requestedInstance .getRef ();
265275 Class requestedValueType = requestedInstance .getValueType ();
266276 for (InstanceContext <?, ?> i : deployedInstances ) {
267- if (!Objects .equals (i .getRef (), requestedRef )) {
277+ if (!Objects .equals (i .getRef (), requestedRef )) {
268278 continue ;
269279 }
270280
@@ -279,47 +289,6 @@ private InstanceContext getDeployedInstance(RequestedInstance requestedInstance)
279289 return null ;
280290 }
281291
282- private void loadSuppliers () {
283- Iterator <TestFrameworkExtension > extensions = ServiceLoader .load (TestFrameworkExtension .class ).iterator ();
284- ValueTypeAlias valueTypeAlias = new ValueTypeAlias ();
285- List <Supplier > tmp = new LinkedList <>();
286- while (extensions .hasNext ()) {
287- TestFrameworkExtension extension = extensions .next ();
288- tmp .addAll (extension .suppliers ());
289- valueTypeAlias .addAll (extension .valueTypeAliases ());
290- }
291-
292- logger = new RegistryLogger (valueTypeAlias );
293-
294- Set <Class > loadedValueTypes = new HashSet <>();
295- Set <Supplier > skippedSuppliers = new HashSet <>();
296-
297- for (Supplier supplier : tmp ) {
298- boolean shouldAdd = false ;
299- Class supplierValueType = supplier .getValueType ();
300-
301- if (!loadedValueTypes .contains (supplierValueType )) {
302- String requestedSupplier = Config .getSelectedSupplier (supplierValueType , valueTypeAlias );
303- if (requestedSupplier != null ) {
304- if (requestedSupplier .equals (supplier .getAlias ())) {
305- shouldAdd = true ;
306- }
307- } else {
308- shouldAdd = true ;
309- }
310- }
311-
312- if (shouldAdd ) {
313- suppliers .add (supplier );
314- loadedValueTypes .add (supplierValueType );
315- } else {
316- skippedSuppliers .add (supplier );
317- }
318- }
319-
320- logger .logSuppliers (suppliers , skippedSuppliers );
321- }
322-
323292 private InstanceContext getDeployedInstance (Class typeClass , String ref ) {
324293 return deployedInstances .stream ()
325294 .filter (i -> i .getSupplier ().getValueType ().equals (typeClass ) && Objects .equals (i .getRef (), ref ))
0 commit comments