From 4b1f822a37c55444b12b7f682d3cc153cdf3510a Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 9 Oct 2009 13:22:13 +0000
Subject: [PATCH] fixed integration tests

SVN: 12893
---
 .../generic/server/AbstractServer.java        |   6 +-
 .../server/util/HibernateTransformer.java     | 188 ++++++++++++++++++
 2 files changed, 193 insertions(+), 1 deletion(-)
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/HibernateTransformer.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index 2a1b87e56a1..834b2fc751e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.server.plugin.DataSetServerPluginRegistr
 import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.server.plugin.SampleServerPluginRegistry;
+import ch.systemsx.cisd.openbis.generic.server.util.HibernateTransformer;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IDataStoreBaseURLProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -261,7 +262,10 @@ public abstract class AbstractServer<T extends IServer> extends AbstractServiceW
             person.setRoleAssignments(Collections.singleton(roleAssignment));
             daoFactory.getPersonDAO().updatePerson(person);
         }
-        return session;
+        // need to transform session because it contains PersonPE and is transfered to DSS
+        final Session transformedSession =
+                HibernateTransformer.HIBERNATE_BEAN_REPLICATOR.get().copy(session);
+        return transformedSession;
     }
 
     public void saveDisplaySettings(String sessionToken, DisplaySettings displaySettings)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/HibernateTransformer.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/HibernateTransformer.java
new file mode 100644
index 00000000000..615aae5edd5
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/HibernateTransformer.java
@@ -0,0 +1,188 @@
+/*     
+ * Copyright 2008 ETH Zuerich, CISD         
+ *          
+ * Licensed under the Apache License, Version 2.0 (the "License");          
+ * you may not use this file except in compliance with the License.         
+ * You may obtain a copy of the License at          
+ *          
+ *      http://www.apache.org/licenses/LICENSE-2.0          
+ *          
+ * Unless required by applicable law or agreed to in writing, software          
+ * distributed under the License is distributed on an "AS IS" BASIS,            
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.         
+ * See the License for the specific language governing permissions and          
+ * limitations under the License.           
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import net.sf.beanlib.hibernate.HibernateBeanReplicator;
+import net.sf.beanlib.hibernate3.Hibernate3BeanTransformer;
+import net.sf.beanlib.hibernate3.Hibernate3CollectionReplicator;
+import net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator;
+import net.sf.beanlib.spi.BeanTransformerSpi;
+import net.sf.beanlib.spi.replicator.BeanReplicatorSpi;
+import net.sf.beanlib.spi.replicator.CollectionReplicatorSpi;
+import net.sf.beanlib.spi.replicator.CollectionReplicatorSpi.Factory;
+
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.hibernate.Hibernate;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.proxy.HibernateProxy;
+
+import ch.systemsx.cisd.common.collections.UnmodifiableCollectionDecorator;
+import ch.systemsx.cisd.common.exceptions.NotImplementedException;
+
+/**
+ * A {@link MethodInterceptor} implementation to get rid of <i>Hibernate</i> proxy classes like
+ * {@link PersistentCollection} or {@link HibernateProxy}.
+ * <p>
+ * Note that this interceptor should only be used on the service layer (when the object is
+ * <i>detached</i> and when database transactions are closed). Otherwise they might trigger
+ * <i>SQL</i> calls.
+ * </p>
+ * 
+ * @author Christian Ribeaud
+ */
+public final class HibernateTransformer implements MethodInterceptor
+{
+
+    public final static ThreadLocal<HibernateBeanReplicator> HIBERNATE_BEAN_REPLICATOR =
+            new ThreadLocal<HibernateBeanReplicator>()
+                {
+
+                    private final HibernateBeanReplicator createHibernateBeanReplicator()
+                    {
+                        final Hibernate3BeanTransformer beanTransformer =
+                                Hibernate3BeanTransformer.newBeanTransformer();
+                        beanTransformer
+                                .initCollectionReplicatable(new CollectionReplicatorSpiFactory());
+                        beanTransformer.initBeanReplicatable(new BeanReplicatorSpiFactory());
+                        return new HibernateBeanReplicator(beanTransformer);
+                    }
+
+                    //          
+                    // ThreadLocal
+                    //          
+
+                    @Override
+                    protected final HibernateBeanReplicator initialValue()
+                    {
+                        return createHibernateBeanReplicator();
+                    }
+                };
+
+    //          
+    // MethodInterceptor
+    //          
+
+    public final Object invoke(final MethodInvocation methodInvocation) throws Throwable
+    {
+        final Object proceed = methodInvocation.proceed();
+        if (proceed != null)
+        {
+            return HIBERNATE_BEAN_REPLICATOR.get().copy(proceed);
+        }
+        return null;
+    }
+
+    //          
+    // Helper classes
+    //          
+
+    private static final class BeanReplicatorSpiFactory implements BeanReplicatorSpi.Factory
+    {
+
+        //          
+        // Factory
+        //          
+
+        public final BeanReplicatorSpi newBeanReplicatable(final BeanTransformerSpi beanTransformer)
+        {
+            return new NoInitializationHibernate3JavaBeanReplicator(beanTransformer);
+        }
+    }
+
+    private static final class CollectionReplicatorSpiFactory implements Factory
+    {
+
+        //          
+        // Factory
+        //          
+
+        public final CollectionReplicatorSpi newCollectionReplicatable(
+                final BeanTransformerSpi beanTransformerSpi)
+        {
+            return new NoInitializationHibernate3CollectionReplicator(beanTransformerSpi);
+        }
+    }
+
+    private static final class NoInitializationHibernate3CollectionReplicator extends
+            Hibernate3CollectionReplicator
+    {
+
+        NoInitializationHibernate3CollectionReplicator(final BeanTransformerSpi beanTransformer)
+        {
+            super(beanTransformer);
+        }
+
+        //          
+        // Hibernate3CollectionReplicator
+        //          
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public final <V, T> T replicateCollection(final Collection<V> from, final Class<T> toClass)
+        {
+            final boolean unmodifiable = (from instanceof UnmodifiableCollectionDecorator);
+            final Collection<V> realFrom =
+                    (unmodifiable) ? ((UnmodifiableCollectionDecorator<V>) from).getDecorated()
+                            : from;
+            if (Hibernate.isInitialized(realFrom) == false)
+            {
+                if (realFrom instanceof Set)
+                {
+                    return (T) new HashSet(0);
+                } else if (realFrom instanceof List)
+                {
+                    return (T) new ArrayList(0);
+                } else
+                {
+                    throw new NotImplementedException();
+                }
+            }
+            return super.replicateCollection(realFrom, toClass);
+        }
+    }
+
+    private static final class NoInitializationHibernate3JavaBeanReplicator extends
+            Hibernate3JavaBeanReplicator
+    {
+
+        NoInitializationHibernate3JavaBeanReplicator(final BeanTransformerSpi beanTransformer)
+        {
+            super(beanTransformer);
+        }
+
+        //          
+        // Hibernate3JavaBeanReplicator
+        //          
+
+        @Override
+        public final <V, T> T replicateBean(final V from, final Class<T> toClass)
+        {
+            if (Hibernate.isInitialized(from) == false)
+            {
+                return null;
+            }
+            return super.replicateBean(from, toClass);
+        }
+    }
+}
-- 
GitLab