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.config.source;
35
36 import info.magnolia.config.registry.DefinitionProvider;
37 import info.magnolia.config.registry.DefinitionProviderWrapper;
38
39 import java.lang.reflect.Method;
40
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44 import com.thoughtworks.proxy.factory.CglibProxyFactory;
45 import com.thoughtworks.proxy.toys.decorate.Decorating;
46 import com.thoughtworks.proxy.toys.decorate.Decorator;
47
48
49
50
51
52
53
54 public abstract class DefinitionProviderWrapperWithProxyFallback<T> extends DefinitionProviderWrapper<T> {
55
56 private static final Logger log = LoggerFactory.getLogger(DefinitionProviderWrapperWithProxyFallback.class);
57
58 public DefinitionProviderWrapperWithProxyFallback(DefinitionProvider<T> delegate) {
59 super(delegate);
60 }
61
62 @Override
63 public final T get() {
64 final T decoratedBean = doGet();
65
66 if (decoratedBean == null) {
67 return null;
68 }
69
70 return Decorating.proxy(decoratedBean).visiting(new Decorator<T>() {
71 @Override
72 public Object decorateResult(T proxy, Method method, Object[] args, Object result) {
73 if (result == null) {
74 try {
75 return method.invoke(getDelegate().get());
76 } catch (ReflectiveOperationException e) {
77 log.debug("Failed to invoke fallback method call due to a reflection operation problem: {}", method.toString(), e.getMessage());
78 } catch (Exception e) {
79 log.debug("Failed to invoke fallback method call due to: {}", method.toString(), e.getMessage());
80 }
81 }
82 return super.decorateResult(proxy, method, args, result);
83 }
84 }).build(new CglibProxyFactory());
85 }
86
87 protected abstract T doGet();
88 }