View Javadoc

1   /*
2    * Copyright 2007-2008 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
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.core.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.core.util.ClassLoaderUtils;
25  import org.kuali.rice.core.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, Query aQuery) {
54  		super(aKey, aCollClass, aQuery);
55  		this.contextClassLoader = ClassLoaderUtils.getDefaultClassLoader();
56  	}
57  
58  	public ContextClassLoaderSetProxy(PBKey aKey, Query aQuery) {
59  		super(aKey, aQuery);
60  		this.contextClassLoader = ClassLoaderUtils.getDefaultClassLoader();	
61  	}
62  
63  	@Override
64  	protected void beforeLoading() {
65  		ContextClassLoaderBinder.bind(this.contextClassLoader);
66  		super.beforeLoading();
67  	}
68  	
69  	@Override
70  	protected Collection loadData() throws PersistenceBrokerException {
71  		try {
72  			return super.loadData();
73  		} catch (Throwable t) {
74  			ContextClassLoaderBinder.unbind();
75  			if (t instanceof PersistenceBrokerException) {
76  				throw (PersistenceBrokerException)t;
77  			} else if (t instanceof Error) {
78  				throw (Error)t;
79  			} else if (t instanceof RuntimeException) {
80  				throw (RuntimeException)t;
81  			} else {
82  				throw new PersistenceBrokerException("Invalid exception type thrown!", t);
83  			}
84  		}
85  	}
86  
87  	@Override
88  	protected void afterLoading() {
89  		super.afterLoading();
90  		ContextClassLoaderBinder.unbind();
91  	}
92  
93  	
94  }