From: <mol...@us...> - 2007-10-16 13:45:38
|
Revision: 467 http://openutils.svn.sourceforge.net/openutils/?rev=467&view=rev Author: molaschi Date: 2007-10-16 06:45:42 -0700 (Tue, 16 Oct 2007) Log Message: ----------- - cache dei proxy per classe - correzione baco paginazione Modified Paths: -------------- trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/HibernateLazyRmiInterceptor.java trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/LazyReferenceAspect.java trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/SerializationInterceptor.java trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/managers/HibernateLazyServiceImpl.java Modified: trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/HibernateLazyRmiInterceptor.java =================================================================== --- trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/HibernateLazyRmiInterceptor.java 2007-10-16 11:00:26 UTC (rev 466) +++ trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/HibernateLazyRmiInterceptor.java 2007-10-16 13:45:42 UTC (rev 467) @@ -40,6 +40,7 @@ { Object retVal = invocation.proceed(); + SerializationInterceptor.clean(); // Proxy class for serialization work return SerializationInterceptor.getEnhancedObject(retVal, sessionFactory); } Modified: trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/LazyReferenceAspect.java =================================================================== --- trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/LazyReferenceAspect.java 2007-10-16 11:00:26 UTC (rev 466) +++ trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/LazyReferenceAspect.java 2007-10-16 13:45:42 UTC (rev 467) @@ -23,7 +23,6 @@ return lazyReference; } - public void setLazyReference(LazyReference lazyReference) { this.lazyReference = lazyReference; Modified: trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/SerializationInterceptor.java =================================================================== --- trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/SerializationInterceptor.java 2007-10-16 11:00:26 UTC (rev 466) +++ trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/aspects/SerializationInterceptor.java 2007-10-16 13:45:42 UTC (rev 467) @@ -6,13 +6,18 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.CallbackFilter; import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.Factory; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.NoOp; @@ -24,6 +29,7 @@ import org.hibernate.EntityMode; import org.hibernate.SessionFactory; import org.hibernate.collection.PersistentCollection; +import org.hibernate.collection.PersistentSet; import org.hibernate.proxy.HibernateProxy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,6 +44,10 @@ public class SerializationInterceptor implements MethodInterceptor { + private static ThreadLocal<List<Object>> processed = new ThreadLocal<List<Object>>(); + + private static Map<Class, Object> proxies = Collections.synchronizedMap(new HashMap<Class, Object>()); + /** * log */ @@ -64,6 +74,11 @@ this.sessionFactory = sessionFactory; } + public static void clean() + { + processed.set(null); + } + /** * Get proxy object intercepting writeReplace calls * @param o object to be proxied @@ -89,6 +104,14 @@ return null; } + if (!(o instanceof HibernateProxy) + && !(o instanceof PersistentSet) + && processed.get() != null + && processed.get().contains(o)) + { + return o; + } + // check if there is an empty constructor try { @@ -135,8 +158,16 @@ callback = new SerializationInterceptor(o, sessionFactory); } + synchronized (proxies) + { + if (proxies.containsKey(clazz)) + { + Factory proxy = (Factory)proxies.get(clazz); + return proxy.newInstance(new Callback[]{callback, NoOp.INSTANCE }); + } + } // create proxy to listen on writeReplace method calls - return Enhancer.create(clazz, new Class[]{EntitySerializer.class }, new CallbackFilter() + Object proxy = Enhancer.create(clazz, new Class[]{EntitySerializer.class }, new CallbackFilter() { public int accept(Method method) @@ -152,6 +183,10 @@ } }, new Callback[]{callback, NoOp.INSTANCE }); + + // store proxy + proxies.put(clazz, ((Factory)proxy).newInstance(new Callback[]{EmptyMethodInterceptor.INSTANCE, NoOp.INSTANCE })); + return proxy; } catch (Throwable t) { @@ -161,7 +196,6 @@ } /** - * * {@inheritDoc} */ @SuppressWarnings("unchecked") @@ -174,8 +208,17 @@ { return null; } - else if (original.getClass().isPrimitive()) + + if (processed.get() == null) { + processed.set(new ArrayList<Object>()); + } + + // add to processed objects + processed.get().add(original); + + if (original.getClass().isPrimitive()) + { return original; } else if (original.getClass().isArray()) @@ -214,8 +257,8 @@ // cycle on bean fields ReflectionUtils.doWithFields(original.getClass(), new ReflectionUtils.FieldCallback() { + /** - * * {@inheritDoc} */ public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException @@ -229,10 +272,7 @@ // get new value Object newValue = null; - if ((oldValue instanceof HibernateProxy && ((HibernateProxy) oldValue) - .getHibernateLazyInitializer() - .isUninitialized()) - || oldValue instanceof PersistentCollection) + if (oldValue instanceof HibernateProxy || oldValue instanceof PersistentCollection) { // if this field is a hibernate proxy or a persistent collection store reference LazyReference lazyRef = new LazyReference(); @@ -240,7 +280,9 @@ lazyRef.setClassName(original.getClass().getName()); lazyRef.setFieldName(field.getName()); // load id - lazyRef.setId(sessionFactory.getClassMetadata(original.getClass()).getIdentifier(original, EntityMode.POJO)); + lazyRef.setId(sessionFactory.getClassMetadata(original.getClass()).getIdentifier( + original, + EntityMode.POJO)); // get proxy for lazy newValue = SerializationInterceptor.getEnhancedObject(oldValue, sessionFactory, lazyRef); Modified: trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/managers/HibernateLazyServiceImpl.java =================================================================== --- trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/managers/HibernateLazyServiceImpl.java 2007-10-16 11:00:26 UTC (rev 466) +++ trunk/openutils-spring-rmibernate/src/main/java/it/openutils/spring/rmibernate/server/managers/HibernateLazyServiceImpl.java 2007-10-16 13:45:42 UTC (rev 467) @@ -51,6 +51,12 @@ @SuppressWarnings("unchecked") public Object invoke(final String className, final String methodName, final Serializable id) throws RemoteException { + return invoke(className, methodName, id, true); + } + + private Object invoke(final String className, final String methodName, final Serializable id, final boolean init) + throws RemoteException + { try { HibernateTemplate ht = new HibernateTemplate(sessionFactory); @@ -63,7 +69,10 @@ { Object entity = sessionFactory.getCurrentSession().load(Class.forName(className), id); Object retVal = PropertyUtils.getProperty(entity, methodName); - Hibernate.initialize(retVal); + if (init) + { + return init(retVal); + } return retVal; } catch (Exception ex) @@ -80,6 +89,56 @@ } } + @SuppressWarnings("unchecked") + private Object init(Object o) + { + if (o == null) + { + return null; + } + + // get class + if (o instanceof HibernateProxy) + { + Hibernate.initialize(o); + return o; + } + + if (o instanceof List) + { + return new ArrayList((List) o); + } + + if (o instanceof SortedSet) + { + PersistentSortedSet pss = (PersistentSortedSet) o; + SortedSet ss = new TreeSet(pss.comparator()); + ss.addAll((Collection) o); + return ss; + } + + if (o instanceof Set) + { + return new HashSet((Collection) o); + } + + if (o instanceof SortedMap) + { + PersistentSortedMap psm = (PersistentSortedMap) o; + SortedMap sm = new TreeMap(psm.comparator()); + sm.putAll((Map) o); + return sm; + } + + if (o instanceof Map) + { + return new HashMap((Map) o); + } + + // it should never reach this line... + return null; + } + /** * {@inheritDoc} */ @@ -90,7 +149,7 @@ try { // get lazy prop - final Object lazy = invoke(className, propertyName, id); + final Object lazy = invoke(className, propertyName, id, false); if (lazy == null) { @@ -101,9 +160,9 @@ Class fClass = lazy.getClass(); // if is a single object proxy - if (fClass.isAssignableFrom(HibernateProxy.class)) + if (lazy instanceof HibernateProxy) { - return lazy; + return init(lazy); } else { @@ -119,38 +178,9 @@ } // the list is already right and can be processed - if (from <= 0 && size <= count) + if (from <= 0 && size >= count) { - // could be clean and returned - if (lazy instanceof List) - { - return new ArrayList((List) lazy); - } - if (lazy instanceof SortedSet) - { - PersistentSortedSet pss = (PersistentSortedSet) lazy; - SortedSet ss = new TreeSet(pss.comparator()); - ss.addAll((Collection) lazy); - return ss; - } - if (lazy instanceof Set) - { - return new HashSet((Collection) lazy); - } - if (lazy instanceof SortedMap) - { - PersistentSortedMap psm = (PersistentSortedMap) lazy; - SortedMap sm = new TreeMap(psm.comparator()); - sm.putAll((Map) lazy); - return sm; - } - if (lazy instanceof Map) - { - return new HashMap((Map) lazy); - } - - // it should never reach this line... - return null; + return init(lazy); } } @@ -176,24 +206,24 @@ return null; } - if (fClass.isAssignableFrom(PersistentCollection.class)) + if (lazy instanceof PersistentCollection) { - if (fClass.isAssignableFrom(List.class)) + if (lazy instanceof List) { return list; } - if (fClass.isAssignableFrom(SortedSet.class)) + if (lazy instanceof SortedSet) { - PersistentSortedSet pss = (PersistentSortedSet) invoke(className, propertyName, id); + PersistentSortedSet pss = (PersistentSortedSet) lazy; SortedSet ss = new TreeSet(pss.comparator()); ss.addAll(list); return ss; } - if (fClass.isAssignableFrom(Set.class)) + if (lazy instanceof Set) { return new HashSet(list); } - if (fClass.isAssignableFrom(SortedMap.class)) + if (lazy instanceof SortedMap) { PersistentSortedMap psm = (PersistentSortedMap) invoke(className, propertyName, id); SortedMap sm = new TreeMap(psm.comparator()); @@ -204,7 +234,7 @@ } return sm; } - if (fClass.isAssignableFrom(Map.class)) + if (lazy instanceof Map) { Map m = new HashMap(); for (Object o : list) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |