Improve hibernate
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.hibernate / src / main / java / org / argeo / server / hibernate / LightDaoInterceptor.java
index 3bb13f37d97a66178c887b992c525b84cdaf3fc8..4d6f7d951f49416c854ff1f8c7603e1f2bcb68a8 100644 (file)
@@ -1,5 +1,6 @@
 package org.argeo.server.hibernate;
 
+import java.beans.PropertyDescriptor;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -41,12 +42,12 @@ public class LightDaoInterceptor extends EmptyInterceptor {
                                String field = businessIdFields.get(clss);
                                Object value = bidMappings.get(clss).get(id);
                                res = lightDaoSupport.getByField(clss, field, value);
-                               if (log.isDebugEnabled())
+                               if (log.isTraceEnabled())
                                        log.debug("Got entity " + clss + " (" + field + "=" + value
                                                        + ")");
                        } else {
                                res = lightDaoSupport.getByKey(clss, id);
-                               if (log.isDebugEnabled())
+                               if (log.isTraceEnabled())
                                        log.debug("Got entity " + clss + " (id=" + id + ")");
                        }
                } else {
@@ -75,7 +76,7 @@ public class LightDaoInterceptor extends EmptyInterceptor {
                                BeanWrapper bw = new BeanWrapperImpl(entity);
                                Object bid = bw.getPropertyValue(businessIdFields.get(clss));
                                bidMappings.get(clss).put(id, bid);
-                               if (log.isDebugEnabled())
+                               if (log.isTraceEnabled())
                                        log.debug("Mapped tid " + id + " with bid " + bid + " for "
                                                        + clss);
                        }
@@ -83,6 +84,48 @@ public class LightDaoInterceptor extends EmptyInterceptor {
                return super.onSave(entity, id, state, propertyNames, types);
        }
 
+       @Override
+       public boolean onLoad(Object entity, Serializable id, Object[] state,
+                       String[] propertyNames, Type[] types) {
+               Class<?> clss = entity.getClass();
+               Object source = null;
+               if (lightDaoSupport.getSupportedClasses().contains(clss)) {
+                       if (businessIdFields.containsKey(clss)) {
+                               String field = businessIdFields.get(clss);
+                               Object value = bidMappings.get(clss).get(id);
+                               source = lightDaoSupport.getByField(clss, field, value);
+                               if (log.isTraceEnabled())
+                                       log.debug("Loading entity " + clss + " (" + field + "="
+                                                       + value + ")");
+                       } else {
+                               source = lightDaoSupport.getByKey(clss, id);
+                               if (log.isTraceEnabled())
+                                       log.debug("Loading entity " + clss + " (id=" + id + ")");
+                       }
+               }
+
+               if (source != null) {
+                       BeanWrapper bwTarget = new BeanWrapperImpl(entity);
+                       BeanWrapper bwSource = new BeanWrapperImpl(source);
+                       for (PropertyDescriptor pd : bwTarget.getPropertyDescriptors()) {
+                               String propName = pd.getName();
+                               if (bwSource.isReadableProperty(propName)
+                                               && bwTarget.isWritableProperty(propName)) {
+                                       bwTarget.setPropertyValue(propName, bwSource
+                                                       .getPropertyValue(propName));
+                                       if (log.isTraceEnabled())
+                                               log.debug("Loaded property " + propName + " for class "
+                                                               + clss + " (id=" + id + ")");
+                               }
+                       }
+
+                       return true;
+               } else {
+                       // res = super.getEntity(entityName, id);
+                       return super.onLoad(entity, id, state, propertyNames, types);
+               }
+       }
+
        protected Boolean supports(Object object) {
                if (classes.contains(object.getClass()))
                        return lightDaoSupport.getSupportedClasses().contains(