Skip to content

Commit a8429db

Browse files
committed
Polish code
1 parent 305701a commit a8429db

File tree

4 files changed

+148
-97
lines changed

4 files changed

+148
-97
lines changed

projects/stage-1/middleware-frameworks/my-cdi/src/main/java/org/geektimes/enterprise/inject/se/StandardContainer.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,15 @@ void addExtensions(Extension... extensions) {
6868
}
6969

7070
void addInterceptors(Class<?>... interceptorClasses) {
71-
standardBeanManager.interceptorClasses(interceptorClasses);
71+
standardBeanManager.syntheticInterceptors(interceptorClasses);
7272
}
7373

7474
void addDecorators(Class<?>... decoratorClasses) {
75-
standardBeanManager.decoratorClasses(decoratorClasses);
75+
standardBeanManager.syntheticDecorators(decoratorClasses);
7676
}
7777

7878
void addAlternatives(Class<?>... alternativeClasses) {
79-
standardBeanManager.alternativeClasses(alternativeClasses);
79+
standardBeanManager.syntheticAlternatives(alternativeClasses);
8080
}
8181

8282
void addAlternativeStereotypes(Class<? extends Annotation>... alternativeStereotypeClasses) {

projects/stage-1/middleware-frameworks/my-cdi/src/main/java/org/geektimes/enterprise/inject/standard/beans/BeanArchiveManager.java

+133-83
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import static org.geektimes.enterprise.inject.standard.beans.BeanArchiveType.OTHER;
5858
import static org.geektimes.enterprise.inject.standard.beans.BeanDiscoveryMode.ALL;
5959
import static org.geektimes.enterprise.inject.standard.beans.BeanDiscoveryMode.NONE;
60+
import static org.geektimes.enterprise.inject.standard.beans.BeanTypeSource.*;
6061
import static org.geektimes.enterprise.inject.standard.beans.xml.BeansReader.BEANS_XML_RESOURCE_NAME;
6162
import static org.geektimes.enterprise.inject.util.Decorators.isDecorator;
6263
import static org.geektimes.interceptor.util.InterceptorUtils.isInterceptorClass;
@@ -140,10 +141,10 @@ public BeanArchiveManager(ClassLoader classLoader) {
140141
this.beansReader = ServiceLoaders.loadSpi(BeansReader.class, classLoader);
141142
this.classScanner = SimpleClassScanner.INSTANCE;
142143

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<>();
147148

148149
this.alternativeStereotypeClasses = new LinkedHashSet<>();
149150

@@ -206,47 +207,49 @@ public BeanArchiveManager addSyntheticInterceptorBinding(Class<? extends Annotat
206207
// }
207208

208209
private void discoverBeanClasses(Set<Class<?>> discoveredTypes) {
209-
filterAndHandleDiscoveredTypes(discoveredTypes,
210+
filterAndHandleBeanTypes(discoveredTypes,
210211
this::isBeanClass,
211-
this::addBeanClass);
212+
this::addDiscoveredBeanClass);
212213
}
213214

215+
private void addDiscoveredBeanClass(Class<?> beanClass) {
216+
addBeanType(beanClass, BeanTypeSource.DISCOVERED, beanClasses);
217+
}
214218

215219
private void addEnabledBeanClass(Class<?> beanClass) {
216-
addBeanType(beanClass, BeanTypeSource.ENABLED, beanClasses);
220+
addBeanType(beanClass, ENABLED, beanClasses);
217221
}
218222

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);
221233
}
222234

223235
private static void addBeanType(Class<?> beanType, BeanTypeSource beanTypeSource,
224236
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) {
225243
requireNonNull(beanType, "The 'class' argument must not be null!");
226244
List<Class<?>> beanTypes = beanTypesRepository.computeIfAbsent(beanTypeSource, source -> new LinkedList<>());
227245
if (!beanTypes.contains(beanType)) {
228246
beanTypes.add(beanType);
247+
if (sorted) {
248+
Collections.sort(beanTypes, PriorityComparator.INSTANCE);
249+
}
229250
}
230251
}
231252

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-
250253
/**
251254
* Each child <class> element must specify the name of an interceptor class.
252255
* 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) {
259262
*
260263
* @param interceptors
261264
*/
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) {
263266
if (interceptors != null) {
264267
List<String> classNames = interceptors.getClazz();
265268
loadAnnotatedClasses(classNames, javax.interceptor.Interceptor.class)
266-
.forEach(this::addInterceptorClass);
269+
.forEach(this::addEnabledInterceptorClass);
267270
}
268271
}
269272

270273
private void discoverInterceptorClasses(Set<Class<?>> discoveredTypes) {
271-
filterAndHandleDiscoveredTypes(discoveredTypes,
274+
filterAndHandleBeanTypes(discoveredTypes,
272275
InterceptorUtils::isInterceptorClass,
273-
this::addInterceptorClass);
276+
this::addDiscoveredInterceptorClass);
274277
}
275278

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);
287289
}
288290

289291
/**
@@ -296,45 +298,56 @@ public BeanArchiveManager addInterceptorClass(Class<?> interceptorClass) throws
296298
*
297299
* @param decorators
298300
*/
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) {
300302
if (decorators != null) {
301303
List<String> classNames = decorators.getClazz();
302304
loadAnnotatedClasses(classNames, javax.decorator.Decorator.class)
303-
.forEach(this::addDecoratorClass);
305+
.forEach(this::addEnabledDecoratorClass);
304306
}
305307
}
306308

309+
private void addEnabledDecoratorClass(Class<?> decoratorClass) {
310+
addBeanType(decoratorClass, ENABLED, decoratorClasses);
311+
}
312+
307313
private void discoverDecoratorClasses(Set<Class<?>> discoveredTypes) {
308-
filterAndHandleDiscoveredTypes(discoveredTypes,
314+
filterAndHandleBeanTypes(discoveredTypes,
309315
Decorators::isDecorator,
310-
this::addDecoratorClass);
316+
this::addDiscoveredDecoratorClass);
311317
}
312318

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);
317321
}
318322

323+
public void addSyntheticDecoratorClass(Class<?> decoratorClass) {
324+
addBeanType(decoratorClass, SYNTHETIC, decoratorClasses);
325+
}
319326

320-
private void enableAlternatives(Alternatives alternatives) {
327+
private void addEnabledAlternativeClasses(Alternatives alternatives) {
321328
// alternatives.getClazzOrStereotype()
322329
// .stream()
323330
// .map(this::)
324-
325331
// TODO
326332
}
327333

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+
328342
public BeanArchiveManager addAlternativeStereotypeClass(Class<? extends Annotation> alternativeStereotypeClass) {
329343
requireNonNull(alternativeStereotypeClass, "The 'alternativeStereotypeClass' argument must not be null!");
330344
this.alternativeStereotypeClasses.add(alternativeStereotypeClass);
331345
return this;
332346
}
333347

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) {
338351
Iterator<Class<?>> iterator = classes.iterator();
339352
while (iterator.hasNext()) {
340353
Class<?> discoveredClass = iterator.next();
@@ -459,11 +472,10 @@ private void discoverTypesInImplicitBeanArchives() {
459472
* @see SeContainerInitializer#addPackages
460473
*/
461474
private void discoverTypesInSyntheticBeanArchives() {
462-
discoverTypesInExtendedPackages();
463-
// Merge synthetic bean classes into enabled bean classes
464-
syntheticBeanClasses.forEach(this::addBeanClass);
475+
discoverTypesInSyntheticPackages();
465476
}
466477

478+
467479
private Set<Class<?>> scan(URL beansXMLResource, Predicate<Class<?>>... classFilters) {
468480
return new LinkedHashSet<>(classScanner.scan(classLoader, beansXMLResource, true, classFilters));
469481
}
@@ -491,20 +503,18 @@ private void discoverTypesInExplicitBeanArchive(URL beansXMLResource, Beans bean
491503
Set<Class<?>> discoveredTypes = scan(beansXMLResource, nonAnnotationFilter);
492504
// Exclude filters
493505
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);
505514
}
506515
}
507516

517+
508518
/**
509519
* Each Java class with a bean defining annotation in an implicit bean archive.
510520
*
@@ -515,18 +525,42 @@ private void discoverTypesInImplicitBeanArchive(URL beansXMLResource) {
515525
discoverDefiningAnnotationBeanTypes(discoveredTypes);
516526
}
517527

518-
private void discoverTypesInExtendedPackages() {
528+
private void discoverTypesInSyntheticPackages() {
519529
if (isDiscoveryEnabled()) {
520530
Set<Class<?>> discoveredTypes = new LinkedHashSet<>();
521531
for (Map.Entry<String, Boolean> packageEntry : syntheticPackagesToScan.entrySet()) {
522532
String packageToDiscovery = packageEntry.getKey();
523533
boolean scanRecursively = Boolean.TRUE.equals(packageEntry.getValue());
524534
discoveredTypes.addAll(classScanner.scan(classLoader, packageToDiscovery, scanRecursively, true));
525535
}
526-
discoverDefiningAnnotationBeanTypes(discoveredTypes);
536+
addSyntheticBeanTypes(discoveredTypes);
527537
}
528538
}
529539

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+
530564
/**
531565
* Exclude filters are defined by &lt;exclude&gt; elements in the beans.xml for the bean archive as children of the
532566
* &lt;scan&gt; element. By default an exclude filter is active.
@@ -832,7 +866,7 @@ public boolean isScanImplicitEnabled() {
832866
* @return an unmodifiable view of discovered types
833867
*/
834868
public Set<Class<?>> getDiscoveredTypes() {
835-
Set<Class<?>> beanClasses = getBeanClasses();
869+
List<Class<?>> beanClasses = getBeanClasses();
836870
List<Class<?>> alternativeClasses = getAlternativeClasses();
837871
List<Class<?>> interceptorClasses = getInterceptorClasses();
838872
List<Class<?>> decoratorClasses = getDecoratorClasses();
@@ -850,27 +884,43 @@ public Set<Class<?>> getDiscoveredTypes() {
850884
return unmodifiableSet(discoveredTypes);
851885
}
852886

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);
855897
}
856898

857899
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);
861905
}
862906

863907
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());
867909
}
868910

869-
public List<Class<?>> getAlternativeClasses() {
870-
return alternativeClasses;
911+
public List<Class<?>> getDecoratorClasses(BeanTypeSource... beanTypeSources) {
912+
return getBeanTypes(decoratorClasses, beanTypeSources);
871913
}
872914

873915
public Set<Class<? extends Annotation>> getAlternativeStereotypeClasses() {
874916
return alternativeStereotypeClasses;
875917
}
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+
}
876926
}

0 commit comments

Comments
 (0)