You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Fitzcaraldo <Br...@marlo.com.au> on 2012/01/04 06:15:48 UTC

Bindy and FixedLength

I'm trying to model a COBOL copybook message using Bindy.  The basic
structure is a fixed length header followed by multiple fixed length bodies
- all with no separators.

Can this be modeled for marshaling purposes using the following annotations:


@FixedLengthRecord(length=60, paddingChar=' ')
public class TestHeader {
    
   @DataField(pos = 1, length = 4)
    private String RECORD_ID;  

    etc....

   @OneToMany
   private List<TestBody> body;
	
}


@FixedLengthRecord(length=40, paddingChar=' ')
public class TestBody {

   @DataField(pos = 1, length = 16)
   private String TYPE;

   etc

}



--
View this message in context: http://camel.465427.n5.nabble.com/Bindy-and-FixedLength-tp5118749p5118749.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Bindy and FixedLength

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

We plan to fix and improve camel-bindy for Camel 2.10. There is a
couple of JIRAs already.
However your use-case may not be included.

Fell free to create a JIRA with your use-case and attaching some
sample code / unit test will help verify the solution.


On Thu, Jan 5, 2012 at 5:30 AM, Fitzcaraldo
<Br...@marlo.com.au> wrote:
> OK.
>
> So I first tried without the @OneToMany section for the lineItems and
> successfully produced a TestHeader Object (using a shorter input stream)
>
> When I put the OneToMany with a full length input stream I get the following
> exception:
>
> Size of the record: 756 is not equal to the value provided in the model: 126
>
> (126 bytes of header + 10x 63 bytes of body = 756)
>
> I was hoping it might produce as many TestBody objects as required.
>
> Is OneToMany supported with FixedLengthRecord?
>
> Using Camel 2.9.0-RC1
>
> Here's the TestHeader class
>
> @XmlRootElement //JAXB annotation
> @XmlAccessorType(XmlAccessType.FIELD)
> @FixedLengthRecord(length=126, paddingChar=' ')
> public class TestHeader {
>
>        @DataField(pos = 1, length = 4)
>        private String RECORD_ID;
>
>        @DataField(pos = 5, length = 1)
>        private String ACTION;
>
>        @DataField(pos = 6, length = 13)
>        private String TRAN_NO;
>
>        @DataField(pos = 19, length = 3)
>        private String DATA_TYPE;
>
>        @DataField(pos = 22, length = 6)
>        private String TRAN_DEST;
>
>        @DataField(pos = 28, length = 9)
>        private String TRAN_SEQ_NO;
>
>        @DataField(pos = 37, length = 8)
>        private String RECORD_DATE;
>
>        @DataField(pos = 45, length = 5)
>        private String RECORD_TIME;
>
>        @DataField(pos = 50, length = 2)
>        private String COMP_CODE;
>
>        @DataField(pos = 52, length = 30)
>        private String CUST_NO;
>
>        @DataField(pos = 82, length = 5)
>        private String NO_LINE_ITEMS;
>
>        @DataField(pos = 87, length = 15)
>        private String ORD_NO;
>
>        @DataField(pos = 102, length = 2)
>        private String ORD_TYPE;
>
>        @DataField(pos = 104, length = 7)
>        private String ASSIGNMENT_NO;
>
>        @DataField(pos = 111, length = 8)
>        private String CUST_ORD_DATE;
>
>        @DataField(pos = 119, length = 4)
>        private String SOURCE_SYS;
>
>        @DataField(pos = 123, length = 2)
>        private String TPC_TYPE_CODE;
>
>        @OneToMany
>        private List<TestBody> lineItems;
>
> }
>
> and TestBody class
>
> @FixedLengthRecord(length=63, paddingChar=' ')
> public class TestBody {
>
>        @DataField(pos = 1, length = 4)
>    private String RECORD_ID;
>
>        @DataField(pos = 5, length = 1)
>        private String ACTION;
>
>        @DataField(pos = 6, length = 8)
>        private String RECORD_DATE;
>
>        @DataField(pos = 14, length = 5)
>        private String RECORD_TIME;
>
>        @DataField(pos = 19, length = 6)
>        private String ORD_LINE_NO;
>
>        @DataField(pos = 25, length = 9)
>        private String ORD_QTY;
>
>        @DataField(pos = 34, length = 20)
>        private String SKU;
>
>        @DataField(pos = 54, length = 4)
>        private String PKG_NO;
>
>        @DataField(pos = 58, length = 2)
>        private String UOM_ABBREV;
>
>        @DataField(pos = 60, length = 2)
>        private String DISTRO_TYPE;
>
>        @DataField(pos = 62, length = 2)
>        private String ITEM_TYPE;
>
> }
>
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/Bindy-and-FixedLength-tp5118749p5121740.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



-- 
Claus Ibsen
-----------------
FuseSource
Email: cibsen@fusesource.com
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/

Re: Bindy and FixedLength

Posted by Fitzcaraldo <Br...@marlo.com.au>.
OK.

So I first tried without the @OneToMany section for the lineItems and
successfully produced a TestHeader Object (using a shorter input stream)

When I put the OneToMany with a full length input stream I get the following
exception:

Size of the record: 756 is not equal to the value provided in the model: 126

(126 bytes of header + 10x 63 bytes of body = 756)

I was hoping it might produce as many TestBody objects as required.

Is OneToMany supported with FixedLengthRecord?

Using Camel 2.9.0-RC1

Here's the TestHeader class

@XmlRootElement //JAXB annotation
@XmlAccessorType(XmlAccessType.FIELD)
@FixedLengthRecord(length=126, paddingChar=' ')
public class TestHeader {
    
	@DataField(pos = 1, length = 4)
        private String RECORD_ID;

	@DataField(pos = 5, length = 1)
	private String ACTION;
    
	@DataField(pos = 6, length = 13)
	private String TRAN_NO;

	@DataField(pos = 19, length = 3)
	private String DATA_TYPE;
 
	@DataField(pos = 22, length = 6)
	private String TRAN_DEST;

	@DataField(pos = 28, length = 9)
	private String TRAN_SEQ_NO;
	
	@DataField(pos = 37, length = 8)
	private String RECORD_DATE;
	
	@DataField(pos = 45, length = 5)
	private String RECORD_TIME;
	
	@DataField(pos = 50, length = 2)
	private String COMP_CODE;

	@DataField(pos = 52, length = 30)
	private String CUST_NO;

	@DataField(pos = 82, length = 5)
	private String NO_LINE_ITEMS;

	@DataField(pos = 87, length = 15)
	private String ORD_NO;

	@DataField(pos = 102, length = 2)
	private String ORD_TYPE;

	@DataField(pos = 104, length = 7)
	private String ASSIGNMENT_NO;

	@DataField(pos = 111, length = 8)
	private String CUST_ORD_DATE;

	@DataField(pos = 119, length = 4)
	private String SOURCE_SYS;

	@DataField(pos = 123, length = 2)
	private String TPC_TYPE_CODE;
	
	@OneToMany
	private List<TestBody> lineItems;
	
}

and TestBody class

@FixedLengthRecord(length=63, paddingChar=' ')
public class TestBody {
	
	@DataField(pos = 1, length = 4)
    private String RECORD_ID;

	@DataField(pos = 5, length = 1)
	private String ACTION;
    
	@DataField(pos = 6, length = 8)
	private String RECORD_DATE;
	
	@DataField(pos = 14, length = 5)
	private String RECORD_TIME;

	@DataField(pos = 19, length = 6)
	private String ORD_LINE_NO;

	@DataField(pos = 25, length = 9)
	private String ORD_QTY;

	@DataField(pos = 34, length = 20)
	private String SKU;

	@DataField(pos = 54, length = 4)
	private String PKG_NO;

	@DataField(pos = 58, length = 2)
	private String UOM_ABBREV;

	@DataField(pos = 60, length = 2)
	private String DISTRO_TYPE;

	@DataField(pos = 62, length = 2)
	private String ITEM_TYPE;

}


--
View this message in context: http://camel.465427.n5.nabble.com/Bindy-and-FixedLength-tp5118749p5121740.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Bindy and FixedLength

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

Why dont you try it for yourself? I would assume it would be doable
with the outline you sketched.


On Wed, Jan 4, 2012 at 6:15 AM, Fitzcaraldo
<Br...@marlo.com.au> wrote:
> I'm trying to model a COBOL copybook message using Bindy.  The basic
> structure is a fixed length header followed by multiple fixed length bodies
> - all with no separators.
>
> Can this be modeled for marshaling purposes using the following annotations:
>
>
> @FixedLengthRecord(length=60, paddingChar=' ')
> public class TestHeader {
>
>   @DataField(pos = 1, length = 4)
>    private String RECORD_ID;
>
>    etc....
>
>   @OneToMany
>   private List<TestBody> body;
>
> }
>
>
> @FixedLengthRecord(length=40, paddingChar=' ')
> public class TestBody {
>
>   @DataField(pos = 1, length = 16)
>   private String TYPE;
>
>   etc
>
> }
>
>
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/Bindy-and-FixedLength-tp5118749p5118749.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



-- 
Claus Ibsen
-----------------
FuseSource
Email: cibsen@fusesource.com
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/