Skip to content

Commit 492b5b5

Browse files
committed
Polish code
1 parent aac2910 commit 492b5b5

File tree

10 files changed

+223
-26
lines changed

10 files changed

+223
-26
lines changed

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

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
*/
5151
public class DecoratorBean<T> extends ManagedBean<T> implements Decorator<T> {
5252

53+
54+
5355
public DecoratorBean(AnnotatedType<T> decoratorType, BeanManager beanManager) {
5456
super(decoratorType, beanManager);
5557
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,13 @@ public Object intercept(InterceptionType type, T instance, InvocationContext ctx
111111
@Override
112112
public T create(CreationalContext<T> creationalContext) {
113113
// TODO
114-
return null;
114+
return super.create(creationalContext);
115115
}
116116

117117
@Override
118118
public void destroy(T instance, CreationalContext<T> creationalContext) {
119119
// TODO
120+
super.destroy(instance, creationalContext);
120121
}
121122

122123
@Override

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

+52-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.geektimes.enterprise.inject.util;
1818

1919
import org.geektimes.commons.lang.util.ArrayUtils;
20+
import org.geektimes.commons.reflect.util.ConstructorUtils;
2021
import org.geektimes.commons.reflect.util.MemberUtils;
2122
import org.geektimes.interceptor.InterceptorManager;
2223

@@ -45,11 +46,13 @@
4546
import static org.geektimes.commons.lang.util.AnnotationUtils.isAnnotationPresent;
4647
import static org.geektimes.commons.reflect.util.ClassUtils.*;
4748
import static org.geektimes.commons.reflect.util.FieldUtils.getAllFields;
49+
import static org.geektimes.commons.reflect.util.MemberUtils.NON_PRIVATE_METHOD_PREDICATE;
50+
import static org.geektimes.commons.reflect.util.MemberUtils.NON_STATIC_METHOD_PREDICATE;
51+
import static org.geektimes.commons.reflect.util.MethodUtils.getAllDeclaredMethods;
4852
import static org.geektimes.commons.reflect.util.TypeUtils.*;
4953
import static org.geektimes.enterprise.inject.util.Decorators.isDecorator;
5054
import static org.geektimes.enterprise.inject.util.Qualifiers.findQualifier;
5155
import static org.geektimes.interceptor.InterceptorManager.getInstance;
52-
import static org.geektimes.interceptor.util.InterceptorUtils.isInterceptorClass;
5356

5457
/**
5558
* Bean Utilities class
@@ -203,6 +206,54 @@ public static boolean isManagedBean(Class<?> beanClass) {
203206
return true;
204207
}
205208

209+
/**
210+
* The container uses proxies to provide certain functionality. Certain legal bean types cannot be
211+
* proxied by the container:
212+
* <ul>
213+
* <li>classes which don’t have a non-private constructor with no parameters</li>
214+
* <li>classes which are declared final</li>
215+
* <li>classes which have non-static, final methods with public, protected or default visibility</li>
216+
* <li>primitive types</li>
217+
* <li>array types</li>
218+
* </ul>
219+
*
220+
* @param beanClass the type of Bean
221+
* @return <code>true</code> if bean type cannot be proxied by the container:
222+
* * <ul>
223+
* * <li>classes which don’t have a non-private constructor with no parameters</li>
224+
* * <li>classes which are declared final</li>
225+
* * <li>classes which have non-static, final methods with public, protected or default visibility</li>
226+
* * <li>primitive types</li>
227+
* * <li>array types</li>
228+
* * </ul>
229+
*/
230+
public static boolean isUnproxyable(Class<?> beanClass) {
231+
if (isArray(beanClass) ||
232+
isPrimitive(beanClass) ||
233+
isFinal(beanClass) ||
234+
hasFinalMethod(beanClass) ||
235+
hasNonDefaultConstructor(beanClass)) {
236+
return true;
237+
}
238+
return false;
239+
}
240+
241+
private static boolean hasFinalMethod(Class<?> beanClass) {
242+
Set<Method> methods = getAllDeclaredMethods(beanClass, NON_STATIC_METHOD_PREDICATE, NON_PRIVATE_METHOD_PREDICATE);
243+
boolean hasFinalMethod = false;
244+
for (Method method : methods) {
245+
hasFinalMethod = MemberUtils.isFinal(method);
246+
if (hasFinalMethod) {
247+
break;
248+
}
249+
}
250+
return hasFinalMethod;
251+
}
252+
253+
private static boolean hasNonDefaultConstructor(Class<?> beanClass) {
254+
ConstructorUtils.hasPublicNoArgConstructor()
255+
}
256+
206257
private static boolean hasManagedBeanConstructor(Class<?> beanClass) {
207258
boolean hasManagedBeanConstructor = false;
208259
for (Constructor constructor : beanClass.getConstructors()) {

projects/stage-1/middleware-frameworks/my-commons/src/main/java/org/geektimes/commons/function/Predicates.java

+12-6
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
import java.util.function.Predicate;
2020

21-
import static java.util.stream.Stream.of;
22-
2321
/**
2422
* The utilities class for Java {@link Predicate}
2523
*
@@ -56,8 +54,12 @@ static <T> Predicate<T> alwaysFalse() {
5654
* @param <T> the type to test
5755
* @return non-null
5856
*/
59-
static <T> Predicate<T> and(Predicate<T>... predicates) {
60-
return of(predicates).reduce((a, b) -> a.and(b)).orElseGet(Predicates::alwaysTrue);
57+
static <T> Predicate<T> and(Predicate<? super T>... predicates) {
58+
Predicate<T> andPredicate = alwaysTrue();
59+
for (Predicate<? super T> p : predicates) {
60+
andPredicate = andPredicate.and(p);
61+
}
62+
return andPredicate;
6163
}
6264

6365
/**
@@ -67,8 +69,12 @@ static <T> Predicate<T> and(Predicate<T>... predicates) {
6769
* @param <T> the detected type
6870
* @return non-null
6971
*/
70-
static <T> Predicate<T> or(Predicate<T>... predicates) {
71-
return of(predicates).reduce((a, b) -> a.or(b)).orElse(e -> true);
72+
static <T> Predicate<T> or(Predicate<? super T>... predicates) {
73+
Predicate<T> orPredicate = alwaysTrue();
74+
for (Predicate<? super T> p : predicates) {
75+
orPredicate = orPredicate.or(p);
76+
}
77+
return orPredicate;
7278
}
7379

7480
}

projects/stage-1/middleware-frameworks/my-commons/src/main/java/org/geektimes/commons/function/Streams.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,11 @@ static <T, S extends Iterable<T>> S filter(S values, Predicate<T> predicate) {
9191
throw new UnsupportedOperationException(message);
9292
}
9393

94-
static <T, S extends Iterable<T>> S filterAll(S values, Predicate<T>... predicates) {
94+
static <T, S extends Iterable<T>> S filterAll(S values, Predicate<? super T>... predicates) {
9595
return filter(values, and(predicates));
9696
}
9797

98-
static <T, S extends Iterable<T>> S filterAny(S values, Predicate<T>... predicates) {
98+
static <T, S extends Iterable<T>> S filterAny(S values, Predicate<? super T>... predicates) {
9999
return filter(values, or(predicates));
100100
}
101101

projects/stage-1/middleware-frameworks/my-commons/src/main/java/org/geektimes/commons/reflect/util/ClassUtils.java

+47-9
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
import java.io.File;
3232
import java.lang.reflect.Array;
33+
import java.lang.reflect.Modifier;
3334
import java.math.BigDecimal;
3435
import java.math.BigInteger;
3536
import java.net.MalformedURLException;
@@ -44,9 +45,7 @@
4445
import static java.lang.reflect.Modifier.isAbstract;
4546
import static java.lang.reflect.Modifier.isInterface;
4647
import static java.util.Arrays.asList;
47-
import static java.util.Collections.emptySet;
48-
import static java.util.Collections.unmodifiableSet;
49-
import static org.geektimes.commons.collection.util.CollectionUtils.newLinkedHashSet;
48+
import static java.util.Collections.*;
5049
import static org.geektimes.commons.collection.util.CollectionUtils.asSet;
5150
import static org.geektimes.commons.function.Streams.filterAll;
5251
import static org.geektimes.commons.function.ThrowableFunction.execute;
@@ -121,6 +120,19 @@ public abstract class ClassUtils {
121120
Date.class,
122121
Object.class
123122
);
123+
124+
public static final Set<Class<?>> PRIMITIVE_TYPES = asSet(
125+
Void.TYPE,
126+
Boolean.TYPE,
127+
Character.TYPE,
128+
Byte.TYPE,
129+
Short.TYPE,
130+
Integer.TYPE,
131+
Long.TYPE,
132+
Float.TYPE,
133+
Double.TYPE
134+
);
135+
124136
/**
125137
* Prefix for internal array class names: "[L"
126138
*/
@@ -177,7 +189,7 @@ private static Map<String, Set<String>> initClassPathToClassNamesMap() {
177189
Set<String> classNames = findClassNamesInClassPath(classPath, true);
178190
classPathToClassNamesMap.put(classPath, classNames);
179191
}
180-
return Collections.unmodifiableMap(classPathToClassNamesMap);
192+
return unmodifiableMap(classPathToClassNamesMap);
181193
}
182194

183195
private static Map<String, String> initClassNameToClassPathsMap() {
@@ -191,7 +203,7 @@ private static Map<String, String> initClassNameToClassPathsMap() {
191203
}
192204
}
193205

194-
return Collections.unmodifiableMap(classNameToClassPathsMap);
206+
return unmodifiableMap(classNameToClassPathsMap);
195207
}
196208

197209
private static Map<String, Set<String>> initPackageNameToClassNamesMap() {
@@ -207,7 +219,7 @@ private static Map<String, Set<String>> initPackageNameToClassNamesMap() {
207219
classNamesInPackage.add(className);
208220
}
209221

210-
return Collections.unmodifiableMap(packageNameToClassNamesMap);
222+
return unmodifiableMap(packageNameToClassNamesMap);
211223
}
212224

213225
public static Class<?> forNameWithThreadContextClassLoader(String name)
@@ -343,13 +355,15 @@ public static String simpleClassName(Class<?> clazz) {
343355

344356
/**
345357
* The specified type is primitive type or simple type
358+
* <p>
359+
* It's an optimized implementation for {@link Class#isPrimitive()}.
346360
*
347361
* @param type the type to test
348362
* @return
349-
* @deprecated as 1.0.0, use {@link Class#isPrimitive()} plus {@link #isSimpleType(Class)} instead
363+
* @see Class#isPrimitive()
350364
*/
351365
public static boolean isPrimitive(Class<?> type) {
352-
return type != null && (type.isPrimitive() || isSimpleType(type));
366+
return PRIMITIVE_TYPES.contains(type);
353367
}
354368

355369
/**
@@ -392,6 +406,30 @@ public static Object convertPrimitive(Class<?> type, String value) {
392406
return value;
393407
}
394408

409+
/**
410+
* The specified type is final or not
411+
*
412+
* @param type the type to test
413+
* @return <code>true</code> if the specified type is a final class,
414+
* <code>false</code> otherwise
415+
*/
416+
public static boolean isFinal(Class<?> type) {
417+
return type != null && Modifier.isFinal(type.getModifiers());
418+
}
419+
420+
/**
421+
* The specified type is array or not?
422+
* <p>
423+
* It's an optimized implementation for {@link Class#isArray()}).
424+
*
425+
* @param type the type to test
426+
* @return <code>true</code> if the specified type is an array class,
427+
* <code>false</code> otherwise
428+
* @see Class#isArray()
429+
*/
430+
public static boolean isArray(Class<?> type) {
431+
return type != null && type.getName().startsWith("[");
432+
}
395433

396434
/**
397435
* We only check boolean value at this moment.
@@ -802,7 +840,7 @@ public static Set<String> findClassNamesInClassPath(String classPath, boolean re
802840
* @return all class names in class path
803841
*/
804842
public static Set<String> findClassNamesInClassPath(File archiveFile, boolean recursive) {
805-
if (archiveFile==null || !archiveFile.exists()) {
843+
if (archiveFile == null || !archiveFile.exists()) {
806844
return emptySet();
807845
}
808846
if (archiveFile.isDirectory()) { // Directory

projects/stage-1/middleware-frameworks/my-commons/src/main/java/org/geektimes/commons/reflect/util/ConstructorUtils.java

+12
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@
1717
package org.geektimes.commons.reflect.util;
1818

1919
import java.lang.reflect.Constructor;
20+
import java.util.Set;
21+
import java.util.function.Predicate;
2022

23+
import static java.util.Collections.unmodifiableSet;
24+
import static java.util.stream.Collectors.toSet;
25+
import static java.util.stream.Stream.of;
26+
import static org.geektimes.commons.function.Predicates.and;
2127
import static org.geektimes.commons.reflect.util.MemberUtils.isPublic;
2228

2329
/**
@@ -49,4 +55,10 @@ public static boolean hasPublicNoArgConstructor(Class<?> type) {
4955
}
5056
return has;
5157
}
58+
59+
public static Set<Constructor<?>> getConstructors(Class<?> type, Predicate<Constructor<?>>... constructorFilters) {
60+
return unmodifiableSet(of(type.getConstructors())
61+
.filter(and(constructorFilters))
62+
.collect(toSet()));
63+
}
5264
}

projects/stage-1/middleware-frameworks/my-commons/src/main/java/org/geektimes/commons/reflect/util/MemberUtils.java

+32-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.geektimes.commons.reflect.util;
1818

1919
import java.lang.reflect.*;
20+
import java.util.function.Predicate;
2021

2122
/**
2223
* The utilities class for Java Reflection {@link Member}
@@ -26,6 +27,16 @@
2627
*/
2728
public abstract class MemberUtils {
2829

30+
public final static Predicate<Method> STATIC_METHOD_PREDICATE = MemberUtils::isStatic;
31+
32+
public final static Predicate<Member> NON_STATIC_METHOD_PREDICATE = MemberUtils::isNonStatic;
33+
34+
public final static Predicate<? extends Member> FINAL_METHOD_PREDICATE = MemberUtils::isFinal;
35+
36+
public final static Predicate<? extends Member> PUBLIC_METHOD_PREDICATE = MemberUtils::isPublic;
37+
38+
public final static Predicate<? extends Member> NON_PRIVATE_METHOD_PREDICATE = MemberUtils::isNonPrivate;
39+
2940
/**
3041
* check the specified {@link Member member} is static or not ?
3142
*
@@ -36,7 +47,6 @@ public static boolean isStatic(Member member) {
3647
return member != null && Modifier.isStatic(member.getModifiers());
3748
}
3849

39-
4050
/**
4151
* check the specified {@link Member member} is abstract or not ?
4252
*
@@ -51,6 +61,16 @@ public static boolean isNonStatic(Member member) {
5161
return member != null && !Modifier.isStatic(member.getModifiers());
5262
}
5363

64+
/**
65+
* check the specified {@link Member member} is final or not ?
66+
*
67+
* @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}
68+
* @return Iff <code>member</code> is final one, return <code>true</code>, or <code>false</code>
69+
*/
70+
public static boolean isFinal(Member member) {
71+
return member != null && Modifier.isFinal(member.getModifiers());
72+
}
73+
5474
/**
5575
* check the specified {@link Member member} is private or not ?
5676
*
@@ -70,4 +90,15 @@ public static boolean isPrivate(Member member) {
7090
public static boolean isPublic(Member member) {
7191
return member != null && Modifier.isPublic(member.getModifiers());
7292
}
93+
94+
/**
95+
* check the specified {@link Member member} is non-private or not ?
96+
*
97+
* @param member {@link Member} instance, e.g, {@link Constructor}, {@link Method} or {@link Field}
98+
* @return Iff <code>member</code> is non-private one, return <code>true</code>, or <code>false</code>
99+
*/
100+
public static boolean isNonPrivate(Member member) {
101+
return member != null && !Modifier.isPrivate(member.getModifiers());
102+
}
103+
73104
}

0 commit comments

Comments
 (0)