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