package org.flexo.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.io.IOUtils; import org.flexo.model.AbstractNode; import org.flexo.model.FlexoProcess; import org.flexo.model.MyNode; import org.jdom2.JDOMException; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openflexo.model.AbstractPAMELATest; import org.openflexo.model.exceptions.InvalidDataException; import org.openflexo.model.exceptions.ModelDefinitionException; import org.openflexo.model.exceptions.RestrictiveDeserializationException; import org.openflexo.model.exceptions.RestrictiveSerializationException; import org.openflexo.model.factory.DeserializationPolicy; import org.openflexo.model.factory.ModelFactory; import org.openflexo.model.factory.SerializationPolicy; public class SerializationTests extends AbstractPAMELATest { private static final String NODE_NAME = "aNode"; private static final String PROPERTY_VALUE = "aValue"; private File file; private ModelFactory factory; private ModelFactory factory2; @Override @Before public void setUp() throws IOException, ModelDefinitionException { clearModelEntityLibrary(); file = File.createTempFile("PAMELA-TestSerialization", ".xml"); factory2 = new ModelFactory(MyNode.class); factory = new ModelFactory(FlexoProcess.class); } @Override public void tearDown() { file.delete(); } @Test public void testSerializationPolicy() throws IOException, ModelDefinitionException, JDOMException, InvalidDataException { Assert.assertNull(factory.getModelContext().getModelEntity(MyNode.class)); Assert.assertNotNull(factory2.getModelContext().getModelEntity(MyNode.class)); validateBasicModelContext(factory.getModelContext()); validateBasicModelContext(factory2.getModelContext()); FlexoProcess process = (FlexoProcess) factory.newInstance(FlexoProcess.class).init(); MyNode node = (MyNode) factory2.newInstance(MyNode.class).init(NODE_NAME); node.setMyProperty(PROPERTY_VALUE); process.addToNodes(node); FileOutputStream fos = null; try { fos = new FileOutputStream(file); factory.serialize(process, fos, SerializationPolicy.RESTRICTIVE); Assert.fail("Restrictive serialization should not allow the serialization of a " + MyNode.class.getName()); } catch (RestrictiveSerializationException e) { // Yes this is what we wanted } finally { IOUtils.closeQuietly(fos); } try { fos = new FileOutputStream(file); factory.serialize(process, fos, SerializationPolicy.EXTENSIVE); } catch (RestrictiveSerializationException e) { Assert.fail("Extensive serialization should allow the serialization of a " + MyNode.class.getName()); } finally { IOUtils.closeQuietly(fos); } // Just to make sure process = null; factory = new ModelFactory(FlexoProcess.class); FileInputStream fis = null; try { fis = new FileInputStream(file); process = (FlexoProcess) factory.deserialize(fis, DeserializationPolicy.RESTRICTIVE); Assert.fail("Restrictive deserialization should not allow the deserialization of a " + MyNode.class.getName()); } catch (RestrictiveDeserializationException e) { // Yes this is what we wanted } finally { IOUtils.closeQuietly(fis); } try { fis = new FileInputStream(file); process = (FlexoProcess) factory.deserialize(fis, DeserializationPolicy.EXTENSIVE); } catch (RestrictiveDeserializationException e) { Assert.fail("Extensive deserialization should allow the deserialization of a " + MyNode.class.getName()); } finally { IOUtils.closeQuietly(fis); } Assert.assertEquals(1, process.getNodes().size()); AbstractNode aNode = process.getNodeNamed(NODE_NAME); Assert.assertTrue(aNode instanceof MyNode); Assert.assertEquals(PROPERTY_VALUE, ((MyNode) aNode).getMyProperty()); // The next block is necessary to ensure that serialization remains consistent when using EXTENSIVE policy (ie, class names and // stuffs remain serialized) try { fos = new FileOutputStream(file); factory.serialize(process, fos, SerializationPolicy.EXTENSIVE); } catch (RestrictiveSerializationException e) { Assert.fail("Extensive serialization should allow the serialization of a " + MyNode.class.getName()); } finally { IOUtils.closeQuietly(fos); } factory = new ModelFactory(FlexoProcess.class); try { fis = new FileInputStream(file); process = (FlexoProcess) factory.deserialize(fis, DeserializationPolicy.EXTENSIVE); } catch (RestrictiveDeserializationException e) { Assert.fail("Extensive deserialization should allow the deserialization of a " + MyNode.class.getName()); } finally { IOUtils.closeQuietly(fis); } Assert.assertEquals(1, process.getNodes().size()); aNode = process.getNodeNamed(NODE_NAME); Assert.assertTrue(aNode instanceof MyNode); Assert.assertEquals(PROPERTY_VALUE, ((MyNode) aNode).getMyProperty()); } }