+package org.argeo.slc.core.process;\r
+\r
+import java.io.IOException;\r
+import java.io.StringReader;\r
+import java.io.StringWriter;\r
+import java.text.SimpleDateFormat;\r
+import java.util.UUID;\r
+\r
+import javax.xml.transform.stream.StreamResult;\r
+import javax.xml.transform.stream.StreamSource;\r
+\r
+import org.apache.commons.io.IOUtils;\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+import org.argeo.slc.msg.process.SlcExecutionRequest;\r
+import org.argeo.slc.msg.process.SlcExecutionStepsRequest;\r
+import org.argeo.slc.unit.AbstractSpringTestCase;\r
+import org.springframework.oxm.Marshaller;\r
+import org.springframework.oxm.Unmarshaller;\r
+\r
+public class SlcExecutionCastorTest extends AbstractSpringTestCase {\r
+ private Log log = LogFactory.getLog(getClass());\r
+\r
+ public void testMarshalling() throws Exception {\r
+ Marshaller marshaller = getBean("marshaller");\r
+ Unmarshaller unmarshaller = getBean("marshaller");\r
+\r
+ SlcExecution slcExec = createSimpleSlcExecution();\r
+\r
+ SlcExecutionRequest msgSave = new SlcExecutionRequest();\r
+ msgSave.setSlcExecution(slcExec);\r
+\r
+ String msgSaveXml = marshallAndLog(marshaller, msgSave);\r
+\r
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");\r
+ SlcExecutionStep step0 = new SlcExecutionStep();\r
+ step0.setBegin(sdf.parse("2008-04-17 18:21"));\r
+ step0.setType("LOG");\r
+ step0.addLog("A log message\nand another line");\r
+\r
+ SlcExecutionStep step1 = new SlcExecutionStep();\r
+ step1.setBegin(sdf.parse("2008-04-17 18:25"));\r
+ step1.setType("LOG");\r
+ step1.addLog("A nother log message");\r
+\r
+ SlcExecutionStepsRequest msgNotif = new SlcExecutionStepsRequest();\r
+ msgNotif.addStep(step0);\r
+ msgNotif.addStep(step1);\r
+ msgNotif.setSlcExecutionUuid(slcExec.getUuid());\r
+\r
+ String msgNotifXml = marshallAndLog(marshaller, msgNotif);\r
+\r
+ SlcExecutionRequest msgSaveUnm = unmarshall(unmarshaller, msgSaveXml);\r
+ assertNotNull(msgSaveUnm);\r
+ assertSlcExecution(slcExec, msgSaveUnm.getSlcExecution());\r
+\r
+ SlcExecutionStepsRequest msgNotifUnm = unmarshall(unmarshaller,\r
+ msgNotifXml);\r
+ assertNotNull(msgNotifUnm);\r
+ assertEquals(slcExec.getUuid(), msgNotifUnm.getSlcExecutionUuid());\r
+ assertEquals(2, msgNotifUnm.getSteps().size());\r
+ assertSlcExecutionStep(step0, msgNotifUnm.getSteps().get(0));\r
+ assertSlcExecutionStep(step1, msgNotifUnm.getSteps().get(1));\r
+\r
+ SlcExecution slcExecUnm = msgSaveUnm.getSlcExecution();\r
+ slcExecUnm.getSteps().addAll(msgNotifUnm.getSteps());\r
+\r
+ SlcExecutionRequest msgUpdate = new SlcExecutionRequest();\r
+ msgUpdate.setSlcExecution(slcExecUnm);\r
+ String msgUpdateXml = marshallAndLog(marshaller, msgUpdate);\r
+ }\r
+\r
+ private String marshallAndLog(Marshaller marshaller, Object obj)\r
+ throws IOException {\r
+ StringWriter writer = new StringWriter();\r
+ marshaller.marshal(obj, new StreamResult(writer));\r
+ String xml = writer.toString();\r
+ log.info(xml);\r
+ IOUtils.closeQuietly(writer);\r
+ return xml;\r
+ }\r
+\r
+ private <T> T unmarshall(Unmarshaller unmarshaller, String xml)\r
+ throws IOException {\r
+ StringReader reader = new StringReader(xml);\r
+ Object obj = unmarshaller.unmarshal(new StreamSource(reader));\r
+ IOUtils.closeQuietly(reader);\r
+ return (T) obj;\r
+ }\r
+\r
+ private void assertSlcExecution(SlcExecution expected, SlcExecution reached) {\r
+ assertNotNull(reached);\r
+ assertEquals(expected.getHost(), reached.getHost());\r
+ assertEquals(expected.getPath(), reached.getPath());\r
+ assertEquals(expected.getType(), reached.getType());\r
+ assertEquals(expected.getStatus(), reached.getStatus());\r
+ }\r
+\r
+ private void assertSlcExecutionStep(SlcExecutionStep expected,\r
+ SlcExecutionStep reached) {\r
+ assertNotNull(reached);\r
+ assertEquals(expected.getType(), reached.getType());\r
+ assertEquals(expected.logAsString(), reached.logAsString());\r
+ assertEquals(expected.getBegin(), reached.getBegin());\r
+ }\r
+\r
+ public static SlcExecution createSimpleSlcExecution() {\r
+ SlcExecution slcExec = new SlcExecution();\r
+ slcExec.setUuid(UUID.randomUUID().toString());\r
+ slcExec.setHost("localhost");\r
+ slcExec.setPath("/test");\r
+ slcExec.setType("slcAnt");\r
+ slcExec.setStatus("STARTED");\r
+ return slcExec;\r
+ }\r
+}\r