57
57
import static org .geektimes .enterprise .inject .standard .beans .BeanArchiveType .OTHER ;
58
58
import static org .geektimes .enterprise .inject .standard .beans .BeanDiscoveryMode .ALL ;
59
59
import static org .geektimes .enterprise .inject .standard .beans .BeanDiscoveryMode .NONE ;
60
+ import static org .geektimes .enterprise .inject .standard .beans .BeanTypeSource .*;
60
61
import static org .geektimes .enterprise .inject .standard .beans .xml .BeansReader .BEANS_XML_RESOURCE_NAME ;
61
62
import static org .geektimes .enterprise .inject .util .Decorators .isDecorator ;
62
63
import static org .geektimes .interceptor .util .InterceptorUtils .isInterceptorClass ;
@@ -140,10 +141,10 @@ public BeanArchiveManager(ClassLoader classLoader) {
140
141
this .beansReader = ServiceLoaders .loadSpi (BeansReader .class , classLoader );
141
142
this .classScanner = SimpleClassScanner .INSTANCE ;
142
143
143
- this .beanClasses = new LinkedHashMap <>();
144
- this .interceptorClasses = new LinkedHashMap <>();
145
- this .decoratorClasses = new LinkedHashMap <>();
146
- this .alternativeClasses = new LinkedHashMap <>();
144
+ this .beanClasses = new TreeMap <>();
145
+ this .interceptorClasses = new TreeMap <>();
146
+ this .decoratorClasses = new TreeMap <>();
147
+ this .alternativeClasses = new TreeMap <>();
147
148
148
149
this .alternativeStereotypeClasses = new LinkedHashSet <>();
149
150
@@ -206,47 +207,49 @@ public BeanArchiveManager addSyntheticInterceptorBinding(Class<? extends Annotat
206
207
// }
207
208
208
209
private void discoverBeanClasses (Set <Class <?>> discoveredTypes ) {
209
- filterAndHandleDiscoveredTypes (discoveredTypes ,
210
+ filterAndHandleBeanTypes (discoveredTypes ,
210
211
this ::isBeanClass ,
211
- this ::addBeanClass );
212
+ this ::addDiscoveredBeanClass );
212
213
}
213
214
215
+ private void addDiscoveredBeanClass (Class <?> beanClass ) {
216
+ addBeanType (beanClass , BeanTypeSource .DISCOVERED , beanClasses );
217
+ }
214
218
215
219
private void addEnabledBeanClass (Class <?> beanClass ) {
216
- addBeanType (beanClass , BeanTypeSource . ENABLED , beanClasses );
220
+ addBeanType (beanClass , ENABLED , beanClasses );
217
221
}
218
222
219
- private void addDiscoveredBeanClass (Class <?> beanClass ) {
220
- addBeanType (beanClass , BeanTypeSource .DISCOVERED , beanClasses );
223
+ private void addEnabledAlternativeClass (Class <?> alternativeClass ) {
224
+ addBeanType (alternativeClass , ENABLED , alternativeClasses );
225
+ }
226
+
227
+ public void addDiscoveredAlternativeClass (Class <?> alternativeClass ) {
228
+ addBeanType (alternativeClass , DISCOVERED , alternativeClasses );
229
+ }
230
+
231
+ public void addSyntheticAlternativeClass (Class <?> alternativeClass ) {
232
+ addBeanType (alternativeClass , SYNTHETIC , alternativeClasses );
221
233
}
222
234
223
235
private static void addBeanType (Class <?> beanType , BeanTypeSource beanTypeSource ,
224
236
Map <BeanTypeSource , List <Class <?>>> beanTypesRepository ) {
237
+ addBeanType (beanType , beanTypeSource , beanTypesRepository , false );
238
+ }
239
+
240
+ private static void addBeanType (Class <?> beanType , BeanTypeSource beanTypeSource ,
241
+ Map <BeanTypeSource , List <Class <?>>> beanTypesRepository ,
242
+ boolean sorted ) {
225
243
requireNonNull (beanType , "The 'class' argument must not be null!" );
226
244
List <Class <?>> beanTypes = beanTypesRepository .computeIfAbsent (beanTypeSource , source -> new LinkedList <>());
227
245
if (!beanTypes .contains (beanType )) {
228
246
beanTypes .add (beanType );
247
+ if (sorted ) {
248
+ Collections .sort (beanTypes , PriorityComparator .INSTANCE );
249
+ }
229
250
}
230
251
}
231
252
232
- /**
233
- * Add provided bean classes.
234
- *
235
- * @param beanClass bean class
236
- * @return self
237
- */
238
- private BeanArchiveManager addBeanClass (Class <?> beanClass ) {
239
- requireNonNull (beanClass , "The 'beanClass' argument must not be null!" );
240
- this .beanClasses .add (beanClass );
241
- return this ;
242
- }
243
-
244
- public BeanArchiveManager addAlternativeClass (Class <?> alternativeClass ) {
245
- requireNonNull (alternativeClass , "The 'alternativeClass' argument must not be null!" );
246
- this .alternativeClasses .add (alternativeClass );
247
- return this ;
248
- }
249
-
250
253
/**
251
254
* Each child <class> element must specify the name of an interceptor class.
252
255
* If there is no class with the specified name, or if the class with the specified name is not an interceptor class,
@@ -259,31 +262,30 @@ public BeanArchiveManager addAlternativeClass(Class<?> alternativeClass) {
259
262
*
260
263
* @param interceptors
261
264
*/
262
- private void enableInterceptors (org .geektimes .enterprise .inject .standard .beans .xml .bind .Interceptors interceptors ) {
265
+ private void addEnabledInterceptorClasses (org .geektimes .enterprise .inject .standard .beans .xml .bind .Interceptors interceptors ) {
263
266
if (interceptors != null ) {
264
267
List <String > classNames = interceptors .getClazz ();
265
268
loadAnnotatedClasses (classNames , javax .interceptor .Interceptor .class )
266
- .forEach (this ::addInterceptorClass );
269
+ .forEach (this ::addEnabledInterceptorClass );
267
270
}
268
271
}
269
272
270
273
private void discoverInterceptorClasses (Set <Class <?>> discoveredTypes ) {
271
- filterAndHandleDiscoveredTypes (discoveredTypes ,
274
+ filterAndHandleBeanTypes (discoveredTypes ,
272
275
InterceptorUtils ::isInterceptorClass ,
273
- this ::addInterceptorClass );
276
+ this ::addDiscoveredInterceptorClass );
274
277
}
275
278
276
- /**
277
- * @param interceptorClass
278
- * @return
279
- * @throws DeploymentException If <code>interceptorClass</code> is not an interceptor class.
280
- */
281
- public BeanArchiveManager addInterceptorClass (Class <?> interceptorClass ) throws DeploymentException {
282
- requireNonNull (interceptorClass , "The 'interceptorClass' argument must not be null!" );
283
- this .interceptorClasses .add (interceptorClass );
284
- // Interceptors enabled using @Priority are called before interceptors enabled using beans.xml.
285
- sort (this .interceptorClasses , PriorityComparator .INSTANCE );
286
- return this ;
279
+ private void addEnabledInterceptorClass (Class <?> interceptorClass ) {
280
+ addBeanType (interceptorClass , ENABLED , interceptorClasses , true );
281
+ }
282
+
283
+ private void addDiscoveredInterceptorClass (Class <?> interceptorClass ) {
284
+ addBeanType (interceptorClass , DISCOVERED , interceptorClasses , true );
285
+ }
286
+
287
+ public void addSyntheticInterceptorClass (Class <?> interceptorClass ) {
288
+ addBeanType (interceptorClass , SYNTHETIC , interceptorClasses , true );
287
289
}
288
290
289
291
/**
@@ -296,45 +298,56 @@ public BeanArchiveManager addInterceptorClass(Class<?> interceptorClass) throws
296
298
*
297
299
* @param decorators
298
300
*/
299
- private void enableDecorators (org .geektimes .enterprise .inject .standard .beans .xml .bind .Decorators decorators ) {
301
+ private void addEnabledDecoratorClasses (org .geektimes .enterprise .inject .standard .beans .xml .bind .Decorators decorators ) {
300
302
if (decorators != null ) {
301
303
List <String > classNames = decorators .getClazz ();
302
304
loadAnnotatedClasses (classNames , javax .decorator .Decorator .class )
303
- .forEach (this ::addDecoratorClass );
305
+ .forEach (this ::addEnabledDecoratorClass );
304
306
}
305
307
}
306
308
309
+ private void addEnabledDecoratorClass (Class <?> decoratorClass ) {
310
+ addBeanType (decoratorClass , ENABLED , decoratorClasses );
311
+ }
312
+
307
313
private void discoverDecoratorClasses (Set <Class <?>> discoveredTypes ) {
308
- filterAndHandleDiscoveredTypes (discoveredTypes ,
314
+ filterAndHandleBeanTypes (discoveredTypes ,
309
315
Decorators ::isDecorator ,
310
- this ::addDecoratorClass );
316
+ this ::addDiscoveredDecoratorClass );
311
317
}
312
318
313
- public BeanArchiveManager addDecoratorClass (Class <?> decoratorClass ) {
314
- requireNonNull (decoratorClass , "The 'decoratorClass' argument must not be null!" );
315
- this .decoratorClasses .add (decoratorClass );
316
- return this ;
319
+ private void addDiscoveredDecoratorClass (Class <?> decoratorClass ) {
320
+ addBeanType (decoratorClass , DISCOVERED , decoratorClasses );
317
321
}
318
322
323
+ public void addSyntheticDecoratorClass (Class <?> decoratorClass ) {
324
+ addBeanType (decoratorClass , SYNTHETIC , decoratorClasses );
325
+ }
319
326
320
- private void enableAlternatives (Alternatives alternatives ) {
327
+ private void addEnabledAlternativeClasses (Alternatives alternatives ) {
321
328
// alternatives.getClazzOrStereotype()
322
329
// .stream()
323
330
// .map(this::)
324
-
325
331
// TODO
326
332
}
327
333
334
+ private void addEnabledBeanClasses (Set <Class <?>> discoveredTypes , Beans beans ) {
335
+ // Trimmed bean archive
336
+ if (!trimBeanArchive (discoveredTypes , beans )) {
337
+ // Add enabled bean classes from the remaining discovered types
338
+ discoveredTypes .forEach (this ::addEnabledBeanClass );
339
+ }
340
+ }
341
+
328
342
public BeanArchiveManager addAlternativeStereotypeClass (Class <? extends Annotation > alternativeStereotypeClass ) {
329
343
requireNonNull (alternativeStereotypeClass , "The 'alternativeStereotypeClass' argument must not be null!" );
330
344
this .alternativeStereotypeClasses .add (alternativeStereotypeClass );
331
345
return this ;
332
346
}
333
347
334
-
335
- private void filterAndHandleDiscoveredTypes (Set <Class <?>> classes ,
336
- Predicate <Class <?>> filter ,
337
- Consumer <Class <?>> handler ) {
348
+ private void filterAndHandleBeanTypes (Set <Class <?>> classes ,
349
+ Predicate <Class <?>> filter ,
350
+ Consumer <Class <?>> handler ) {
338
351
Iterator <Class <?>> iterator = classes .iterator ();
339
352
while (iterator .hasNext ()) {
340
353
Class <?> discoveredClass = iterator .next ();
@@ -459,11 +472,10 @@ private void discoverTypesInImplicitBeanArchives() {
459
472
* @see SeContainerInitializer#addPackages
460
473
*/
461
474
private void discoverTypesInSyntheticBeanArchives () {
462
- discoverTypesInExtendedPackages ();
463
- // Merge synthetic bean classes into enabled bean classes
464
- syntheticBeanClasses .forEach (this ::addBeanClass );
475
+ discoverTypesInSyntheticPackages ();
465
476
}
466
477
478
+
467
479
private Set <Class <?>> scan (URL beansXMLResource , Predicate <Class <?>>... classFilters ) {
468
480
return new LinkedHashSet <>(classScanner .scan (classLoader , beansXMLResource , true , classFilters ));
469
481
}
@@ -491,20 +503,18 @@ private void discoverTypesInExplicitBeanArchive(URL beansXMLResource, Beans bean
491
503
Set <Class <?>> discoveredTypes = scan (beansXMLResource , nonAnnotationFilter );
492
504
// Exclude filters
493
505
excludeFilters (discoveredTypes , beans );
494
- // Add Interceptor classes
495
- enableInterceptors (beans .getInterceptors ());
496
- // Add Decorator classes
497
- enableDecorators (beans .getDecorators ());
498
- // Add Alternative classes
499
- enableAlternatives (beans .getAlternatives ());
500
- // Trimmed bean archive
501
- if (!trimBeanArchive (discoveredTypes , beans )) {
502
- // Add bean classes from the remaining discovered types
503
- discoveredTypes .forEach (this ::addBeanClass );
504
- }
506
+ // Add Enabled Interceptor classes
507
+ addEnabledInterceptorClasses (beans .getInterceptors ());
508
+ // Add Enabled Decorator classes
509
+ addEnabledDecoratorClasses (beans .getDecorators ());
510
+ // Add Enabled Alternative classes
511
+ addEnabledAlternativeClasses (beans .getAlternatives ());
512
+ // Add Enabled Bean classes
513
+ addEnabledBeanClasses (discoveredTypes , beans );
505
514
}
506
515
}
507
516
517
+
508
518
/**
509
519
* Each Java class with a bean defining annotation in an implicit bean archive.
510
520
*
@@ -515,18 +525,42 @@ private void discoverTypesInImplicitBeanArchive(URL beansXMLResource) {
515
525
discoverDefiningAnnotationBeanTypes (discoveredTypes );
516
526
}
517
527
518
- private void discoverTypesInExtendedPackages () {
528
+ private void discoverTypesInSyntheticPackages () {
519
529
if (isDiscoveryEnabled ()) {
520
530
Set <Class <?>> discoveredTypes = new LinkedHashSet <>();
521
531
for (Map .Entry <String , Boolean > packageEntry : syntheticPackagesToScan .entrySet ()) {
522
532
String packageToDiscovery = packageEntry .getKey ();
523
533
boolean scanRecursively = Boolean .TRUE .equals (packageEntry .getValue ());
524
534
discoveredTypes .addAll (classScanner .scan (classLoader , packageToDiscovery , scanRecursively , true ));
525
535
}
526
- discoverDefiningAnnotationBeanTypes (discoveredTypes );
536
+ addSyntheticBeanTypes (discoveredTypes );
527
537
}
528
538
}
529
539
540
+ private void addSyntheticBeanTypes (Set <Class <?>> discoveredTypes ) {
541
+ addSyntheticInterceptorClasses (discoveredTypes );
542
+ addSyntheticDecoratorClasses (discoveredTypes );
543
+ addSyntheticBeanClasses (discoveredTypes );
544
+ }
545
+
546
+ private void addSyntheticInterceptorClasses (Set <Class <?>> discoveredTypes ) {
547
+ filterAndHandleBeanTypes (discoveredTypes ,
548
+ InterceptorUtils ::isInterceptorClass ,
549
+ this ::addSyntheticInterceptorClass );
550
+ }
551
+
552
+ private void addSyntheticDecoratorClasses (Set <Class <?>> discoveredTypes ) {
553
+ filterAndHandleBeanTypes (discoveredTypes ,
554
+ Decorators ::isDecorator ,
555
+ this ::addSyntheticDecoratorClass );
556
+ }
557
+
558
+ private void addSyntheticBeanClasses (Set <Class <?>> discoveredTypes ) {
559
+ filterAndHandleBeanTypes (discoveredTypes ,
560
+ this ::isBeanClass ,
561
+ this ::addSyntheticBeanClass );
562
+ }
563
+
530
564
/**
531
565
* Exclude filters are defined by <exclude> elements in the beans.xml for the bean archive as children of the
532
566
* <scan> element. By default an exclude filter is active.
@@ -832,7 +866,7 @@ public boolean isScanImplicitEnabled() {
832
866
* @return an unmodifiable view of discovered types
833
867
*/
834
868
public Set <Class <?>> getDiscoveredTypes () {
835
- Set <Class <?>> beanClasses = getBeanClasses ();
869
+ List <Class <?>> beanClasses = getBeanClasses ();
836
870
List <Class <?>> alternativeClasses = getAlternativeClasses ();
837
871
List <Class <?>> interceptorClasses = getInterceptorClasses ();
838
872
List <Class <?>> decoratorClasses = getDecoratorClasses ();
@@ -850,27 +884,43 @@ public Set<Class<?>> getDiscoveredTypes() {
850
884
return unmodifiableSet (discoveredTypes );
851
885
}
852
886
853
- public Set <Class <?>> getBeanClasses () {
854
- return beanClasses ;
887
+ public List <Class <?>> getBeanClasses () {
888
+ return getBeanTypes (beanClasses , BeanTypeSource .values ());
889
+ }
890
+
891
+ public List <Class <?>> getAlternativeClasses () {
892
+ return getAlternativeClasses (BeanTypeSource .values ());
893
+ }
894
+
895
+ public List <Class <?>> getAlternativeClasses (BeanTypeSource ... beanTypeSources ) {
896
+ return getBeanTypes (alternativeClasses , beanTypeSources );
855
897
}
856
898
857
899
public List <Class <?>> getInterceptorClasses () {
858
- // Interceptors enabled using @Priority are called before interceptors enabled using beans.xml.
859
- sort (this .interceptorClasses , PriorityComparator .INSTANCE );
860
- return interceptorClasses ;
900
+ return getInterceptorClasses (BeanTypeSource .values ());
901
+ }
902
+
903
+ public List <Class <?>> getInterceptorClasses (BeanTypeSource ... beanTypeSources ) {
904
+ return getBeanTypes (interceptorClasses , beanTypeSources );
861
905
}
862
906
863
907
public List <Class <?>> getDecoratorClasses () {
864
- // The decorator will only be executed once based on the @Priority annotation’s invocation chain.
865
- sort (this .decoratorClasses , PriorityComparator .INSTANCE );
866
- return decoratorClasses ;
908
+ return getDecoratorClasses (BeanTypeSource .values ());
867
909
}
868
910
869
- public List <Class <?>> getAlternativeClasses ( ) {
870
- return alternativeClasses ;
911
+ public List <Class <?>> getDecoratorClasses ( BeanTypeSource ... beanTypeSources ) {
912
+ return getBeanTypes ( decoratorClasses , beanTypeSources ) ;
871
913
}
872
914
873
915
public Set <Class <? extends Annotation >> getAlternativeStereotypeClasses () {
874
916
return alternativeStereotypeClasses ;
875
917
}
918
+
919
+ private static List <Class <?>> getBeanTypes (Map <BeanTypeSource , List <Class <?>>> repository , BeanTypeSource ... beanTypeSources ) {
920
+ List <Class <?>> beanTypes = new LinkedList <>();
921
+ for (BeanTypeSource beanTypeSource : beanTypeSources ) {
922
+ beanTypes .addAll (repository .getOrDefault (beanTypeSource , emptyList ()));
923
+ }
924
+ return unmodifiableList (beanTypes );
925
+ }
876
926
}
0 commit comments