01: /*
02: * Copyright 2007 The Kuali Foundation
03: *
04: * Licensed under the Educational Community License, Version 1.0 (the "License");
05: * you may not use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.opensource.org/licenses/ecl1.php
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License.
15: */
16: package org.kuali.rice.ojb;
17:
18: import java.util.Collection;
19:
20: import org.apache.ojb.broker.PBKey;
21: import org.apache.ojb.broker.PersistenceBrokerException;
22: import org.apache.ojb.broker.core.proxy.SetProxyDefaultImpl;
23: import org.apache.ojb.broker.query.Query;
24: import org.kuali.rice.util.ClassLoaderUtils;
25: import org.kuali.rice.util.ContextClassLoaderBinder;
26:
27: /**
28: * Sets up the context classloader properly for OJB proxies. The sequence of events in the super class is as
29: * follows:
30: *
31: * <pre>
32: * public synchronized Collection getData()
33: * {
34: * if (!isLoaded())
35: * {
36: * beforeLoading();
37: * setData(loadData());
38: * afterLoading();
39: * }
40: * return _data;
41: * }
42: * </pre>
43: *
44: * Therefore, since there is no try-catch-finally in conjunction with this call, we need to handle exceptions thrown
45: * from loadData and unbind the classloader appropriately.
46: */
47: public class ContextClassLoaderSetProxy extends SetProxyDefaultImpl {
48:
49: private static final long serialVersionUID = -2274968495694456744L;
50:
51: private ClassLoader contextClassLoader;
52:
53: public ContextClassLoaderSetProxy(PBKey aKey, Class aCollClass,
54: Query aQuery) {
55: super (aKey, aCollClass, aQuery);
56: this .contextClassLoader = ClassLoaderUtils
57: .getDefaultClassLoader();
58: }
59:
60: public ContextClassLoaderSetProxy(PBKey aKey, Query aQuery) {
61: super (aKey, aQuery);
62: this .contextClassLoader = ClassLoaderUtils
63: .getDefaultClassLoader();
64: }
65:
66: @Override
67: protected void beforeLoading() {
68: ContextClassLoaderBinder.bind(this .contextClassLoader);
69: super .beforeLoading();
70: }
71:
72: @Override
73: protected Collection loadData() throws PersistenceBrokerException {
74: try {
75: return super .loadData();
76: } catch (Throwable t) {
77: ContextClassLoaderBinder.unbind();
78: if (t instanceof PersistenceBrokerException) {
79: throw (PersistenceBrokerException) t;
80: } else if (t instanceof Error) {
81: throw (Error) t;
82: } else if (t instanceof RuntimeException) {
83: throw (RuntimeException) t;
84: } else {
85: throw new PersistenceBrokerException(
86: "Invalid exception type thrown!", t);
87: }
88: }
89: }
90:
91: @Override
92: protected void afterLoading() {
93: super.afterLoading();
94: ContextClassLoaderBinder.unbind();
95: }
96:
97: }
|