1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.i18nsystem.proxytoys;
35
36 import com.google.common.base.Predicate;
37 import com.thoughtworks.proxy.toys.decorate.Decorator;
38 import java.lang.reflect.Method;
39
40
41
42
43
44
45
46
47 public class FilteringMethodDecorator<T> extends Decorator<T> {
48 private final Decorator<T> delegate;
49 private final Predicate<Method> methodSelector;
50
51 public FilteringMethodDecorator(Decorator<T> delegate, Predicate<Method> methodSelector) {
52 this.delegate = delegate;
53 this.methodSelector = methodSelector;
54 }
55
56 @Override
57 public Object[] beforeMethodStarts(T proxy, Method method, Object[] args) {
58 if (methodSelector.apply(method)) {
59 return delegate.beforeMethodStarts(proxy, method, args);
60 } else {
61 return super.beforeMethodStarts(proxy, method, args);
62 }
63 }
64
65 @Override
66 public Object decorateResult(T proxy, Method method, Object[] args, Object result) {
67 if (methodSelector.apply(method)) {
68 return delegate.decorateResult(proxy, method, args, result);
69 } else {
70 return super.decorateResult(proxy, method, args, result);
71 }
72 }
73
74 @Override
75 public Throwable decorateTargetException(T proxy, Method method, Object[] args, Throwable cause) {
76 if (methodSelector.apply(method)) {
77 return delegate.decorateTargetException(proxy, method, args, cause);
78 } else {
79 return super.decorateTargetException(proxy, method, args, cause);
80 }
81 }
82
83 @Override
84 public Exception decorateInvocationException(T proxy, Method method, Object[] args, Exception cause) {
85 if (methodSelector.apply(method)) {
86 return delegate.decorateInvocationException(proxy, method, args, cause);
87 } else {
88 return super.decorateInvocationException(proxy, method, args, cause);
89 }
90 }
91 }