Flatpack Component
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.
URI format
flatpack:[delim|fixed]:flatPackConfig.pzmap.xml
or for a delimited file handler with no configuration file just use
flatpack:someName
Examples
- 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
URI Options
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 Camel 1.5 the component can either process each row one by one or the entire content at once. |
Message Headers
Camel will store the following headers on the IN message:
Header |
Description |
---|---|
camelFlatpackCounter |
The current row index. For |
Message Body
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");
Header and Trailer records
In Camel 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>
Using the endpoint
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