/* * Milyn - Copyright (C) 2006 - 2010 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License (version 2.1) as published by the Free Software * Foundation. * * This library 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: * http://www.gnu.org/licenses/lgpl.txt */ package org.milyn.edi.test; import org.milyn.edisax.model.internal.Delimiters; import org.milyn.edisax.unedifact.UNEdifactInterchangeParser; import org.milyn.io.StreamUtils; import org.milyn.smooks.edi.unedifact.model.UNEdifactInterchange; import org.milyn.smooks.edi.unedifact.model.UNEdifactInterchangeFactory; import org.milyn.smooks.edi.unedifact.model.r41.UNB41; import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41; import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactMessage41; import org.milyn.smooks.edi.unedifact.model.r41.types.MessageIdentifier; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.util.List; /** * Interchange test utilities. * * @author <a href="mailto:tom.fennelly@gmail.com">tom.fennelly@gmail.com</a> */ public class InterchangeTestUtil { private static MessageBuilder defaultUNAMessageBuilder = new MessageBuilder("org.milyn", UNEdifactInterchangeParser.defaultUNEdifactDelimiters.getField(), UNEdifactInterchangeParser.defaultUNEdifactDelimiters); private static MessageBuilder commaDecimalSepUNAMessageBuilder = new MessageBuilder("org.milyn", UNEdifactInterchangeParser.defaultUNEdifactDelimiters.getField(), UNEdifactInterchangeParser.defaultUNEdifactDelimiters); static { Delimiters delimiters = ((Delimiters) UNEdifactInterchangeParser.defaultUNEdifactDelimiters.clone()).setDecimalSeparator(","); commaDecimalSepUNAMessageBuilder = new MessageBuilder("org.milyn", delimiters.getField(), delimiters); } public static void testJavaBinding(UNEdifactInterchangeFactory factory, String messageInFile, boolean dumpResult) throws IOException, SAXException { // Deserialize the a UN/EDIFACT interchange stream to Java... InputStream ediStream = InterchangeTestUtil.class.getResourceAsStream(messageInFile); if (ediStream == null) { throw new IOException("EDI input file '" + messageInFile + "' not on classpath."); } UNEdifactInterchange interchange = factory.fromUNEdifact(ediStream); // Serialize it back to EDI.... StringWriter writer = new StringWriter(); factory.toUNEdifact(interchange, writer); if (dumpResult) { System.out.println(writer.toString()); } // We expect the result to be the same as the input... String expected = StreamUtils.readStreamAsString(InterchangeTestUtil.class.getResourceAsStream(messageInFile)); assertEquals(expected, writer.toString()); } public static void test_Interchange(UNEdifactInterchangeFactory factory, boolean dump, Class<?>... messageTypes) throws IOException { UNEdifactInterchange41 interchange41 = buildInterchange(messageTypes); test_Interchange(factory, dump, interchange41); } public static void test_Interchange_Comma_Decimal(UNEdifactInterchangeFactory factory, boolean dump, Class<?>... messageTypes) throws IOException { UNEdifactInterchange41 interchange41 = buildInterchange(commaDecimalSepUNAMessageBuilder, messageTypes); test_Interchange(factory, dump, interchange41); } public static void test_Interchange(UNEdifactInterchangeFactory factory, boolean dump, UNEdifactInterchange41 interchange41) throws IOException { StringWriter writer = new StringWriter(); // serialize it... factory.toUNEdifact(interchange41, writer); String messageV1 = writer.toString(); // reconstruct from the serialized form... interchange41 = (UNEdifactInterchange41) factory.fromUNEdifact(new InputSource(new ByteArrayInputStream(messageV1.getBytes("UTF-8")))); // serialize again... writer.getBuffer().setLength(0); factory.toUNEdifact(interchange41, writer); String messageV2 = writer.toString(); assertEquals(messageV1, messageV2); if (dump) { System.out.println(messageV1); } } public static UNEdifactInterchange41 buildInterchange(Class<?>... messageTypes) { return buildInterchange(defaultUNAMessageBuilder, messageTypes); } public static UNEdifactInterchange41 buildInterchange(MessageBuilder builder, Class<?>... messageTypes) { return buildInterchange("D", "03B", messageTypes, builder); } public static UNEdifactInterchange41 buildInterchange(String versionNum, String releaseNum, Class<?>[] messageTypes, MessageBuilder messageBuilder) { UNEdifactInterchange41 interchange41 = messageBuilder.buildMessage(UNEdifactInterchange41.class); UNB41 unb = interchange41.getInterchangeHeader(); List<UNEdifactMessage41> messages = interchange41.getMessages(); interchange41.setInterchangeDelimiters(messageBuilder.getDelimiters()); unb.getSyntaxIdentifier().setId("UNOW"); // UNOW is UTF-8.... as encoded above unb.getSyntaxIdentifier().setCodedCharacterEncoding("UNOW"); // UNOW is UTF-8.... as encoded above messages.clear(); for (Class<?> messageType : messageTypes) { UNEdifactMessage41 message41 = messageBuilder.buildMessage(UNEdifactMessage41.class); Object messageInstance = messageBuilder.buildMessage(messageType); MessageIdentifier messageIdentifier = message41.getMessageHeader().getMessageIdentifier(); messageIdentifier.setControllingAgencyCode("UN"); messageIdentifier.setId(messageType.getSimpleName().toUpperCase()); messageIdentifier.setVersionNum(versionNum); messageIdentifier.setReleaseNum(releaseNum); message41.setMessage(messageInstance); messages.add(message41); } return interchange41; } private static void assertEquals(String expected, String actual) throws IOException { expected = StreamUtils.normalizeLines(expected, false); actual = StreamUtils.normalizeLines(actual, false); if (!expected.equals(actual)) { throw new IllegalStateException("Expected message \n" + expected + "\n not equal to actual message \n" + actual); } } public static void test_loads(UNEdifactInterchangeFactory factory, boolean dump, String ejcClassListFile, int numMessages) throws IOException, ClassNotFoundException { InputStream stream = InterchangeTestUtil.class.getResourceAsStream(ejcClassListFile); if (stream == null) { throw new IllegalStateException("Unable to load EJC list file '" + ejcClassListFile + "' from classpath."); } try { BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); String ejcClassName = reader.readLine(); int i = 1; long start = System.currentTimeMillis(); while (ejcClassName != null) { //System.out.println(i + ": " + ejcClassName); test_Interchange(factory, dump, Class.forName(ejcClassName)); ejcClassName = reader.readLine(); if (i == numMessages) { break; } i++; } System.out.println("Took: " + (System.currentTimeMillis() - start)); } finally { stream.close(); } } }