Project

General

Profile

« Previous | Next » 

Revision 2e12ec86

Added by Andreas Müller over 15 years ago

HibernateProxyHelper bug (v2.0)

View differences:

.gitattributes
775 775
cdmlib-model/pom.xml -text
776 776
cdmlib-model/src/main/java/eu/etaxonomy/cdm/aspectj/PropertyChangeAspect.aj -text
777 777
cdmlib-model/src/main/java/eu/etaxonomy/cdm/datagenerator/TaxonGenerator.java -text
778
cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/HibernateProxyHelper.java -text
778 779
cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/DateTimeAdapter.java -text
779 780
cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/MultilanguageTextAdapter.java -text
780 781
cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/UUIDAdapter.java -text
......
807 808
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IIdentifiableEntity.java -text
808 809
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ILoadableTerm.java -text
809 810
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IParsable.java -text
810
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IProxyHelper.java -text
811 811
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IReferencedEntity.java -text
812 812
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IRelated.java -text
813 813
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ISourceable.java -text
......
825 825
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OrderedTermVocabulary.java -text
826 826
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OriginalSource.java -text
827 827
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/PartialUserType.java -text
828
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ProxyHelperHibernateImpl.java -text
829 828
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ReferencedEntityBase.java -text
830 829
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/RelationshipBase.java -text
831 830
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/RelationshipTermBase.java -text
cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/HibernateProxyHelper.java
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy 
4
* http://www.e-taxonomy.eu
5
* 
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

  
10
package eu.etaxonomy.cdm.hibernate;
11

  
12
import org.apache.log4j.Logger;
13
import org.hibernate.proxy.HibernateProxy;
14

  
15
/**
16
 * @author a.mueller
17
 * @created 03.03.2009
18
 * @version 1.0
19
 */
20
public class HibernateProxyHelper {
21
	@SuppressWarnings("unused")
22
	private static final Logger logger = Logger.getLogger(HibernateProxyHelper.class);
23
	
24
	
25
	// ************************** Hibernate proxies *******************/
26
	/* (non-Javadoc)
27
	 * @see eu.etaxonomy.cdm.model.common.IProxyHelper#deproxy(java.lang.Object, java.lang.Class)
28
	 */
29
	 public static <T> T deproxy(Object object, Class<T> clazz) throws ClassCastException {
30
	     if (object instanceof HibernateProxy) {
31
	         return clazz.cast(((HibernateProxy) object).getHibernateLazyInitializer().getImplementation());
32
	     } else {
33
	         return clazz.cast(object);
34
	     }
35
	 }
36
	        
37
	 /* (non-Javadoc)
38
	 * @see eu.etaxonomy.cdm.model.common.IProxyHelper#isInstanceOf(java.lang.Object, java.lang.Class)
39
	 */
40
	public static boolean isInstanceOf(Object object, Class clazz) throws ClassCastException {
41
	     if (clazz == null){
42
	    	 return false;
43
	     }
44
		 if (object instanceof HibernateProxy) {
45
	    	 Object impl =  ((HibernateProxy) object).getHibernateLazyInitializer().getImplementation();
46
	         Class implClass = impl.getClass();
47
	         return clazz.isAssignableFrom(implClass);
48
	     } else {
49
	         return clazz.isAssignableFrom(object.getClass());
50
	     }
51
	 }
52
}
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/CdmBase.java
13 13
import javax.persistence.Id;
14 14
import javax.persistence.ManyToOne;
15 15
import javax.persistence.MappedSuperclass;
16
import javax.persistence.Temporal;
17
import javax.persistence.TemporalType;
18 16
import javax.persistence.Transient;
19 17
import javax.xml.bind.annotation.XmlAccessType;
20 18
import javax.xml.bind.annotation.XmlAccessorType;
......
34 32
import org.hibernate.search.annotations.DocumentId;
35 33
import org.joda.time.DateTime;
36 34

  
35
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
37 36
import eu.etaxonomy.cdm.jaxb.DateTimeAdapter;
38 37
import eu.etaxonomy.cdm.jaxb.UUIDAdapter;
39 38
import eu.etaxonomy.cdm.model.agent.Person;
......
65 64
	private static final long serialVersionUID = -3053225700018294809L;
66 65
	@SuppressWarnings("unused")
67 66
	private static final Logger logger = Logger.getLogger(CdmBase.class);
68

  
69
	private static IProxyHelper proxyHelper = new ProxyHelperHibernateImpl();
70

  
71 67
	
72 68
	private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
73 69
	private int id;
......
351 347
	 * @return
352 348
	 * @throws ClassCastException
353 349
	 */
354
	 public <T extends CdmBase> T deproxy(Class<T> clazz) throws ClassCastException {
355
		 return proxyHelper.deproxy(this, clazz);
350
	//non-static does not work because javassist already unwrapps the proxy before calling the method
351
	 public static <T extends CdmBase> T deproxy(Object object, Class<T> clazz) throws ClassCastException {
352
		 return HibernateProxyHelper.deproxy(object, clazz);
356 353
	 }
357 354
	        
358 355
	 public boolean isInstanceOf(Class<? extends CdmBase> clazz) throws ClassCastException {
359
	     return proxyHelper.isInstanceOf(this, clazz);
356
	     return HibernateProxyHelper.isInstanceOf(this, clazz);
360 357
	 }
361 358
	
362 359
}
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IProxyHelper.java
1
package eu.etaxonomy.cdm.model.common;
2

  
3

  
4
public interface IProxyHelper {
5

  
6
	// ************************** Hibernate proxies *******************/
7
	/**
8
	 * These methods are present due to HHH-1517 - that in a one-to-many
9
	 * relationship with a superclass at the "one" end, the proxy created
10
	 * by hibernate is the superclass, and not the subclass, resulting in
11
	 * a classcastexception when you try to cast it.
12
	 *
13
	 * Hopefully this will be resolved through improvements with the creation of
14
	 * proxy objects by hibernate and the following methods will become redundant,
15
	 * but for the time being . . .
16
	 * @param <T>
17
	 * @param object
18
	 * @param clazz
19
	 * @return
20
	 * @throws ClassCastException
21
	 */
22
	public <T> T deproxy(Object object, Class<T> clazz)
23
			throws ClassCastException;
24

  
25
	public boolean isInstanceOf(Object object, Class clazz)
26
			throws ClassCastException;
27

  
28
}
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/ProxyHelperHibernateImpl.java
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy 
4
* http://www.e-taxonomy.eu
5
* 
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

  
10
package eu.etaxonomy.cdm.model.common;
11

  
12
import org.apache.log4j.Logger;
13
import org.hibernate.proxy.HibernateProxy;
14

  
15
/**
16
 * @author a.mueller
17
 * @created 03.03.2009
18
 * @version 1.0
19
 */
20
public class ProxyHelperHibernateImpl implements IProxyHelper {
21
	@SuppressWarnings("unused")
22
	private static final Logger logger = Logger.getLogger(ProxyHelperHibernateImpl.class);
23
	
24
	
25
	// ************************** Hibernate proxies *******************/
26
	/* (non-Javadoc)
27
	 * @see eu.etaxonomy.cdm.model.common.IProxyHelper#deproxy(java.lang.Object, java.lang.Class)
28
	 */
29
	 public <T> T deproxy(Object object, Class<T> clazz) throws ClassCastException {
30
	     if (object instanceof HibernateProxy) {
31
	         return clazz.cast(((HibernateProxy) object).getHibernateLazyInitializer().getImplementation());
32
	     } else {
33
	         return clazz.cast(object);
34
	     }
35
	 }
36
	        
37
	 /* (non-Javadoc)
38
	 * @see eu.etaxonomy.cdm.model.common.IProxyHelper#isInstanceOf(java.lang.Object, java.lang.Class)
39
	 */
40
	public boolean isInstanceOf(Object object, Class clazz) throws ClassCastException {
41
	     if (clazz == null){
42
	    	 return false;
43
	     }
44
		 if (object instanceof HibernateProxy) {
45
	    	 Object impl =  ((HibernateProxy) object).getHibernateLazyInitializer().getImplementation();
46
	         Class implClass = impl.getClass();
47
	         return clazz.isAssignableFrom(implClass);
48
	     } else {
49
	         return clazz.isAssignableFrom(object.getClass());
50
	     }
51
	 }
52
}

Also available in: Unified diff