Package org.milyn.edi.test

Source Code of org.milyn.edi.test.InterchangeTestUtil

/*
* 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();
        }
    }
}
TOP

Related Classes of org.milyn.edi.test.InterchangeTestUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.