Search code examples
javaedismooks

Smooks: Outputting EDI from Java


Inspired by the proposed solution in Smooks EDI writer, I have the following Java code:

// Creates minimal EDI message with one field populated
EdifactV3D98AMEDPID edi = new EdifactV3D98AMEDPID();
UNBInterchangeHeader header = new UNBInterchangeHeader();
UNBInterchangeHeader.S002SenderIdentification s002SenderIdentification = new UNBInterchangeHeader.S002SenderIdentification();
s002SenderIdentification.setE0004SenderIdentification("TEST");
header.setS002SenderIdentification(s002SenderIdentification);
edi.setUNBInterchangeHeader(header);

Smooks smooks = new Smooks("edi-output-smooks-config.xml");

// Sets up access to exports specified in Smooks config
ExecutionContext executionContext = smooks.createExecutionContext();
Exports exports = Exports.getExports(smooks.getApplicationContext());
Result[] results = exports.createResults();

smooks.filterSource(executionContext, new JavaSource(edi), results);

List<Object> objects = Exports.extractResults(results, exports);
JavaResult.ResultMap map = (JavaResult.ResultMap) objects.get(0);

D98AInterchangeFactory factory = D98AInterchangeFactory.getInstance();
UNEdifactInterchange41 unEdifactInterchange = (UNEdifactInterchange41) map.get("unEdifactInterchange");

// Should output EDI message as String, but StringWriter is empty
StringWriter ediOutStream = new StringWriter();
factory.toUNEdifact(unEdifactInterchange, ediOutStream);

... with the following Smooks config:

<?xml version="1.0" encoding="UTF-8"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
                  xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.4.xsd">

    <!-- Imports D98A Edifact binding found in Maven dependency -->
    <import file="/org/milyn/edi/unedifact/d98a/message-bindingconfig.xml" />
    <import file="/org/milyn/smooks/edi/unedifact/model/r41/bindings/unedifact-interchange.xml" />

    <!-- Configures Result object for accessing EDI output -->
    <core:exports>
        <core:result type="org.milyn.payload.JavaResult"/>
    </core:exports>

</smooks-resource-list>

The StringWriter returns an empty String, whereas I had hoped/expected the Java object as an EDI String.

Any suggestions or pointers?


Solution

  • I don't find the classes EdifactV3D98AMEDPID, UNBInterchangeHeade. But i made a similar test:

    UNEdifactInterchange41 edi = new UNEdifactInterchange41();
    UNB41 header = new UNB41();
    header.setSender(null);
    Party sender = new Party();
    sender.setInternalId("TEST");
    header.setSender(sender);
    edi.setInterchangeHeader(header);
    
    Smooks smooks = new Smooks("edi-output-smooks-config.xml");
    
    ExecutionContext executionContext = smooks.createExecutionContext();
    Exports exports = Exports.getExports(smooks.getApplicationContext());
    Result[] results = exports.createResults();
    
    smooks.filterSource(executionContext, new JavaSource(edi), results);
    
    List<Object> objects = Exports.extractResults(results, exports);
    JavaResult.ResultMap map = (JavaResult.ResultMap) objects.get(0);
    
    D98AInterchangeFactory factory = D98AInterchangeFactory.getInstance();
    UNEdifactInterchange41 u = (UNEdifactInterchange41) map.get("unEdifactInterchange");
    
    // Should output EDI message as String, but StringWriter is empty
    StringWriter ediOutStream1 = new StringWriter();
    factory.toUNEdifact(u, ediOutStream1);
    

    I had the same result, an empty string in the end.

    But i think the problem is your use of smooks. I only used smooks with Apache Camel, so i don't know if that is the correct way to make a transformation in smooks, but i think that in this case you dont have to call smook, your input is an object EDI and you want to print you object in EDI Format.

    The only thing you have to do is:

    UNEdifactInterchange41 edi = new UNEdifactInterchange41();
    UNB41 header = new UNB41();
    header.setSender(null);
    Party sender = new Party();
    sender.setInternalId("TEST");
    header.setSender(sender);
    edi.setInterchangeHeader(header);
    
    D98AInterchangeFactory factory = D98AInterchangeFactory.getInstance();
    
    StringWriter ediOutStream1 = new StringWriter();
    factory.toUNEdifact(edi, ediOutStream1);
    

    I already tested, and you get this:

    UNB++::TEST'
    

    I hope that this could help you