merge trunk and bugfix linkbackuri jaxb
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / jaxb / CdmAccessor.java
1 package eu.etaxonomy.cdm.jaxb;
2
3 import org.apache.log4j.Logger;
4 import org.hibernate.Hibernate;
5 import org.hibernate.proxy.HibernateProxy;
6
7 import com.sun.xml.bind.api.AccessorException;
8 import com.sun.xml.bind.v2.runtime.JAXBContextImpl;
9 import com.sun.xml.bind.v2.runtime.reflect.Accessor;
10
11 public class CdmAccessor<BeanT,ValueT> extends Accessor<BeanT,ValueT> {
12
13 private static final Logger logger = Logger.getLogger(CdmAccessor.class);
14
15 private Accessor<BeanT, ValueT> delegate;
16
17 public CdmAccessor(Accessor<BeanT, ValueT> delegate) {
18 super(delegate.getValueType());
19 this.delegate = delegate;
20 }
21
22 @Override
23 public Accessor<BeanT, ValueT> optimize(JAXBContextImpl context) {
24 delegate = delegate.optimize(context);
25 return this;
26 }
27
28 @Override
29 public ValueT get(BeanT bean) throws AccessorException {
30 return hideLazy(delegate.get(bean));
31 }
32
33 @Override
34 public void set(BeanT bean, ValueT value) throws AccessorException {
35 delegate.set(bean, value);
36 }
37
38 protected ValueT hideLazy(ValueT value) {
39 if (Hibernate.isInitialized(value)) {
40 if(value instanceof HibernateProxy) {
41 logger.info("Accessor Returning " + value + " as unwrapped proxy");
42 return (ValueT)((HibernateProxy)value).getHibernateLazyInitializer().getImplementation();
43 } else {
44 logger.info("Accessor Returning " + value);
45 return value;
46 }
47 }
48 return null;
49 }
50 }