Skip to content

Instantly share code, notes, and snippets.

@cjmamo
Last active March 24, 2021 08:43
Show Gist options
  • Save cjmamo/a65e33b1ee62984cb507b77baea75100 to your computer and use it in GitHub Desktop.
Save cjmamo/a65e33b1ee62984cb507b77baea75100 to your computer and use it in GitHub Desktop.
<SegGrp-25>
<LIN>
<E1082>${record.item[0]}</E1082>
<E1229></E1229>
<C212>
<E7140>${record.item[1]}</E7140>
<E7143>SRS</E7143>
</C212>
</LIN>
<QTY>
<C186>
<E6063>21</E6063>
<E6060>${record.item[2]}</E6060>
<E6411>${record.item[4]}</E6411>
</C186>
</QTY>
<SegGrp-28>
<PRI>
<C509>
<E5125>AAA</E5125>
<E5118>${record.item[3]}</E5118>
</C509>
</PRI>
</SegGrp-28>
</SegGrp-25>
...
...
public class CrmVisitor implements AfterVisitor {
private static final Logger LOGGER = LoggerFactory.getLogger(CrmVisitor.class);
private AsyncHttpClient asyncHttpClient;
@PostConstruct
public void postConstruct() {
this.asyncHttpClient = asyncHttpClient();
}
@Override
public void visitAfter(Element element, ExecutionContext executionContext) {
Request request = post("https://crm.example/api/orders").setHeader("Content-Type", "application/xml").setBody(XmlUtil.serialize(element)).build();
asyncHttpClient.executeRequest(request, new AsyncCompletionHandler<Response>() {
@Override
public Response onCompleted(Response response) {
if (response.getStatusCode() != 200) {
LOGGER.error("Error => " + response.getResponseBody(StandardCharsets.UTF_8));
}
return response;
}
});
}
...
}
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/" xmlns:ex="http://example.com"
targetNamespace="http://example.com" elementFormDefault="unqualified">
<xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd" />
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/">
<dfdl:defineVariable name="Delimiter" type="xs:string" external="true" defaultValue=","/>
<dfdl:format ref="ex:GeneralFormatPortable" separator="" initiator=""
terminator="" textTrimKind="none" initiatedContent="no" ignoreCase="no"
separatorPosition="infix" occursCountKind="implicit"
emptyValueDelimiterPolicy="both" representation="text" textNumberRep="standard"
lengthKind="delimited" encoding="ASCII" encodingErrorPolicy="replace" />
</xs:appinfo>
</xs:annotation>
<xs:element name="file">
<xs:complexType>
<xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
<xs:element name="header" minOccurs="0" maxOccurs="1"
dfdl:occursCountKind="implicit">
<xs:complexType>
<xs:sequence dfdl:separator="{$ex:Delimiter}">
<xs:element name="title" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="record" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence dfdl:separator="{$ex:Delimiter}">
<xs:element name="item" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<ex:file xmlns:ex="http://example.com">
<header>
<title>LINE_NUMBER</title>
<title>UPC_NUMBER</title>
<title>QUANTITY</title>
<title>PRICE</title>
<title>UOM</title>
<title>PO_NUMBER</title>
<title>PO_DATE</title>
<title>CUSTOMER_NAME</title>
<title>CUSTOMER_NUMBER</title>
<title>ADDRESS</title>
<title>CITY</title>
<title>STATE</title>
<title>POSTAL_CODE</title>
</header>
<record>
<item>1</item>
<item>4000862141404</item>
<item>48</item>
<item>5</item>
<item>PCE</item>
<item>128576</item>
<item>20020830</item>
<item>KION GROUP AG</item>
<item>123456</item>
<item>Abraham-Lincoln-Str</item>
<item>Wiesbaden</item>
<item>65189</item>
</record>
...
</ex:file>
<D96A:Interchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:D96A="http://www.ibm.com/dfdl/edi/un/edifact/D96A"
xmlns:srv="http://www.ibm.com/dfdl/edi/un/service/4.1">
<UNB>
<S001>
<E0001>UNOB</E0001>
<E0002>1</E0002>
</S001>
<S002>
<E0004>SENDER1</E0004>
<E0007>14</E0007>
<E0008>ZZUK</E0008>
</S002>
<S003>
<E0010>RECEIVER1</E0010>
<E0007>1</E0007>
<E0014>ZZUK</E0014>
</S003>
<S004>
<E0017>071101</E0017>
<E0019>1701</E0019>
</S004>
<E0020>131</E0020>
<E0026>ORDERS</E0026>
<E0031>1</E0031>
<E0035>1</E0035>
</UNB>
<D96A:Message>
<UNH>
<E0062>000000101</E0062>
<S009>
<E0065>ORDERS</E0065>
<E0052>D</E0052>
<E0054>96A</E0054>
<E0051>UN</E0051>
</S009>
</UNH>
<D96A:ORDERS>
<BGM>
<C002>
<E1001>220</E1001>
</C002>
<E1004>128576</E1004>
<E1225>9</E1225>
</BGM>
<DTM>
<C507>
<E2005>137</E2005>
<E2380>20020830</E2380>
<E2379>102</E2379>
</C507>
</DTM>
<SegGrp-2>
<NAD>
<E3035>BY</E3035>
<C082>
<E3039>123456</E3039>
<E3055>9</E3055>
</C082>
<C080>
<E3036>Therese House</E3036>
</C080>
<C059>
<E3042>29-30 Glasshouse Yard</E3042>
</C059>
<E3164>London</E3164>
<E3251>EC1A 4JN</E3251>
<E3207>UK</E3207>
</NAD>
</SegGrp-2>
LINE_NUMBER UPC_NUMBER QUANTITY PRICE UOM PO_NUMBER PO_DATE CUSTOMER_NAME CUSTOMER_NUMBER ADDRESS CITY STATE POSTAL_CODE
1 4000862141404 48 5 PCE 128576 20020830 KION GROUP AG 123456 Abraham-Lincoln-Str Wiesbaden 65189
2 4000862141405 2 55 KGM 128577 20020830 Maria Theresa 123457 Maria-Theresien-Strasse Innsbruck AT6020
3 4000862141406 17 15 PCE 128578 20020830 Gianni l-Pastizz 123458 Republic Street Valletta VLT1117
...
...
public class InventoryVisitor implements AfterVisitor {
private static final XmlMapper XML_MAPPER = new XmlMapper();
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Override
public void visitAfter(Element element, ExecutionContext executionContext) {
try {
JsonNode jsonNode = XML_MAPPER.readTree(XmlUtil.serialize(element));
Stream.out(executionContext).write(OBJECT_MAPPER.writeValueAsString(jsonNode));
} catch (IOException e) {
throw new SmooksException(e);
}
}
}
<purchaseOrder>
<id>${record.item[6]}</id>
<productId>${record.item[2]}</productId>
<quantity>${record.item[3]}</quantity>
<customerName>${record.item[9]}</customerName>
<address>${record.item[11]}</address>
<date>${record.item[7]}</date>
</purchaseOrder>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd">
<core:smooks filterSourceOn="...">
<core:action>
...
</core:action>
<core:config>
<smooks-resource-list>
...
</smooks-resource-list>
</core:config>
</core:smooks>
</smooks-resource-list>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd"
xmlns:ftl="https://www.smooks.org/xsd/smooks/freemarker-2.0.xsd"
xmlns:edifact="https://www.smooks.org/xsd/smooks/edifact-2.0.xsd"
xmlns:dfdl="https://www.smooks.org/xsd/smooks/dfdl-1.0.xsd">
<dfdl:parser schemaURI="/csv.dfdl.xsd"/>
...
...
<core:smooks filterSourceOn="#document">
<core:action>
<core:inline>
<core:replace/>
</core:inline>
</core:action>
<core:config>
<smooks-resource-list>
<core:delegate-reader>
<ftl:freemarker applyOnElement="#document" applyBefore="true">
<ftl:template>header.xml.ftl</ftl:template>
</ftl:freemarker>
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:config>
<smooks-resource-list>
<ftl:freemarker applyOnElement="#document">
<ftl:template>item.xml.ftl</ftl:template>
</ftl:freemarker>
</smooks-resource-list>
</core:config>
</core:smooks>
<ftl:freemarker applyOnElement="#document">
<ftl:template>footer.xml.ftl</ftl:template>
</ftl:freemarker>
</core:delegate-reader>
<edifact:unparser schemaURI="/d96a/EDIFACT-Messages.dfdl.xsd" unparseOnElement="*">
<edifact:messageTypes>
<edifact:messageType>ORDERS</edifact:messageType>
</edifact:messageTypes>
</edifact:unparser>
</smooks-resource-list>
</core:config>
</core:smooks>
</smooks-resource-list>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd"
xmlns:dfdl="https://www.smooks.org/xsd/smooks/dfdl-1.0.xsd">
<dfdl:parser schemaURI="/csv.dfdl.xsd"/>
</smooks-resource-list>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd"
xmlns:dfdl="https://www.smooks.org/xsd/smooks/dfdl-1.0.xsd">
<dfdl:parser schemaURI="/csv.dfdl.xsd"/>
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:action>
<core:outputTo outputStreamResource="inventoryOutputStream"/>
</core:action>
<core:config>
<smooks-resource-list>
<resource-config selector="#document">
<resource>org.smooks.examples.pipeline.InventoryVisitor</resource>
</resource-config>
</smooks-resource-list>
</core:config>
</core:smooks>
...
</smooks-resource-list>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd"
xmlns:ftl="https://www.smooks.org/xsd/smooks/freemarker-2.0.xsd"
xmlns:dfdl="https://www.smooks.org/xsd/smooks/dfdl-1.0.xsd">
<dfdl:parser schemaURI="/csv.dfdl.xsd"/>
...
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:config>
<smooks-resource-list>
<core:delegate-reader>
<ftl:freemarker applyOnElement="#document">
<ftl:template>purchaseOrder.xml.ftl</ftl:template>
</ftl:freemarker>
</core:delegate-reader>
<resource-config selector="purchaseOrder">
<resource>org.smooks.examples.pipeline.CrmVisitor</resource>
</resource-config>
</smooks-resource-list>
</core:config>
</core:smooks>
</smooks-resource-list>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd"
xmlns:ftl="https://www.smooks.org/xsd/smooks/freemarker-2.0.xsd"
xmlns:edifact="https://www.smooks.org/xsd/smooks/edifact-2.0.xsd"
xmlns:dfdl="https://www.smooks.org/xsd/smooks/dfdl-1.0.xsd">
<dfdl:parser schemaURI="/csv.dfdl.xsd"/>
...
...
<core:smooks filterSourceOn="#document">
<core:action>
<core:inline>
<core:replace/>
</core:inline>
</core:action>
...
</core:smooks>
</smooks-resource-list>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd"
xmlns:ftl="https://www.smooks.org/xsd/smooks/freemarker-2.0.xsd"
xmlns:edifact="https://www.smooks.org/xsd/smooks/edifact-2.0.xsd"
xmlns:dfdl="https://www.smooks.org/xsd/smooks/dfdl-1.0.xsd">
<dfdl:parser schemaURI="/csv.dfdl.xsd"/>
...
...
<core:smooks filterSourceOn="#document">
<core:action>
<core:inline>
<core:replace/>
</core:inline>
</core:action>
<core:config>
<smooks-resource-list>
<core:delegate-reader>
<ftl:freemarker applyOnElement="#document" applyBefore="true">
<ftl:template>header.xml.ftl</ftl:template>
</ftl:freemarker>
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:config>
<smooks-resource-list>
<ftl:freemarker applyOnElement="#document">
<ftl:template>body.xml.ftl</ftl:template>
</ftl:freemarker>
</smooks-resource-list>
</core:config>
</core:smooks>
<ftl:freemarker applyOnElement="#document">
<ftl:template>footer.xml.ftl</ftl:template>
</ftl:freemarker>
</core:delegate-reader>
...
</smooks-resource-list>
</core:config>
</core:smooks>
</smooks-resource-list>
<core:delegate-reader>
<ftl:freemarker applyOnElement="#document" applyBefore="true">
<ftl:template>header.xml.ftl</ftl:template>
</ftl:freemarker>
...
</core:delegate-reader>
<core:delegate-reader>
...
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:config>
<smooks-resource-list>
<ftl:freemarker applyOnElement="#document">
<ftl:template>body.xml.ftl</ftl:template>
</ftl:freemarker>
</smooks-resource-list>
</core:config>
</core:smooks>
...
</core:delegate-reader>
<core:delegate-reader>
...
<ftl:freemarker applyOnElement="#document">
<ftl:template>footer.xml.ftl</ftl:template>
</ftl:freemarker>
</core:delegate-reader>
<smooks-resource-list xmlns="https://www.smooks.org/xsd/smooks-2.0.xsd"
xmlns:core="https://www.smooks.org/xsd/smooks/smooks-core-1.6.xsd"
xmlns:ftl="https://www.smooks.org/xsd/smooks/freemarker-2.0.xsd"
xmlns:edifact="https://www.smooks.org/xsd/smooks/edifact-2.0.xsd"
xmlns:dfdl="https://www.smooks.org/xsd/smooks/dfdl-1.0.xsd">
<dfdl:parser schemaURI="/csv.dfdl.xsd"/>
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:action>
<core:outputTo outputStreamResource="inventoryOutputStream"/>
</core:action>
<core:config>
<smooks-resource-list>
<resource-config selector="#document">
<resource>org.smooks.examples.pipeline.InventoryVisitor</resource>
</resource-config>
</smooks-resource-list>
</core:config>
</core:smooks>
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:config>
<smooks-resource-list>
<core:delegate-reader>
<ftl:freemarker applyOnElement="#document">
<ftl:template>purchaseOrder.xml.ftl</ftl:template>
</ftl:freemarker>
</core:delegate-reader>
<resource-config selector="purchaseOrder">
<resource>org.smooks.examples.pipeline.CrmVisitor</resource>
</resource-config>
</smooks-resource-list>
</core:config>
</core:smooks>
<core:smooks filterSourceOn="#document">
<core:action>
<core:inline>
<core:replace/>
</core:inline>
</core:action>
<core:config>
<smooks-resource-list>
<core:delegate-reader>
<ftl:freemarker applyOnElement="#document" applyBefore="true">
<ftl:template>header.xml.ftl</ftl:template>
</ftl:freemarker>
<core:smooks filterSourceOn="record" maxNodeDepth="0">
<core:config>
<smooks-resource-list>
<ftl:freemarker applyOnElement="#document">
<ftl:template>body.xml.ftl</ftl:template>
</ftl:freemarker>
</smooks-resource-list>
</core:config>
</core:smooks>
<ftl:freemarker applyOnElement="#document">
<ftl:template>footer.xml.ftl</ftl:template>
</ftl:freemarker>
</core:delegate-reader>
<edifact:unparser schemaURI="/d96a/EDIFACT-Messages.dfdl.xsd" unparseOnElement="*">
<edifact:messageTypes>
<edifact:messageType>ORDERS</edifact:messageType>
</edifact:messageTypes>
</edifact:unparser>
</smooks-resource-list>
</core:config>
</core:smooks>
</smooks-resource-list>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment