01: /*
02: * All content copyright (c) 2003-2007 Terracotta, Inc., except as may otherwise be noted in a separate copyright
03: * notice. All rights reserved.
04: */
05: package org.terracotta.modules.cglib_2_1_3.object.config;
06:
07: import org.terracotta.modules.cglib_2_1_3.object.dna.impl.CGLibBulkBeanInstance;
08: import org.terracotta.modules.cglib_2_1_3.object.dna.impl.CGLibFactoryInstance;
09:
10: import com.tc.object.config.ChangeApplicatorSpec;
11:
12: public class CGLibChangeApplicatorSpec implements ChangeApplicatorSpec {
13: private final static String CGLIB_FACTORY_APPLICATOR_CLASS_NAME = "org.terracotta.modules.cglib_2_1_3.object.applicator.CglibProxyApplicator";
14: private final static String CGLIB_BULK_BEAN_APPLICATOR_CLASS_NAME = "org.terracotta.modules.cglib_2_1_3.object.applicator.CglibBulkBeanApplicator";
15:
16: private final ClassLoader classLoader;
17:
18: public CGLibChangeApplicatorSpec(ClassLoader classLoader) {
19: this .classLoader = classLoader;
20: }
21:
22: public Class getChangeApplicator(Class clazz) {
23: String changeApplicatorClassName = null;
24: if (isImplementCglibFactory(clazz)) {
25: changeApplicatorClassName = CGLIB_FACTORY_APPLICATOR_CLASS_NAME;
26: } else if (isCglibBulkBean(clazz)) {
27: changeApplicatorClassName = CGLIB_BULK_BEAN_APPLICATOR_CLASS_NAME;
28: }
29: if (changeApplicatorClassName != null) {
30: try {
31: if (classLoader == null) {
32: return Class.forName(changeApplicatorClassName);
33: } else {
34: return Class.forName(changeApplicatorClassName,
35: false, classLoader);
36: }
37: } catch (Exception e) {
38: throw new AssertionError(e);
39: }
40: }
41: return null;
42: }
43:
44: private static boolean isImplementCglibFactory(Class clazz) {
45: if (CGLibFactoryInstance.class.getName()
46: .equals(clazz.getName())) {
47: return true;
48: }
49:
50: Class[] interfaces = clazz.getInterfaces();
51: for (int i = 0; i < interfaces.length; i++) {
52: if (interfaces[i].getName().equals(
53: "net.sf.cglib.proxy.Factory")) {
54: return true;
55: }
56: }
57: return false;
58: }
59:
60: private static boolean isCglibBulkBean(Class clazz) {
61: if (CGLibBulkBeanInstance.class.getName().equals(
62: clazz.getName())) {
63: return true;
64: }
65:
66: Class super Class = clazz.getSuperclass();
67: if (super Class == null) {
68: return false;
69: }
70: return "net.sf.cglib.beans.BulkBean".equals(superClass
71: .getName());
72: }
73:
74: }
|