Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

The primary goals of this example are to introduce you to the following:

  1. Transforming from an edi file to xml.
  2. The Smooks configuration file.
  3. Executing the Smooks Transformation.

 
SVN - Download - Other Tutorials

Other Relevant Info:

 
To Build: "mvn clean install"
To Run: "mvn exec:java"


work in progress...

Transforming from an edi file to xml

This example illustrates how to hook the EdiSax (http://milyn.codehaus.org/EdiSax) EDI parser into a Smooks based transform (filter operation).  It's another example of how non-XML streams can be processed by Smooks (see the "csv-to-xml" example).

In this example, we simply configure in the EdiSax parser to process the EDI stream into XML.  We don't perform any other transforms on the underlying data. For an example of how other transform operations can be built on top of this edi-to-xml transform, see the edi-to-java example.

So here's the source edi file that is to be transformed:

HDR*1*0*59.97*64.92*4.95*Wed Nov 15 13:45:28 EST 2006
CUS*user1*Harry^Fletcher*SD
ORD*1*1*364*The 40-Year-Old Virgin*29.98
ORD*2*1*299*Pulp Fiction*29.99

And this is the expected result of our transformation:

<Order>
        <header>
                <order-id>1</order-id>
                <status-code>0</status-code>
                <net-amount>59.97</net-amount>
                <total-amount>64.92</total-amount>
                <tax>4.95</tax>
                <date>Wed Nov 15 13:45:28 EST 2006</date>
        </header>
        <customer-details>
                <username>user1</username>
                <name>
                        <firstname>Harry</firstname>
                        <lastname>Fletcher</lastname>
                </name>
                <state>SD</state>
        </customer-details>
        <order-item>
                <position>1</position>
                <quantity>1</quantity>
                <product-id>364</product-id>
                <title>The 40-Year-Old Virgin</title>
                <price>29.98</price>
        </order-item>
        <order-item>
                <position>2</position>
                <quantity>1</quantity>
                <product-id>299</product-id>
                <title>Pulp Fiction</title>
                <price>29.99</price>
        </order-item>
</Order>



The Smooks Configuration

In order to apply this transformer to a message fragment, a Smooks Configurationneeds to be created. This configuration will target the transformer at a particular message fragment. For more information on configuring XSLT resources, see XslContentDeliveryUnitCreator.

Here's the configuration ("smooks-config.xml"):

<?xml version="1.0"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd">

	<!-- Configure the EDI Parser to parse the message stream into a stream of SAX events. -->
	<resource-config selector="org.xml.sax.driver">
		<resource>org.milyn.smooks.edi.SmooksEDIParser</resource>
		<param name="mapping-model">/example/edi-to-xml-order-mapping.xml</param>
	</resource-config>

</smooks-resource-list>

Here's the edi mapping ("/src/main/java/example/edi-to-xml-order-mapping.xml"):

<?xml version="1.0" encoding="UTF-8"?>
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.0.xsd">

	<medi:description name="DVD Order" version="1.0" />

	<medi:delimiters segment="&#10;" field="*" component="^" sub-component="~" />

	<medi:segments xmltag="Order">

		<medi:segment segcode="HDR" xmltag="header">
			<medi:field xmltag="order-id" />
			<medi:field xmltag="status-code" />
			<medi:field xmltag="net-amount" />
			<medi:field xmltag="total-amount" />
			<medi:field xmltag="tax" />
			<medi:field xmltag="date" />
		</medi:segment>

		<medi:segment segcode="CUS" xmltag="customer-details">
			<medi:field xmltag="username" />
			<medi:field xmltag="name">
				<medi:component xmltag="firstname" />
				<medi:component xmltag="lastname" />
			</medi:field>
			<medi:field xmltag="state" />
		</medi:segment>

		<medi:segment segcode="ORD" xmltag="order-item" maxOccurs="-1">
			<medi:field xmltag="position" />
			<medi:field xmltag="quantity" />
			<medi:field xmltag="product-id" />
			<medi:field xmltag="title" />
			<medi:field xmltag="price" />
		</medi:segment>

	</medi:segments>

</medi:edimap>

Description of the mapping:



Executing The Transformation

Again, it's exactly the same as with the java-basic tutorial:

// Instantiate Smooks with the config...
Smooks smooks = new Smooks("smooks-config.xml");
// Create an exec context - no profiles....
StandaloneExecutionContext executionContext = smooks.createExecutionContext();

// Filter the input message to the outputWriter, using the execution context...
DOMResult domResult = new DOMResult();
smooks.filter(new StreamSource(new ByteArrayInputStream(messageIn)), domResult, executionContext);

Of course, you'd typically cache the Smooks instance.

See the example/Main.java in the example source.

  • No labels