View Javadoc

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   * This class provides a simple mechanism for enabling Spring to create proxied objects. By default a NoOp CallBack will
13   * be associated with the proxy object (not very useful) but you can inject any custom CallBack as desired.
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  }