1 package org.kuali.spring.util;
2
3 import net.sf.cglib.proxy.Callback;
4 import net.sf.cglib.proxy.Enhancer;
5 import net.sf.cglib.proxy.NoOp;
6
7 import org.springframework.beans.BeanUtils;
8 import org.springframework.beans.factory.FactoryBean;
9 import org.springframework.util.Assert;
10
11
12
13
14
15 public class SimpleProxyFactoryBean implements FactoryBean<Object> {
16 public static final Callback DEFAULT_CALLBACK = NoOp.INSTANCE;
17 public static final boolean DEFAULT_IS_COPY_SOURCE_BEAN_PROPERTIES = true;
18
19 Callback callback = DEFAULT_CALLBACK;
20 String classname;
21 Object sourceBean;
22 boolean copySourceBeanProperties = DEFAULT_IS_COPY_SOURCE_BEAN_PROPERTIES;
23
24 public SimpleProxyFactoryBean() {
25 this(null, DEFAULT_CALLBACK);
26 }
27
28 public SimpleProxyFactoryBean(String classname) {
29 this(classname, DEFAULT_CALLBACK);
30 }
31
32 public SimpleProxyFactoryBean(String classname, Callback callback) {
33 super();
34 this.classname = classname;
35 this.callback = callback;
36 }
37
38 @Override
39 public Object getObject() throws Exception {
40 Assert.isTrue(this.classname != null || this.sourceBean != null);
41 Assert.notNull(this.callback);
42 if (this.copySourceBeanProperties) {
43 Assert.notNull(this.sourceBean);
44 }
45
46 Class<?> targetClass = getTargetClass();
47 Enhancer enhancer = new Enhancer();
48 enhancer.setSuperclass(targetClass);
49 enhancer.setCallback(getCallback());
50 Object proxy = enhancer.create();
51 if (this.copySourceBeanProperties) {
52 BeanUtils.copyProperties(this.sourceBean, proxy);
53 }
54 return proxy;
55 }
56
57 protected Class<?> getTargetClass() throws ClassNotFoundException {
58 if (this.classname != null) {
59 return Class.forName(this.classname);
60 } else {
61 return this.sourceBean.getClass();
62 }
63 }
64
65 @Override
66 public Class<?> getObjectType() {
67 return Object.class;
68 }
69
70 @Override
71 public boolean isSingleton() {
72 return false;
73 }
74
75 public Callback getCallback() {
76 return callback;
77 }
78
79 public void setCallback(Callback callback) {
80 this.callback = callback;
81 }
82
83 public String getClassname() {
84 return classname;
85 }
86
87 public void setClassname(String classname) {
88 this.classname = classname;
89 }
90
91 public Object getSourceBean() {
92 return sourceBean;
93 }
94
95 public void setSourceBean(Object source) {
96 this.sourceBean = source;
97 }
98
99 }