The Flatpack component supports fixed width and delimited file parsing via the FlatPack library. Notice: This component only supports consuming from flatpack files to Object model. You can not (yet) write from Object model to flatpack format.
flatpack:[delim|fixed]:flatPackConfig.pzmap.xml
or for a delimited file handler with no configuration file just use
flatpack:someName
flatpack:fixed:foo.pzmap.xml creates a fixed width endpoint using the foo.pzmap.xml file configuration
flatpack:delim:bar.pzmap.xml creates a delimited endpoint using the bar.pzmap.xml file configuration
flatpack:foo creates a delimited endpoint called foo with no file configuration
| Name | Default Value | Description |
|---|---|---|
| delimiter | ',' | The default character delimiter for delimited files |
| textQualifier | '"' | The text qualifier delimited files |
| ignoreFirstRecord | true | Whether the first line is ignored for delimited files (for the column headers) |
| splitRows | true | As of FUSE Mediation Router 1.5 the component can either process each row one by one or the entire content at once. |
FUSE Mediation Router will store the following headers on the IN message:
| Header | Description |
|---|---|
| camelFlatpackCounter | The current row index. For splitRows=false the counter is the total
number of rows. |
The component delivers the data in the IN message as a
org.apache.camel.component.flatpack.DataSetList object that have
converters for java.util.Map or java.util.List. Usually
you want the Map if you process one row at a time (splitRows=true). And the List for the
entire content (splitRows=false), where each element in the list is a Map. Each Map contain
the key for the column name and its corresponding value.
For example to get the firstname from the sample below:
Map row = exchange.getIn().getBody(Map.class);
String firstName = row.get("FIRSTNAME");
However you can also always get it as a List (even for splitRows=true). The same example:
List data = exchange.getIn().getBody(List.class);
Map row = (Map)data.get(0);
String firstName = row.get("FIRSTNAME");
In FUSE Mediation Router 1.5 onwards the header and trailer notions in Flatpack is supported. However it is required that you must use fixed record id names:
header for the header record (must be lowercase)
trailer for the trailer record (must be lowercase)
The example below illustrates this fact that we have a header and a trailer. You can omit one or both of them if not needed.
<RECORD id="header" startPosition="1" endPosition="3" indicator="HBT">
<COLUMN name="INDICATOR" length="3"/>
<COLUMN name="DATE" length="8"/>
</RECORD>
<COLUMN name="FIRSTNAME" length="35" />
<COLUMN name="LASTNAME" length="35" />
<COLUMN name="ADDRESS" length="100" />
<COLUMN name="CITY" length="100" />
<COLUMN name="STATE" length="2" />
<COLUMN name="ZIP" length="5" />
<RECORD id="trailer" startPosition="1" endPosition="3" indicator="FBT">
<COLUMN name="INDICATOR" length="3"/>
<COLUMN name="STATUS" length="7"/>
</RECORD>
A common use case is sending a file to this endpoint for further processing in a separate route. For example...
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="file://someDirectory"/>
<to uri="flatpack:foo"/>
</route>
<route>
<from uri="flatpack:foo"/>
...
</route>
</camelContext>
You can also convert the payload of each message created to a Map for easy Bean Integration