1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.proxy2;
18
19 import java.util.Arrays;
20 import java.util.ServiceLoader;
21
22
23
24
25
26 class DefaultProxyFactory implements ProxyFactory
27 {
28
29 static final DefaultProxyFactory INSTANCE = new DefaultProxyFactory();
30
31 private static final ServiceLoader<ProxyFactory> SERVICES = ServiceLoader.load(ProxyFactory.class);
32
33
34
35
36 @Override
37 public boolean canProxy(Class<?>... proxyClasses)
38 {
39 for (ProxyFactory proxyFactory : SERVICES)
40 {
41 if (proxyFactory.canProxy(proxyClasses))
42 {
43 return true;
44 }
45 }
46 return false;
47 }
48
49
50
51
52 @Override
53 public <T> T createDelegatorProxy(ObjectProvider<?> delegateProvider, Class<?>... proxyClasses)
54 {
55 @SuppressWarnings("unchecked")
56 final T result = (T) getCapableProxyFactory(proxyClasses).createDelegatorProxy(delegateProvider, proxyClasses);
57 return result;
58 }
59
60
61
62
63 @Override
64 public <T> T createDelegatorProxy(ClassLoader classLoader, ObjectProvider<?> delegateProvider,
65 Class<?>... proxyClasses)
66 {
67 @SuppressWarnings("unchecked")
68 final T result = (T) getCapableProxyFactory(proxyClasses).createDelegatorProxy(classLoader, delegateProvider,
69 proxyClasses);
70 return result;
71 }
72
73
74
75
76 @Override
77 public <T> T createInterceptorProxy(Object target, Interceptor interceptor, Class<?>... proxyClasses)
78 {
79 @SuppressWarnings("unchecked")
80 final T result = (T) getCapableProxyFactory(proxyClasses).createInterceptorProxy(target, interceptor,
81 proxyClasses);
82 return result;
83 }
84
85
86
87
88 @Override
89 public <T> T createInterceptorProxy(ClassLoader classLoader, Object target, Interceptor interceptor,
90 Class<?>... proxyClasses)
91 {
92 @SuppressWarnings("unchecked")
93 final T result = (T) getCapableProxyFactory(proxyClasses).createInterceptorProxy(classLoader, target,
94 interceptor, proxyClasses);
95 return result;
96 }
97
98
99
100
101 @Override
102 public <T> T createInvokerProxy(Invoker invoker, Class<?>... proxyClasses)
103 {
104 @SuppressWarnings("unchecked")
105 final T result = (T) getCapableProxyFactory(proxyClasses).createInvokerProxy(invoker, proxyClasses);
106 return result;
107 }
108
109
110
111
112 @Override
113 public <T> T createInvokerProxy(ClassLoader classLoader, Invoker invoker, Class<?>... proxyClasses)
114 {
115 @SuppressWarnings("unchecked")
116 final T result = (T) getCapableProxyFactory(proxyClasses)
117 .createInvokerProxy(classLoader, invoker, proxyClasses);
118 return result;
119 }
120
121 private ProxyFactory getCapableProxyFactory(Class<?>... proxyClasses)
122 {
123 for (ProxyFactory proxyFactory : SERVICES)
124 {
125 if (proxyFactory.canProxy(proxyClasses))
126 {
127 return proxyFactory;
128 }
129 }
130 throw new IllegalArgumentException("Could not proxy " + Arrays.toString(proxyClasses));
131 }
132 }