/** * GRANITE DATA SERVICES * Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.test.externalizers; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.HashMap; import java.util.HashSet; import java.util.Properties; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import org.granite.config.AMF3Config; import org.granite.config.ConvertersConfig; import org.granite.config.GraniteConfig; import org.granite.config.flex.ServicesConfig; import org.granite.context.GraniteContext; import org.granite.context.SimpleGraniteContext; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public abstract class AbstractTestJPAExternalizer { protected GraniteConfig graniteConfig; protected ServicesConfig servicesConfig; protected EntityManagerFactory entityManagerFactory; @Before public void before() throws Exception { Properties props = new Properties(); props.put("javax.persistence.jdbc.driver", "org.h2.Driver"); props.put("javax.persistence.jdbc.url", "jdbc:h2:mem:testdb"); props.put("javax.persistence.jdbc.user", "sa"); props.put("javax.persistence.jdbc.password", ""); String provider = setProperties(props); entityManagerFactory = Persistence.createEntityManagerFactory(provider + "-pu", props); InputStream is = getClass().getClassLoader().getResourceAsStream("WEB-INF/granite/granite-config-" + provider + ".xml"); graniteConfig = new GraniteConfig(null, is, null, null); servicesConfig = new ServicesConfig(null, null, false); } protected abstract String setProperties(Properties props); @Test public void testSerializationLazy() throws Exception { EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction et = entityManager.getTransaction(); et.begin(); Entity5 e5 = new Entity5(); e5.setName("Test"); e5.setEntities(new HashSet<Entity6>()); Entity6 e6 = new Entity6(); e6.setName("Test"); e5.getEntities().add(e6); e6.setEntity5(e5); entityManager.persist(e5); entityManager.flush(); et.commit(); entityManager.close(); entityManager = entityManagerFactory.createEntityManager(); et = entityManager.getTransaction(); et.begin(); e5 = entityManager.find(Entity5.class, e5.getId()); entityManager.flush(); et.commit(); entityManager.close(); GraniteContext gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ByteArrayOutputStream baos = new ByteArrayOutputStream(20000); ObjectOutput out = ((AMF3Config)gc.getGraniteConfig()).newAMF3Serializer(baos); out.writeObject(e5); out.close(); GraniteContext.release(); InputStream is = new ByteArrayInputStream(baos.toByteArray()); gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ObjectInput in = ((AMF3Config)gc.getGraniteConfig()).newAMF3Deserializer(is); Object obj = in.readObject(); in.close(); GraniteContext.release(); Assert.assertTrue("Entity5", obj instanceof Entity5); } @Test public void testSerializationLazyEmbeddedGDS838() throws Exception { EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction et = entityManager.getTransaction(); et.begin(); Entity2 e2 = new Entity2(); e2.setName("Test"); Entity3 e3 = new Entity3(); e3.setEname("Tutu"); e3.setEntities(new HashSet<Entity4>()); e2.setEntity(e3); Entity4 e4 = new Entity4(); e4.setName("Test"); e3.getEntities().add(e4); e4.setEntity2(e2); entityManager.persist(e2); entityManager.flush(); et.commit(); entityManager.close(); entityManager = entityManagerFactory.createEntityManager(); et = entityManager.getTransaction(); et.begin(); e2 = entityManager.find(Entity2.class, e2.getId()); entityManager.flush(); et.commit(); entityManager.close(); GraniteContext gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ByteArrayOutputStream baos = new ByteArrayOutputStream(20000); ObjectOutput out = ((AMF3Config)gc.getGraniteConfig()).newAMF3Serializer(baos); out.writeObject(e2); out.close(); GraniteContext.release(); InputStream is = new ByteArrayInputStream(baos.toByteArray()); gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ObjectInput in = ((AMF3Config)gc.getGraniteConfig()).newAMF3Deserializer(is); Object obj = in.readObject(); in.close(); GraniteContext.release(); Assert.assertTrue("Entity2", obj instanceof Entity2); if (((ConvertersConfig)gc.getGraniteConfig()).getClassGetter().getClass().getName().indexOf("hibernate") >= 0) Assert.assertFalse("Entity 2 entities not loaded", ((ConvertersConfig)gc.getGraniteConfig()).getClassGetter().isInitialized(((Entity2)obj).getEntity(), "entities", ((Entity2)obj).getEntity().getEntities())); } @Test public void testSerializationEmbeddedDoubleAssociation() throws Exception { EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction et = entityManager.getTransaction(); et.begin(); EntityA a = new EntityA(); a.setUid(1L); a.setEntities(new HashSet<EntityB>()); EmbeddedEntity e = new EmbeddedEntity(); e.setEntities(new HashSet<EntityB>()); a.setEmbedded(e); EntityB b = new EntityB(); b.setEntity(a); b.setName("Bla"); b.setUid(2L); a.getEntities().add(b); e.getEntities().add(b); entityManager.persist(a); entityManager.flush(); et.commit(); entityManager.close(); entityManager = entityManagerFactory.createEntityManager(); et = entityManager.getTransaction(); et.begin(); a = entityManager.find(EntityA.class, a.getId()); entityManager.flush(); et.commit(); entityManager.close(); GraniteContext gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ByteArrayOutputStream baos = new ByteArrayOutputStream(20000); ObjectOutput out = ((AMF3Config)gc.getGraniteConfig()).newAMF3Serializer(baos); out.writeObject(a); out.close(); GraniteContext.release(); InputStream is = new ByteArrayInputStream(baos.toByteArray()); gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ObjectInput in = ((AMF3Config)gc.getGraniteConfig()).newAMF3Deserializer(is); Object obj = in.readObject(); in.close(); GraniteContext.release(); Assert.assertTrue("EntityA", obj instanceof EntityA); } @Test public void testSerializationUnmanagedEntity() throws Exception { Entity6 e6 = new Entity6(); e6.setName("Test"); GraniteContext gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ByteArrayOutputStream baos = new ByteArrayOutputStream(20000); ObjectOutput out = ((AMF3Config)gc.getGraniteConfig()).newAMF3Serializer(baos); out.writeObject(e6); out.close(); GraniteContext.release(); InputStream is = new ByteArrayInputStream(baos.toByteArray()); gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ObjectInput in = ((AMF3Config)gc.getGraniteConfig()).newAMF3Deserializer(is); Object obj = in.readObject(); in.close(); GraniteContext.release(); Assert.assertTrue("Entity6", obj instanceof Entity6); } @Test public void testSerializationProxy() throws Exception { EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction et = entityManager.getTransaction(); et.begin(); Entity8 e8 = new Entity8(); e8.setName("Test"); Entity7 e7 = new Entity7(); e7.setName("Test"); e7.setEntity8(e8); entityManager.persist(e7); entityManager.flush(); et.commit(); entityManager.close(); entityManager = entityManagerFactory.createEntityManager(); et = entityManager.getTransaction(); et.begin(); e7 = entityManager.find(Entity7.class, e7.getId()); entityManager.flush(); et.commit(); entityManager.close(); GraniteContext gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ByteArrayOutputStream baos = new ByteArrayOutputStream(20000); ObjectOutput out = ((AMF3Config)gc.getGraniteConfig()).newAMF3Serializer(baos); out.writeObject(e7); out.close(); GraniteContext.release(); InputStream is = new ByteArrayInputStream(baos.toByteArray()); gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ObjectInput in = ((AMF3Config)gc.getGraniteConfig()).newAMF3Deserializer(is); Object obj = in.readObject(); in.close(); GraniteContext.release(); Assert.assertTrue("Entity7", obj instanceof Entity7); Assert.assertFalse("Entity8 not loaded", ((ConvertersConfig)gc.getGraniteConfig()).getClassGetter().isInitialized(obj, "entity8", ((Entity7)obj).getEntity8())); } @Test public void testSerializationProxy2() throws Exception { GraniteContext gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction et = entityManager.getTransaction(); et.begin(); Entity8 e8 = new Entity8(); e8.setName("Test"); Entity7 e7 = new Entity7(); e7.setName("Test"); e7.setEntity8(e8); entityManager.persist(e7); entityManager.flush(); et.commit(); entityManager.close(); entityManager = entityManagerFactory.createEntityManager(); et = entityManager.getTransaction(); et.begin(); e7 = entityManager.find(Entity7.class, e7.getId()); ((ConvertersConfig)gc.getGraniteConfig()).getClassGetter().initialize(e7, "entity8", e7.getEntity8()); entityManager.flush(); et.commit(); entityManager.close(); ByteArrayOutputStream baos = new ByteArrayOutputStream(20000); ObjectOutput out = ((AMF3Config)gc.getGraniteConfig()).newAMF3Serializer(baos); out.writeObject(e7); out.close(); GraniteContext.release(); InputStream is = new ByteArrayInputStream(baos.toByteArray()); gc = SimpleGraniteContext.createThreadInstance(graniteConfig, servicesConfig, new HashMap<String, Object>()); ObjectInput in = ((AMF3Config)gc.getGraniteConfig()).newAMF3Deserializer(is); Object obj = in.readObject(); in.close(); GraniteContext.release(); Assert.assertTrue("Entity7", obj instanceof Entity7); Assert.assertTrue("Entity8 loaded", ((ConvertersConfig)gc.getGraniteConfig()).getClassGetter().isInitialized(obj, "entity8", ((Entity7)obj).getEntity8())); } }