1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.jdtaus.banking.dtaus.ri.zka;
22
23 import java.io.IOException;
24 import java.math.BigInteger;
25 import java.util.ArrayList;
26 import java.util.Currency;
27 import java.util.Date;
28 import java.util.List;
29 import org.jdtaus.banking.AlphaNumericText27;
30 import org.jdtaus.banking.Bankleitzahl;
31 import org.jdtaus.banking.Kontonummer;
32 import org.jdtaus.banking.Referenznummer10;
33 import org.jdtaus.banking.Referenznummer11;
34 import org.jdtaus.banking.Textschluessel;
35 import org.jdtaus.banking.dtaus.Checksum;
36 import org.jdtaus.banking.dtaus.CorruptedException;
37 import org.jdtaus.banking.dtaus.Header;
38 import org.jdtaus.banking.dtaus.LogicalFileType;
39 import org.jdtaus.banking.dtaus.PhysicalFileFactory;
40 import org.jdtaus.banking.dtaus.Transaction;
41 import org.jdtaus.banking.dtaus.spi.Fields;
42 import org.jdtaus.banking.messages.IllegalDataMessage;
43 import org.jdtaus.core.container.ContainerFactory;
44 import org.jdtaus.core.container.Implementation;
45 import org.jdtaus.core.container.ModelFactory;
46 import org.jdtaus.core.logging.spi.Logger;
47 import org.jdtaus.core.text.Message;
48
49
50
51
52
53
54
55 public final class DTAUSDisk extends AbstractLogicalFile
56 {
57
58
59 protected static final int CRECORD_CONST_LENGTH = 187;
60
61
62 protected static final int CRECORD_EXT_LENGTH = 29;
63
64
65
66
67
68 protected static final int[] ARECORD_OFFSETS =
69 {
70 0, 4, 5, 7, 15, 23, 50, 56, 60, 70, 80, 95, 103, 127
71 };
72
73
74
75
76
77 protected static final int[] ARECORD_LENGTH =
78 {
79 4, 1, 2, 8, 8, 27, 6, 4, 10, 10, 15, 8, 24, 1
80 };
81
82
83
84
85
86 protected static final int[] ERECORD_OFFSETS =
87 {
88 0, 4, 5, 10, 17, 30, 47, 64, 77
89 };
90
91
92
93
94
95 protected static final int[] ERECORD_LENGTH =
96 {
97 4, 1, 5, 7, 13, 17, 17, 13, 51
98 };
99
100
101
102
103
104 protected static final int[] CRECORD_OFFSETS1 =
105 {
106 0, 4, 5, 13, 21, 32, 44, 49, 50, 61, 69, 79, 90, 93, 120
107 };
108
109
110
111
112
113 protected static final int[] CRECORD_LENGTH1 =
114 {
115 4, 1, 8, 8, 10, 11, 5, 1, 11, 8, 10, 11, 3, 27, 8
116 };
117
118
119
120
121
122 protected static final int[] CRECORD_OFFSETS2 =
123 {
124 0, 27, 54, 55, 57, 59, 61, 88, 90, 117
125 };
126
127
128
129
130
131 protected static final int[] CRECORD_LENGTH2 =
132 {
133 27, 27, 1, 2, 2, 2, 27, 2, 27, 11
134 };
135
136
137
138
139
140 protected static final int[] CRECORD_OFFSETS_EXT =
141 {
142 0, 2, 29, 31, 58, 60, 87, 89, 116
143 };
144
145
146
147
148
149 protected static final int[] CRECORD_LENGTH_EXT =
150 {
151 2, 27, 2, 27, 2, 27, 2, 27, 12
152 };
153
154
155
156
157
158 protected static final int[] CRECORD_EXTENSIONCOUNT_TO_BLOCKCOUNT =
159 {
160 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6
161 };
162
163
164
165
166
167 protected static final int[] CRECORD_EXTINDEX_TO_BLOCKOFFSET =
168 {
169 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5
170 };
171
172
173
174
175
176 protected static final int[] CRECORD_EXTINDEX_TO_TYPEOFFSET =
177 {
178 CRECORD_OFFSETS2[5], CRECORD_OFFSETS2[7], CRECORD_OFFSETS_EXT[0], CRECORD_OFFSETS_EXT[2],
179 CRECORD_OFFSETS_EXT[4], CRECORD_OFFSETS_EXT[6], CRECORD_OFFSETS_EXT[0], CRECORD_OFFSETS_EXT[2],
180 CRECORD_OFFSETS_EXT[4], CRECORD_OFFSETS_EXT[6], CRECORD_OFFSETS_EXT[0], CRECORD_OFFSETS_EXT[2],
181 CRECORD_OFFSETS_EXT[4], CRECORD_OFFSETS_EXT[6], CRECORD_OFFSETS_EXT[0], CRECORD_OFFSETS_EXT[2],
182 CRECORD_OFFSETS_EXT[4], CRECORD_OFFSETS_EXT[6]
183 };
184
185
186
187
188
189 protected static final int[] CRECORD_EXTINDEX_TO_TYPELENGTH =
190 {
191 CRECORD_LENGTH2[5], CRECORD_LENGTH2[7], CRECORD_LENGTH_EXT[0], CRECORD_LENGTH_EXT[2],
192 CRECORD_LENGTH_EXT[4], CRECORD_LENGTH_EXT[6], CRECORD_LENGTH_EXT[0], CRECORD_LENGTH_EXT[2],
193 CRECORD_LENGTH_EXT[4], CRECORD_LENGTH_EXT[6], CRECORD_LENGTH_EXT[0], CRECORD_LENGTH_EXT[2],
194 CRECORD_LENGTH_EXT[4], CRECORD_LENGTH_EXT[6], CRECORD_LENGTH_EXT[0], CRECORD_LENGTH_EXT[2],
195 CRECORD_LENGTH_EXT[4], CRECORD_LENGTH_EXT[6]
196 };
197
198
199
200
201
202 protected static final int[] CRECORD_EXTINDEX_TO_VALUEOFFSET =
203 {
204 CRECORD_OFFSETS2[6], CRECORD_OFFSETS2[8], CRECORD_OFFSETS_EXT[1], CRECORD_OFFSETS_EXT[3],
205 CRECORD_OFFSETS_EXT[5], CRECORD_OFFSETS_EXT[7], CRECORD_OFFSETS_EXT[1], CRECORD_OFFSETS_EXT[3],
206 CRECORD_OFFSETS_EXT[5], CRECORD_OFFSETS_EXT[7], CRECORD_OFFSETS_EXT[1], CRECORD_OFFSETS_EXT[3],
207 CRECORD_OFFSETS_EXT[5], CRECORD_OFFSETS_EXT[7], CRECORD_OFFSETS_EXT[1], CRECORD_OFFSETS_EXT[3],
208 CRECORD_OFFSETS_EXT[5], CRECORD_OFFSETS_EXT[7]
209 };
210
211
212
213
214
215 protected static final int[] CRECORD_EXTINDEX_TO_VALUELENGTH =
216 {
217 CRECORD_LENGTH2[6], CRECORD_LENGTH2[8], CRECORD_LENGTH_EXT[1], CRECORD_LENGTH_EXT[3],
218 CRECORD_LENGTH_EXT[5], CRECORD_LENGTH_EXT[7], CRECORD_LENGTH_EXT[1], CRECORD_LENGTH_EXT[3],
219 CRECORD_LENGTH_EXT[5], CRECORD_LENGTH_EXT[7], CRECORD_LENGTH_EXT[1], CRECORD_LENGTH_EXT[3],
220 CRECORD_LENGTH_EXT[5], CRECORD_LENGTH_EXT[7], CRECORD_LENGTH_EXT[1], CRECORD_LENGTH_EXT[3],
221 CRECORD_LENGTH_EXT[5], CRECORD_LENGTH_EXT[7]
222 };
223
224
225
226
227
228 protected static final int[] CRECORD_EXTINDEX_TO_FOLLOWINGEXTENSIONS =
229 {
230 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0
231 };
232
233
234
235
236
237 protected static final int[] CRECORD_EXTINDEX_TO_TYPEFIELD =
238 {
239 Fields.FIELD_C19, Fields.FIELD_C21, Fields.FIELD_C24, Fields.FIELD_C26, Fields.FIELD_C28, Fields.FIELD_C30,
240 Fields.FIELD_C33, Fields.FIELD_C35, Fields.FIELD_C37, Fields.FIELD_C39, Fields.FIELD_C42, Fields.FIELD_C44,
241 Fields.FIELD_C46, Fields.FIELD_C48, Fields.FIELD_C51, Fields.FIELD_C53, Fields.FIELD_C55, Fields.FIELD_C57,
242 Fields.FIELD_C59
243 };
244
245
246
247
248
249 protected static final int[] CRECORD_EXTINDEX_TO_VALUEFIELD =
250 {
251 Fields.FIELD_C20, Fields.FIELD_C22, Fields.FIELD_C25, Fields.FIELD_C27, Fields.FIELD_C29, Fields.FIELD_C31,
252 Fields.FIELD_C34, Fields.FIELD_C36, Fields.FIELD_C38, Fields.FIELD_C40, Fields.FIELD_C43, Fields.FIELD_C45,
253 Fields.FIELD_C47, Fields.FIELD_C49, Fields.FIELD_C52, Fields.FIELD_C54, Fields.FIELD_C56, Fields.FIELD_C58
254 };
255
256
257 public DTAUSDisk()
258 {
259 super();
260 }
261
262 protected char getBlockType( final long position ) throws IOException
263 {
264
265 final AlphaNumericText27 txt = this.readAlphaNumeric(
266 Fields.FIELD_A2, position + ARECORD_OFFSETS[1], ARECORD_LENGTH[1], ENCODING_ASCII );
267
268 char ret = '?';
269
270 if ( txt != null )
271 {
272 if ( txt.length() != 1 )
273 {
274 if ( ThreadLocalMessages.isErrorsEnabled() )
275 {
276 throw new CorruptedException( this.getImplementation(), position + ARECORD_OFFSETS[1] );
277 }
278 else
279 {
280 final Message msg = new IllegalDataMessage(
281 Fields.FIELD_A2, IllegalDataMessage.TYPE_CONSTANT, position + ARECORD_OFFSETS[1],
282 txt.format() );
283
284 ThreadLocalMessages.getMessages().addMessage( msg );
285 }
286 }
287 else
288 {
289 ret = txt.charAt( 0 );
290 }
291 }
292
293 return ret;
294 }
295
296 protected Header readHeader() throws IOException
297 {
298 Long num;
299 AlphaNumericText27 txt;
300 final Header ret = new Header();
301
302
303 num = this.readNumber(
304 Fields.FIELD_A1, this.getHeaderPosition() + ARECORD_OFFSETS[0], ARECORD_LENGTH[0], ENCODING_ASCII );
305
306 if ( num.longValue() != NO_NUMBER && num.intValue() != this.getBlockSize() )
307 {
308 if ( ThreadLocalMessages.isErrorsEnabled() )
309 {
310 throw new CorruptedException( this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[0] );
311 }
312 else
313 {
314 final Message msg = new IllegalDataMessage(
315 Fields.FIELD_A1, IllegalDataMessage.TYPE_CONSTANT, this.getHeaderPosition() + ARECORD_OFFSETS[0],
316 num.toString() );
317
318 ThreadLocalMessages.getMessages().addMessage( msg );
319 }
320 }
321
322
323 txt = this.readAlphaNumeric(
324 Fields.FIELD_A2, this.getHeaderPosition() + ARECORD_OFFSETS[1], ARECORD_LENGTH[1], ENCODING_ASCII );
325
326 if ( txt != null && ( txt.length() != 1 || txt.charAt( 0 ) != 'A' ) )
327 {
328 if ( ThreadLocalMessages.isErrorsEnabled() )
329 {
330 throw new CorruptedException( this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[1] );
331 }
332 else
333 {
334 final Message msg = new IllegalDataMessage(
335 Fields.FIELD_A2, IllegalDataMessage.TYPE_CONSTANT, this.getHeaderPosition() + ARECORD_OFFSETS[1],
336 txt.format() );
337
338 ThreadLocalMessages.getMessages().addMessage( msg );
339 }
340 }
341
342
343 txt = this.readAlphaNumeric(
344 Fields.FIELD_A3, this.getHeaderPosition() + ARECORD_OFFSETS[2], ARECORD_LENGTH[2], ENCODING_ASCII );
345
346 ret.setType( null );
347 if ( txt != null )
348 {
349 final LogicalFileType label = LogicalFileType.valueOf( txt.format() );
350
351 if ( label == null )
352 {
353 if ( ThreadLocalMessages.isErrorsEnabled() )
354 {
355 throw new CorruptedException(
356 this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[2] );
357
358 }
359 else
360 {
361 final Message msg = new IllegalDataMessage(
362 Fields.FIELD_A3, IllegalDataMessage.TYPE_FILETYPE, this.getHeaderPosition() + ARECORD_OFFSETS[2],
363 txt.format() );
364
365 ThreadLocalMessages.getMessages().addMessage( msg );
366 }
367 }
368 else
369 {
370 ret.setType( label );
371 }
372 }
373
374
375 num = this.readNumber(
376 Fields.FIELD_A4, this.getHeaderPosition() + ARECORD_OFFSETS[3], ARECORD_LENGTH[3], ENCODING_ASCII );
377
378 ret.setBank( null );
379 if ( num.longValue() != NO_NUMBER )
380 {
381 if ( !Bankleitzahl.checkBankleitzahl( num ) )
382 {
383 if ( ThreadLocalMessages.isErrorsEnabled() )
384 {
385 throw new CorruptedException(
386 this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[3] );
387
388 }
389 else
390 {
391 final Message msg = new IllegalDataMessage(
392 Fields.FIELD_A4, IllegalDataMessage.TYPE_BANKLEITZAHL,
393 this.getHeaderPosition() + ARECORD_OFFSETS[3], num.toString() );
394
395 ThreadLocalMessages.getMessages().addMessage( msg );
396 }
397 }
398 else
399 {
400 ret.setBank( Bankleitzahl.valueOf( num ) );
401 }
402 }
403
404
405
406 num = this.readNumber(
407 Fields.FIELD_A5, this.getHeaderPosition() + ARECORD_OFFSETS[4], ARECORD_LENGTH[4], ENCODING_ASCII );
408
409 ret.setBankData( null );
410 if ( num.longValue() != NO_NUMBER && ret.getType() != null && ret.getType().isSendByBank() )
411 {
412 if ( !Bankleitzahl.checkBankleitzahl( num ) )
413 {
414 if ( ThreadLocalMessages.isErrorsEnabled() )
415 {
416 throw new CorruptedException(
417 this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[4] );
418
419 }
420 else
421 {
422 final Message msg = new IllegalDataMessage(
423 Fields.FIELD_A5, IllegalDataMessage.TYPE_BANKLEITZAHL,
424 this.getHeaderPosition() + ARECORD_OFFSETS[4], num.toString() );
425
426 ThreadLocalMessages.getMessages().addMessage( msg );
427 }
428 }
429 else
430 {
431 ret.setBankData( Bankleitzahl.valueOf( num ) );
432 }
433 }
434
435
436 txt = this.readAlphaNumeric(
437 Fields.FIELD_A6, this.getHeaderPosition() + ARECORD_OFFSETS[5], ARECORD_LENGTH[5], ENCODING_ASCII );
438
439 ret.setCustomer( txt );
440
441
442 final Date createDate = this.readShortDate(
443 Fields.FIELD_A7, this.getHeaderPosition() + ARECORD_OFFSETS[6], ENCODING_ASCII );
444
445 if ( createDate == null )
446 {
447 if ( ThreadLocalMessages.isErrorsEnabled() )
448 {
449 throw new CorruptedException( this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[6] );
450 }
451 else
452 {
453 ThreadLocalMessages.getMessages().addMessage( new IllegalDataMessage(
454 Fields.FIELD_A7, IllegalDataMessage.TYPE_SHORTDATE, this.getHeaderPosition() + ARECORD_OFFSETS[6],
455 " " ) );
456
457 }
458 }
459
460
461
462 txt = this.readAlphaNumeric(
463 Fields.FIELD_A8, this.getHeaderPosition() + ARECORD_OFFSETS[7], ARECORD_LENGTH[7], ENCODING_ASCII );
464
465
466 num = this.readNumber(
467 Fields.FIELD_A9, this.getHeaderPosition() + ARECORD_OFFSETS[8], ARECORD_LENGTH[8], ENCODING_ASCII );
468
469 ret.setAccount( null );
470 if ( num.longValue() != NO_NUMBER )
471 {
472 if ( !Kontonummer.checkKontonummer( num ) )
473 {
474 if ( ThreadLocalMessages.isErrorsEnabled() )
475 {
476 throw new CorruptedException(
477 this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[8] );
478
479 }
480 else
481 {
482 final Message msg = new IllegalDataMessage(
483 Fields.FIELD_A9, IllegalDataMessage.TYPE_KONTONUMMER,
484 this.getHeaderPosition() + ARECORD_OFFSETS[8], num.toString() );
485
486 ThreadLocalMessages.getMessages().addMessage( msg );
487 }
488 }
489 else
490 {
491 ret.setAccount( Kontonummer.valueOf( num ) );
492 }
493 }
494
495
496 num = this.readNumber(
497 Fields.FIELD_A10, this.getHeaderPosition() + ARECORD_OFFSETS[9], ARECORD_LENGTH[9], ENCODING_ASCII );
498
499 ret.setReference( null );
500 if ( num.longValue() != NO_NUMBER )
501 {
502 if ( !Referenznummer10.checkReferenznummer10( num ) )
503 {
504 if ( ThreadLocalMessages.isErrorsEnabled() )
505 {
506 throw new CorruptedException(
507 this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[9] );
508
509 }
510 else
511 {
512 final Message msg = new IllegalDataMessage(
513 Fields.FIELD_A10, IllegalDataMessage.TYPE_REFERENZNUMMER,
514 this.getHeaderPosition() + ARECORD_OFFSETS[9], num.toString() );
515
516 ThreadLocalMessages.getMessages().addMessage( msg );
517 }
518 }
519 else
520 {
521 ret.setReference( Referenznummer10.valueOf( num ) );
522 }
523 }
524
525
526 final Date executionDate = this.readLongDate(
527 Fields.FIELD_A11B, this.getHeaderPosition() + ARECORD_OFFSETS[11], ENCODING_ASCII );
528
529 ret.setCreateDate( createDate );
530 ret.setExecutionDate( executionDate );
531
532 ret.setCurrency( null );
533 if ( createDate != null )
534 {
535
536 txt = this.readAlphaNumeric(
537 Fields.FIELD_A12, this.getHeaderPosition() + ARECORD_OFFSETS[13], ARECORD_LENGTH[13], ENCODING_ASCII );
538
539 if ( txt != null )
540 {
541 if ( txt.length() != 1 )
542 {
543 if ( ThreadLocalMessages.isErrorsEnabled() )
544 {
545 throw new CorruptedException(
546 this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[13] );
547
548 }
549 else
550 {
551 final Message msg = new IllegalDataMessage(
552 Fields.FIELD_A12, IllegalDataMessage.TYPE_CURRENCY,
553 this.getHeaderPosition() + ARECORD_OFFSETS[13], txt.format() );
554
555 ThreadLocalMessages.getMessages().addMessage( msg );
556 }
557 }
558 else
559 {
560 final char c = txt.charAt( 0 );
561 final Currency cur = this.getCurrencyMapper().getDtausCurrency( c, createDate );
562
563 if ( cur == null )
564 {
565 if ( ThreadLocalMessages.isErrorsEnabled() )
566 {
567 throw new CorruptedException(
568 this.getImplementation(), this.getHeaderPosition() + ARECORD_OFFSETS[13] );
569
570 }
571 else
572 {
573 final Message msg = new IllegalDataMessage(
574 Fields.FIELD_A12, IllegalDataMessage.TYPE_CURRENCY,
575 this.getHeaderPosition() + ARECORD_OFFSETS[13], txt.format() );
576
577 ThreadLocalMessages.getMessages().addMessage( msg );
578 }
579 }
580
581 ret.setCurrency( cur );
582 }
583 }
584 }
585
586 return ret;
587 }
588
589 protected void writeHeader( final Header header ) throws IOException
590 {
591 final LogicalFileType label = header.getType();
592
593
594 this.writeNumber(
595 Fields.FIELD_A1, this.getHeaderPosition() + ARECORD_OFFSETS[0], ARECORD_LENGTH[0], this.getBlockSize(),
596 ENCODING_ASCII );
597
598
599 this.writeAlphaNumeric(
600 Fields.FIELD_A2, this.getHeaderPosition() + ARECORD_OFFSETS[1], ARECORD_LENGTH[1], "A", ENCODING_ASCII );
601
602
603 this.writeAlphaNumeric(
604 Fields.FIELD_A3, this.getHeaderPosition() + ARECORD_OFFSETS[2], ARECORD_LENGTH[2], label.getCode(),
605 ENCODING_ASCII );
606
607
608 this.writeNumber(
609 Fields.FIELD_A4, this.getHeaderPosition() + ARECORD_OFFSETS[3], ARECORD_LENGTH[3],
610 header.getBank().intValue(), ENCODING_ASCII );
611
612
613 this.writeNumber(
614 Fields.FIELD_A5, this.getHeaderPosition() + ARECORD_OFFSETS[4],
615 ARECORD_LENGTH[4], ( label.isSendByBank() && header.getBankData() != null
616 ? header.getBankData().intValue() : 0 ), ENCODING_ASCII );
617
618
619 this.writeAlphaNumeric(
620 Fields.FIELD_A6, this.getHeaderPosition() + ARECORD_OFFSETS[5], ARECORD_LENGTH[5],
621 header.getCustomer().format(), ENCODING_ASCII );
622
623
624 this.writeShortDate(
625 Fields.FIELD_A7, this.getHeaderPosition() + ARECORD_OFFSETS[6], header.getCreateDate(), ENCODING_ASCII );
626
627
628 this.writeAlphaNumeric(
629 Fields.FIELD_A8, this.getHeaderPosition() + ARECORD_OFFSETS[7], ARECORD_LENGTH[7], "", ENCODING_ASCII );
630
631
632 this.writeNumber(
633 Fields.FIELD_A9, this.getHeaderPosition() + ARECORD_OFFSETS[8], ARECORD_LENGTH[8],
634 header.getAccount().longValue(), ENCODING_ASCII );
635
636
637 this.writeNumber(
638 Fields.FIELD_A10, this.getHeaderPosition() + ARECORD_OFFSETS[9], ARECORD_LENGTH[9],
639 ( header.getReference() != null ? header.getReference().longValue() : 0L ), ENCODING_ASCII );
640
641
642 this.writeAlphaNumeric(
643 Fields.FIELD_A11A, this.getHeaderPosition() + ARECORD_OFFSETS[10], ARECORD_LENGTH[10], "", ENCODING_ASCII );
644
645
646 this.writeLongDate(
647 Fields.FIELD_A11B, this.getHeaderPosition() + ARECORD_OFFSETS[11], header.getExecutionDate(),
648 ENCODING_ASCII );
649
650
651 this.writeAlphaNumeric(
652 Fields.FIELD_A11C, this.getHeaderPosition() + ARECORD_OFFSETS[12], ARECORD_LENGTH[12], "", ENCODING_ASCII );
653
654
655 this.writeAlphaNumeric(
656 Fields.FIELD_A12, this.getHeaderPosition() + ARECORD_OFFSETS[13], ARECORD_LENGTH[13],
657 Character.toString( this.getCurrencyMapper().getDtausCode( header.getCurrency(), header.getCreateDate() ) ),
658 ENCODING_ASCII );
659
660 }
661
662 protected Checksum readChecksum() throws IOException
663 {
664 Long num;
665 final AlphaNumericText27 txt;
666 final Checksum checksum;
667 checksum = new Checksum();
668
669
670 num = this.readNumber(
671 Fields.FIELD_E1, this.getChecksumPosition() + ERECORD_OFFSETS[0], ERECORD_LENGTH[0], ENCODING_ASCII );
672
673 if ( num.longValue() != NO_NUMBER && num.intValue() != this.getBlockSize() )
674 {
675 if ( ThreadLocalMessages.isErrorsEnabled() )
676 {
677 throw new CorruptedException(
678 this.getImplementation(), this.getChecksumPosition() + ERECORD_OFFSETS[0] );
679
680 }
681 else
682 {
683 final Message msg = new IllegalDataMessage(
684 Fields.FIELD_E1, IllegalDataMessage.TYPE_CONSTANT, this.getChecksumPosition() + ERECORD_OFFSETS[0],
685 num.toString() );
686
687 ThreadLocalMessages.getMessages().addMessage( msg );
688 }
689 }
690
691
692 txt = this.readAlphaNumeric(
693 Fields.FIELD_E2, this.getChecksumPosition() + ERECORD_OFFSETS[1], ERECORD_LENGTH[1], ENCODING_ASCII );
694
695 if ( txt != null && ( txt.length() != 1 || txt.charAt( 0 ) != 'E' ) )
696 {
697 if ( ThreadLocalMessages.isErrorsEnabled() )
698 {
699 throw new CorruptedException(
700 this.getImplementation(), this.getChecksumPosition() + ERECORD_OFFSETS[1] );
701
702 }
703 else
704 {
705 final Message msg = new IllegalDataMessage(
706 Fields.FIELD_E2, IllegalDataMessage.TYPE_CONSTANT, this.getChecksumPosition() + ERECORD_OFFSETS[1],
707 txt.format() );
708
709 ThreadLocalMessages.getMessages().addMessage( msg );
710 }
711 }
712
713
714 num = this.readNumber(
715 Fields.FIELD_E4, this.getChecksumPosition() + ERECORD_OFFSETS[3], ERECORD_LENGTH[3], ENCODING_ASCII );
716
717 if ( num.longValue() != NO_NUMBER )
718 {
719 checksum.setTransactionCount( num.intValue() );
720 }
721
722
723 num = this.readNumber(
724 Fields.FIELD_E6, this.getChecksumPosition() + ERECORD_OFFSETS[5], ERECORD_LENGTH[5], ENCODING_ASCII );
725
726 if ( num.longValue() != NO_NUMBER )
727 {
728 checksum.setSumTargetAccount( num.longValue() );
729 }
730
731
732 num = this.readNumber(
733 Fields.FIELD_E7, this.getChecksumPosition() + ERECORD_OFFSETS[6], ERECORD_LENGTH[6], ENCODING_ASCII );
734
735 if ( num.longValue() != NO_NUMBER )
736 {
737 checksum.setSumTargetBank( num.longValue() );
738 }
739
740
741 num = this.readNumber(
742 Fields.FIELD_E8, this.getChecksumPosition() + ERECORD_OFFSETS[7], ERECORD_LENGTH[7], ENCODING_ASCII );
743
744 if ( num.longValue() != NO_NUMBER )
745 {
746 checksum.setSumAmount( num.longValue() );
747 }
748
749 return checksum;
750 }
751
752 protected void writeChecksum( final Checksum checksum ) throws IOException
753 {
754
755 this.writeNumber(
756 Fields.FIELD_E1, this.getChecksumPosition() + ERECORD_OFFSETS[0], ERECORD_LENGTH[0], this.getBlockSize(),
757 ENCODING_ASCII );
758
759
760 this.writeAlphaNumeric(
761 Fields.FIELD_E2, this.getChecksumPosition() + ERECORD_OFFSETS[1], ERECORD_LENGTH[1], "E", ENCODING_ASCII );
762
763
764 this.writeAlphaNumeric(
765 Fields.FIELD_E3, this.getChecksumPosition() + ERECORD_OFFSETS[2], ERECORD_LENGTH[2], "", ENCODING_ASCII );
766
767
768 this.writeNumber(
769 Fields.FIELD_E4, this.getChecksumPosition() + ERECORD_OFFSETS[3], ERECORD_LENGTH[3],
770 checksum.getTransactionCount(), ENCODING_ASCII );
771
772
773 this.writeNumber(
774 Fields.FIELD_E5, this.getChecksumPosition() + ERECORD_OFFSETS[4], ERECORD_LENGTH[4], 0L, ENCODING_ASCII );
775
776
777 this.writeNumber(
778 Fields.FIELD_E6, this.getChecksumPosition() + ERECORD_OFFSETS[5], ERECORD_LENGTH[5],
779 checksum.getSumTargetAccount(), ENCODING_ASCII );
780
781
782 this.writeNumber(
783 Fields.FIELD_E7, this.getChecksumPosition() + ERECORD_OFFSETS[6], ERECORD_LENGTH[6],
784 checksum.getSumTargetBank(), ENCODING_ASCII );
785
786
787 this.writeNumber(
788 Fields.FIELD_E8, this.getChecksumPosition() + ERECORD_OFFSETS[7], ERECORD_LENGTH[7],
789 checksum.getSumAmount(), ENCODING_ASCII );
790
791
792 this.writeAlphaNumeric(
793 Fields.FIELD_E9, this.getChecksumPosition() + ERECORD_OFFSETS[8], ERECORD_LENGTH[8], "", ENCODING_ASCII );
794
795 }
796
797 protected Transaction readTransaction( final long position,
798 final Transaction transaction )
799 throws IOException
800 {
801 Long num;
802 AlphaNumericText27 txt;
803 final List desc = new ArrayList( 14 );
804
805 transaction.setExecutiveExt( null );
806 transaction.setTargetExt( null );
807
808 final long extCount = this.readNumber(
809 Fields.FIELD_C18, position + this.getBlockSize() + CRECORD_OFFSETS2[4], CRECORD_LENGTH2[4],
810 ENCODING_ASCII ).longValue();
811
812 if ( extCount != NO_NUMBER && extCount > this.getMaximumExtensionCount() )
813 {
814 if ( ThreadLocalMessages.isErrorsEnabled() )
815 {
816 throw new CorruptedException( this.getImplementation(),
817 position + this.getBlockSize() + CRECORD_OFFSETS2[4] );
818
819 }
820 else
821 {
822 final Message msg = new IllegalDataMessage(
823 Fields.FIELD_C18, IllegalDataMessage.TYPE_CONSTANT,
824 position + this.getBlockSize() + CRECORD_OFFSETS2[4], Long.toString( extCount ) );
825
826 ThreadLocalMessages.getMessages().addMessage( msg );
827 }
828 }
829
830
831 num = this.readNumber(
832 Fields.FIELD_C1, position + CRECORD_OFFSETS1[0], CRECORD_LENGTH1[0], ENCODING_ASCII );
833
834 if ( num.longValue() != NO_NUMBER && extCount != NO_NUMBER
835 && num.intValue() != CRECORD_CONST_LENGTH + extCount * CRECORD_EXT_LENGTH )
836 {
837 if ( ThreadLocalMessages.isErrorsEnabled() )
838 {
839 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[0] );
840 }
841 else
842 {
843 final Message msg = new IllegalDataMessage(
844 Fields.FIELD_C1, IllegalDataMessage.TYPE_NUMERIC, position + CRECORD_OFFSETS1[0], num.toString() );
845
846 ThreadLocalMessages.getMessages().addMessage( msg );
847 }
848 }
849
850
851 txt = this.readAlphaNumeric(
852 Fields.FIELD_C2, position + CRECORD_OFFSETS1[1], CRECORD_LENGTH1[1], ENCODING_ASCII );
853
854 if ( txt != null && ( txt.length() != 1 || txt.charAt( 0 ) != 'C' ) )
855 {
856 if ( ThreadLocalMessages.isErrorsEnabled() )
857 {
858 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[1] );
859 }
860 else
861 {
862 final Message msg = new IllegalDataMessage(
863 Fields.FIELD_C2, IllegalDataMessage.TYPE_CONSTANT, position + CRECORD_OFFSETS1[1], txt.format() );
864
865 ThreadLocalMessages.getMessages().addMessage( msg );
866 }
867 }
868
869
870 num = this.readNumber( Fields.FIELD_C3, position + CRECORD_OFFSETS1[2], CRECORD_LENGTH1[2], ENCODING_ASCII );
871
872 transaction.setPrimaryBank( null );
873 if ( num.longValue() != NO_NUMBER && num.longValue() != 0L )
874 {
875 if ( !Bankleitzahl.checkBankleitzahl( num ) )
876 {
877 if ( ThreadLocalMessages.isErrorsEnabled() )
878 {
879 throw new CorruptedException(
880 this.getImplementation(), position + CRECORD_OFFSETS1[2] );
881
882 }
883 else
884 {
885 final Message msg = new IllegalDataMessage(
886 Fields.FIELD_C3, IllegalDataMessage.TYPE_BANKLEITZAHL, position + CRECORD_OFFSETS1[2],
887 num.toString() );
888
889 ThreadLocalMessages.getMessages().addMessage( msg );
890 }
891 }
892 else
893 {
894 transaction.setPrimaryBank( Bankleitzahl.valueOf( num ) );
895 }
896 }
897
898
899 num = this.readNumber(
900 Fields.FIELD_C4, position + CRECORD_OFFSETS1[3], CRECORD_LENGTH1[3], ENCODING_ASCII );
901
902 transaction.setTargetBank( null );
903 if ( num.longValue() != NO_NUMBER )
904 {
905 if ( !Bankleitzahl.checkBankleitzahl( num ) )
906 {
907 if ( ThreadLocalMessages.isErrorsEnabled() )
908 {
909 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[3] );
910 }
911 else
912 {
913 final Message msg = new IllegalDataMessage(
914 Fields.FIELD_C4, IllegalDataMessage.TYPE_BANKLEITZAHL, position + CRECORD_OFFSETS1[3],
915 num.toString() );
916
917 ThreadLocalMessages.getMessages().addMessage( msg );
918 }
919 }
920 else
921 {
922 transaction.setTargetBank( Bankleitzahl.valueOf( num ) );
923 }
924 }
925
926
927 num = this.readNumber(
928 Fields.FIELD_C5, position + CRECORD_OFFSETS1[4], CRECORD_LENGTH1[4], ENCODING_ASCII );
929
930 transaction.setTargetAccount( null );
931 if ( num.longValue() != NO_NUMBER )
932 {
933 if ( !Kontonummer.checkKontonummer( num ) )
934 {
935 if ( ThreadLocalMessages.isErrorsEnabled() )
936 {
937 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[4] );
938 }
939 else
940 {
941 final Message msg = new IllegalDataMessage(
942 Fields.FIELD_C5, IllegalDataMessage.TYPE_KONTONUMMER, position + CRECORD_OFFSETS1[4],
943 num.toString() );
944
945 ThreadLocalMessages.getMessages().addMessage( msg );
946 }
947 }
948 else
949 {
950 transaction.setTargetAccount( Kontonummer.valueOf( num ) );
951 }
952 }
953
954
955 num = this.readNumber(
956 Fields.FIELD_C6, position + CRECORD_OFFSETS1[5], CRECORD_LENGTH1[5], ENCODING_ASCII );
957
958 transaction.setReference( null );
959 if ( num.longValue() != NO_NUMBER )
960 {
961 if ( !Referenznummer11.checkReferenznummer11( num ) )
962 {
963 if ( ThreadLocalMessages.isErrorsEnabled() )
964 {
965 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[5] );
966 }
967 else
968 {
969 final Message msg = new IllegalDataMessage(
970 Fields.FIELD_C6, IllegalDataMessage.TYPE_REFERENZNUMMER, position + CRECORD_OFFSETS1[5],
971 num.toString() );
972
973 ThreadLocalMessages.getMessages().addMessage( msg );
974 }
975 }
976 else
977 {
978 transaction.setReference( Referenznummer11.valueOf( num ) );
979 }
980 }
981
982
983 final Long keyType = this.readNumber(
984 Fields.FIELD_C7A, position + CRECORD_OFFSETS1[6], 2, ENCODING_ASCII );
985
986 num = this.readNumber(
987 Fields.FIELD_C7B, position + CRECORD_OFFSETS1[6] + 2, CRECORD_LENGTH1[6] - 2, ENCODING_ASCII );
988
989 transaction.setType( null );
990
991 if ( keyType.longValue() != NO_NUMBER && num.longValue() != NO_NUMBER
992 && this.getHeader().getCreateDate() != null )
993 {
994 final Textschluessel type = this.getTextschluesselVerzeichnis().getTextschluessel(
995 keyType.intValue(), num.intValue(), this.getHeader().getCreateDate() );
996
997 if ( type == null )
998 {
999 if ( ThreadLocalMessages.isErrorsEnabled() )
1000 {
1001 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[6] );
1002 }
1003 else
1004 {
1005 final Message msg = new IllegalDataMessage(
1006 Fields.FIELD_C7A, IllegalDataMessage.TYPE_TEXTSCHLUESSEL, position + CRECORD_OFFSETS1[6],
1007 keyType.toString() + num.toString() );
1008
1009 ThreadLocalMessages.getMessages().addMessage( msg );
1010 }
1011 }
1012 else
1013 {
1014 transaction.setType( type );
1015 }
1016 }
1017
1018
1019 num = this.readNumber( Fields.FIELD_C10, position + CRECORD_OFFSETS1[9], CRECORD_LENGTH1[9], ENCODING_ASCII );
1020
1021 transaction.setExecutiveBank( null );
1022 if ( num.longValue() != NO_NUMBER )
1023 {
1024 if ( !Bankleitzahl.checkBankleitzahl( num ) )
1025 {
1026 if ( ThreadLocalMessages.isErrorsEnabled() )
1027 {
1028 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[9] );
1029 }
1030 else
1031 {
1032 final Message msg = new IllegalDataMessage(
1033 Fields.FIELD_C10, IllegalDataMessage.TYPE_BANKLEITZAHL, position + CRECORD_OFFSETS1[9],
1034 num.toString() );
1035
1036 ThreadLocalMessages.getMessages().addMessage( msg );
1037 }
1038 }
1039 else
1040 {
1041 transaction.setExecutiveBank( Bankleitzahl.valueOf( num ) );
1042 }
1043 }
1044
1045
1046 num = this.readNumber(
1047 Fields.FIELD_C11, position + CRECORD_OFFSETS1[10], CRECORD_LENGTH1[10], ENCODING_ASCII );
1048
1049 transaction.setExecutiveAccount( null );
1050 if ( num.longValue() != NO_NUMBER )
1051 {
1052 if ( !Kontonummer.checkKontonummer( num ) )
1053 {
1054 if ( ThreadLocalMessages.isErrorsEnabled() )
1055 {
1056 throw new CorruptedException( this.getImplementation(), position + CRECORD_OFFSETS1[10] );
1057 }
1058 else
1059 {
1060 final Message msg = new IllegalDataMessage(
1061 Fields.FIELD_C11, IllegalDataMessage.TYPE_KONTONUMMER, position + CRECORD_OFFSETS1[10],
1062 num.toString() );
1063
1064 ThreadLocalMessages.getMessages().addMessage( msg );
1065 }
1066 }
1067 else
1068 {
1069 transaction.setExecutiveAccount( Kontonummer.valueOf( num ) );
1070 }
1071 }
1072
1073
1074 num = this.readNumber(
1075 Fields.FIELD_C12, position + CRECORD_OFFSETS1[11], CRECORD_LENGTH1[11], ENCODING_ASCII );
1076
1077 transaction.setAmount(
1078 num.longValue() == NO_NUMBER
1079 ? null : BigInteger.valueOf( num.longValue() ) );
1080
1081
1082 txt = this.readAlphaNumeric(
1083 Fields.FIELD_C14A, position + CRECORD_OFFSETS1[13], CRECORD_LENGTH1[13], ENCODING_ASCII );
1084
1085 transaction.setTargetName( txt );
1086
1087
1088 txt = this.readAlphaNumeric(
1089 Fields.FIELD_C15, position + this.getBlockSize() + CRECORD_OFFSETS2[0], CRECORD_LENGTH2[0],
1090 ENCODING_ASCII );
1091
1092 transaction.setExecutiveName( txt );
1093
1094
1095 txt = this.readAlphaNumeric(
1096 Fields.FIELD_C16, position + this.getBlockSize() + CRECORD_OFFSETS2[1], CRECORD_LENGTH2[1],
1097 ENCODING_ASCII );
1098
1099 if ( txt != null )
1100 {
1101 desc.add( txt );
1102 }
1103
1104
1105 txt = this.readAlphaNumeric(
1106 Fields.FIELD_C17A, position + this.getBlockSize() + CRECORD_OFFSETS2[2], CRECORD_LENGTH2[2],
1107 ENCODING_ASCII );
1108
1109 transaction.setCurrency( null );
1110
1111 if ( txt != null )
1112 {
1113 if ( txt.length() != 1 )
1114 {
1115 if ( ThreadLocalMessages.isErrorsEnabled() )
1116 {
1117 throw new CorruptedException(
1118 this.getImplementation(), position + this.getBlockSize() + CRECORD_OFFSETS1[10] );
1119
1120 }
1121 else
1122 {
1123 final Message msg = new IllegalDataMessage(
1124 Fields.FIELD_C17A, IllegalDataMessage.TYPE_CURRENCY,
1125 position + this.getBlockSize() + CRECORD_OFFSETS1[10], txt.format() );
1126
1127 ThreadLocalMessages.getMessages().addMessage( msg );
1128 }
1129 }
1130 else if ( this.getHeader().getCreateDate() != null )
1131 {
1132 final char c = txt.charAt( 0 );
1133 final Currency cur = this.getCurrencyMapper().getDtausCurrency( c, this.getHeader().getCreateDate() );
1134
1135 if ( cur == null )
1136 {
1137 if ( ThreadLocalMessages.isErrorsEnabled() )
1138 {
1139 throw new CorruptedException(
1140 this.getImplementation(), position + this.getBlockSize() + CRECORD_OFFSETS1[10] );
1141
1142 }
1143 else
1144 {
1145 final Message msg = new IllegalDataMessage(
1146 Fields.FIELD_C17A, IllegalDataMessage.TYPE_CURRENCY,
1147 position + this.getBlockSize() + CRECORD_OFFSETS1[10], txt.format() );
1148
1149 ThreadLocalMessages.getMessages().addMessage( msg );
1150 }
1151 }
1152
1153 transaction.setCurrency( cur );
1154 }
1155 }
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167 for ( int i = 0; i < extCount && extCount != NO_NUMBER; i++ )
1168 {
1169 final long extPos = position + CRECORD_EXTINDEX_TO_BLOCKOFFSET[i] * this.getBlockSize();
1170
1171 num = this.readNumber(
1172 CRECORD_EXTINDEX_TO_TYPEFIELD[i], extPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[i],
1173 CRECORD_EXTINDEX_TO_TYPELENGTH[i], ENCODING_ASCII );
1174
1175 txt = this.readAlphaNumeric(
1176 CRECORD_EXTINDEX_TO_VALUEFIELD[i], extPos + CRECORD_EXTINDEX_TO_VALUEOFFSET[i],
1177 CRECORD_EXTINDEX_TO_VALUELENGTH[i], ENCODING_ASCII );
1178
1179 if ( num.longValue() == 1L )
1180 {
1181 if ( transaction.getTargetExt() != null )
1182 {
1183 if ( ThreadLocalMessages.isErrorsEnabled() )
1184 {
1185 throw new CorruptedException(
1186 this.getImplementation(), extPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[i] );
1187
1188 }
1189 else
1190 {
1191 final Message msg = new IllegalDataMessage(
1192 CRECORD_EXTINDEX_TO_TYPEFIELD[i], IllegalDataMessage.TYPE_CONSTANT,
1193 extPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[i], num.toString() );
1194
1195 ThreadLocalMessages.getMessages().addMessage( msg );
1196 }
1197 }
1198 else
1199 {
1200 transaction.setTargetExt( txt );
1201 }
1202 }
1203 else if ( num.longValue() == 2L )
1204 {
1205 if ( txt != null )
1206 {
1207 desc.add( txt );
1208 }
1209 }
1210 else if ( num.longValue() == 3L )
1211 {
1212 if ( transaction.getExecutiveExt() != null )
1213 {
1214 if ( ThreadLocalMessages.isErrorsEnabled() )
1215 {
1216 throw new CorruptedException(
1217 this.getImplementation(), extPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[i] );
1218
1219 }
1220 else
1221 {
1222 final Message msg = new IllegalDataMessage(
1223 CRECORD_EXTINDEX_TO_TYPEFIELD[i], IllegalDataMessage.TYPE_CONSTANT,
1224 extPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[i], num.toString() );
1225
1226 ThreadLocalMessages.getMessages().addMessage( msg );
1227 }
1228 }
1229 else
1230 {
1231 transaction.setExecutiveExt( txt );
1232 }
1233 }
1234 else if ( num.longValue() != NO_NUMBER )
1235 {
1236 if ( ThreadLocalMessages.isErrorsEnabled() )
1237 {
1238 throw new CorruptedException(
1239 this.getImplementation(), extPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[i] );
1240
1241 }
1242 else
1243 {
1244 final Message msg = new IllegalDataMessage(
1245 CRECORD_EXTINDEX_TO_TYPEFIELD[i], IllegalDataMessage.TYPE_CONSTANT,
1246 extPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[i], num.toString() );
1247
1248 ThreadLocalMessages.getMessages().addMessage( msg );
1249 }
1250 }
1251 }
1252
1253 transaction.setDescriptions( (AlphaNumericText27[]) desc.toArray( new AlphaNumericText27[ desc.size() ] ) );
1254 return transaction;
1255 }
1256
1257 protected void writeTransaction( final long position, final Transaction transaction ) throws IOException
1258 {
1259 AlphaNumericText27 txt;
1260 final AlphaNumericText27[] desc = transaction.getDescriptions();
1261 final Textschluessel type = transaction.getType();
1262 int extCount = desc.length > 0 ? desc.length - 1 : 0;
1263
1264 if ( transaction.getExecutiveExt() != null )
1265 {
1266 extCount++;
1267 }
1268
1269 if ( transaction.getTargetExt() != null )
1270 {
1271 extCount++;
1272 }
1273
1274
1275 this.writeNumber( Fields.FIELD_C1, position + CRECORD_OFFSETS1[0], CRECORD_LENGTH1[0],
1276 CRECORD_CONST_LENGTH + extCount * CRECORD_EXT_LENGTH, ENCODING_ASCII );
1277
1278
1279 this.writeAlphaNumeric( Fields.FIELD_C2, position + CRECORD_OFFSETS1[1], CRECORD_LENGTH1[1], "C",
1280 ENCODING_ASCII );
1281
1282
1283 this.writeNumber( Fields.FIELD_C3, position + CRECORD_OFFSETS1[2], CRECORD_LENGTH1[2],
1284 transaction.getPrimaryBank() != null ? transaction.getPrimaryBank().intValue() : 0,
1285 ENCODING_ASCII );
1286
1287
1288 this.writeNumber( Fields.FIELD_C4, position + CRECORD_OFFSETS1[3], CRECORD_LENGTH1[3],
1289 transaction.getTargetBank().intValue(), ENCODING_ASCII );
1290
1291
1292 this.writeNumber( Fields.FIELD_C5, position + CRECORD_OFFSETS1[4], CRECORD_LENGTH1[4],
1293 transaction.getTargetAccount().longValue(), ENCODING_ASCII );
1294
1295
1296 this.writeNumber( Fields.FIELD_C6A, position + CRECORD_OFFSETS1[5] - 1, 1, 0L, ENCODING_ASCII );
1297
1298 this.writeNumber( Fields.FIELD_C6, position + CRECORD_OFFSETS1[5], CRECORD_LENGTH1[5],
1299 transaction.getReference() != null ? transaction.getReference().longValue() : 0L,
1300 ENCODING_ASCII );
1301
1302 this.writeNumber( Fields.FIELD_C6C, position + CRECORD_OFFSETS1[6] - 1, 1, 0L, ENCODING_ASCII );
1303
1304
1305
1306 this.writeNumber( Fields.FIELD_C7A, position + CRECORD_OFFSETS1[6], CRECORD_LENGTH1[6] - 3, type.getKey(),
1307 ENCODING_ASCII );
1308
1309 this.writeNumber( Fields.FIELD_C7B, position + CRECORD_OFFSETS1[6] + 2, CRECORD_LENGTH1[6] - 2,
1310 type.getExtension(), ENCODING_ASCII );
1311
1312
1313 this.writeAlphaNumeric( Fields.FIELD_C8, position + CRECORD_OFFSETS1[7], CRECORD_LENGTH1[7], "",
1314 ENCODING_ASCII );
1315
1316
1317 this.writeNumber( Fields.FIELD_C9, position + CRECORD_OFFSETS1[8], CRECORD_LENGTH1[8], 0L, ENCODING_ASCII );
1318
1319
1320 this.writeNumber( Fields.FIELD_C10, position + CRECORD_OFFSETS1[9], CRECORD_LENGTH1[9],
1321 transaction.getExecutiveBank().intValue(), ENCODING_ASCII );
1322
1323
1324 this.writeNumber( Fields.FIELD_C11, position + CRECORD_OFFSETS1[10], CRECORD_LENGTH1[10],
1325 transaction.getExecutiveAccount().longValue(), ENCODING_ASCII );
1326
1327
1328 this.writeNumber( Fields.FIELD_C12, position + CRECORD_OFFSETS1[11], CRECORD_LENGTH1[11],
1329 transaction.getAmount().longValue(), ENCODING_ASCII );
1330
1331
1332 this.writeAlphaNumeric( Fields.FIELD_C13, position + CRECORD_OFFSETS1[12], CRECORD_LENGTH1[12], "",
1333 ENCODING_ASCII );
1334
1335
1336 this.writeAlphaNumeric( Fields.FIELD_C14A, position + CRECORD_OFFSETS1[13], CRECORD_LENGTH1[13],
1337 transaction.getTargetName().format(), ENCODING_ASCII );
1338
1339
1340 this.writeAlphaNumeric( Fields.FIELD_C14B, position + CRECORD_OFFSETS1[14], CRECORD_LENGTH1[14], "",
1341 ENCODING_ASCII );
1342
1343
1344 this.writeAlphaNumeric( Fields.FIELD_C15, position + this.getBlockSize() + CRECORD_OFFSETS2[0],
1345 CRECORD_LENGTH2[0], transaction.getExecutiveName().format(), ENCODING_ASCII );
1346
1347
1348 this.writeAlphaNumeric( Fields.FIELD_C16, position + this.getBlockSize() + CRECORD_OFFSETS2[1],
1349 CRECORD_LENGTH2[1], desc.length > 0 ? desc[0].format() : "", ENCODING_ASCII );
1350
1351
1352 this.writeAlphaNumeric(
1353 Fields.FIELD_C17A, position + this.getBlockSize() + CRECORD_OFFSETS2[2],
1354 CRECORD_LENGTH2[2], Character.toString( this.getCurrencyMapper().getDtausCode(
1355 transaction.getCurrency(), this.getHeader().getCreateDate() ) ), ENCODING_ASCII );
1356
1357
1358 this.writeAlphaNumeric( Fields.FIELD_C17B, position + this.getBlockSize() + CRECORD_OFFSETS2[3],
1359 CRECORD_LENGTH2[3], "", ENCODING_ASCII );
1360
1361
1362 this.writeNumber( Fields.FIELD_C18, position + this.getBlockSize() + CRECORD_OFFSETS2[4],
1363 CRECORD_LENGTH2[4], extCount, ENCODING_ASCII );
1364
1365
1366 this.initializeExtensionBlock( position + this.getBlockSize(), 1 );
1367
1368
1369 int extIndex = 0;
1370 int blockOffset = CRECORD_EXTINDEX_TO_BLOCKOFFSET[extIndex];
1371 int lastBlockOffset = blockOffset;
1372 long blockPos = position + blockOffset * this.getBlockSize();
1373
1374
1375 if ( ( txt = transaction.getTargetExt() ) != null )
1376 {
1377 this.writeNumber(
1378 CRECORD_EXTINDEX_TO_TYPEFIELD[extIndex], blockPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[extIndex],
1379 CRECORD_EXTINDEX_TO_TYPELENGTH[extIndex], 1L, ENCODING_ASCII );
1380
1381 this.writeAlphaNumeric(
1382 CRECORD_EXTINDEX_TO_VALUEFIELD[extIndex], blockPos + CRECORD_EXTINDEX_TO_VALUEOFFSET[extIndex],
1383 CRECORD_EXTINDEX_TO_VALUELENGTH[extIndex], txt.format(), ENCODING_ASCII );
1384
1385 extIndex++;
1386 }
1387
1388
1389 for ( int i = 1; i < desc.length; i++, extIndex++ )
1390 {
1391 blockOffset = CRECORD_EXTINDEX_TO_BLOCKOFFSET[extIndex];
1392 blockPos = position + blockOffset * this.getBlockSize();
1393
1394 if ( blockOffset != lastBlockOffset )
1395 {
1396
1397 this.initializeExtensionBlock( blockPos, blockOffset );
1398 }
1399
1400 this.writeNumber( CRECORD_EXTINDEX_TO_TYPEFIELD[extIndex],
1401 blockPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[extIndex],
1402 CRECORD_EXTINDEX_TO_TYPELENGTH[extIndex], 2L, ENCODING_ASCII );
1403
1404 this.writeAlphaNumeric( CRECORD_EXTINDEX_TO_VALUEFIELD[extIndex],
1405 blockPos + CRECORD_EXTINDEX_TO_VALUEOFFSET[extIndex],
1406 CRECORD_EXTINDEX_TO_VALUELENGTH[extIndex], desc[i].format(), ENCODING_ASCII );
1407
1408 lastBlockOffset = blockOffset;
1409 }
1410
1411
1412 if ( ( txt = transaction.getExecutiveExt() ) != null )
1413 {
1414 blockOffset = CRECORD_EXTINDEX_TO_BLOCKOFFSET[extIndex];
1415 blockPos = position + blockOffset * this.getBlockSize();
1416
1417 if ( blockOffset != lastBlockOffset )
1418 {
1419
1420 this.initializeExtensionBlock( blockPos, blockOffset );
1421 }
1422
1423 this.writeNumber(
1424 CRECORD_EXTINDEX_TO_TYPEFIELD[extIndex], blockPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[extIndex],
1425 CRECORD_EXTINDEX_TO_TYPELENGTH[extIndex], 3L, ENCODING_ASCII );
1426
1427 this.writeAlphaNumeric(
1428 CRECORD_EXTINDEX_TO_VALUEFIELD[extIndex], blockPos + CRECORD_EXTINDEX_TO_VALUEOFFSET[extIndex],
1429 CRECORD_EXTINDEX_TO_VALUELENGTH[extIndex], txt.format(), ENCODING_ASCII );
1430
1431 extIndex++;
1432 lastBlockOffset = blockOffset;
1433 }
1434 }
1435
1436 protected int byteCount( final Transaction transaction )
1437 {
1438 int extCount = transaction.getDescriptions().length > 0 ? transaction.getDescriptions().length - 1 : 0;
1439
1440 if ( transaction.getExecutiveExt() != null )
1441 {
1442 extCount++;
1443 }
1444 if ( transaction.getTargetExt() != null )
1445 {
1446 extCount++;
1447 }
1448
1449 return CRECORD_EXTENSIONCOUNT_TO_BLOCKCOUNT[extCount] * this.getBlockSize();
1450 }
1451
1452 protected int getBlockSize()
1453 {
1454 return PhysicalFileFactory.FORMAT_DISK;
1455 }
1456
1457 private void initializeExtensionBlock( final long blockPos, final int blockOffset ) throws IOException
1458 {
1459 int extIndex;
1460 int startingExt;
1461 int endingExt;
1462 int reservedField;
1463 int reservedOffset;
1464 int reservedLength;
1465
1466 if ( blockOffset == 1 )
1467 {
1468 startingExt = 0;
1469 endingExt = 1;
1470 reservedField = Fields.FIELD_C23;
1471 reservedOffset = CRECORD_OFFSETS2[9];
1472 reservedLength = CRECORD_LENGTH2[9];
1473 }
1474 else if ( blockOffset == 2 )
1475 {
1476 startingExt = 2;
1477 endingExt = 5;
1478 reservedField = Fields.FIELD_C32;
1479 reservedOffset = CRECORD_OFFSETS_EXT[8];
1480 reservedLength = CRECORD_LENGTH_EXT[8];
1481 }
1482 else if ( blockOffset == 3 )
1483 {
1484 startingExt = 6;
1485 endingExt = 9;
1486 reservedField = Fields.FIELD_C41;
1487 reservedOffset = CRECORD_OFFSETS_EXT[8];
1488 reservedLength = CRECORD_LENGTH_EXT[8];
1489 }
1490 else if ( blockOffset == 4 )
1491 {
1492 startingExt = 10;
1493 endingExt = 13;
1494 reservedField = Fields.FIELD_C50;
1495 reservedOffset = CRECORD_OFFSETS_EXT[8];
1496 reservedLength = CRECORD_LENGTH_EXT[8];
1497 }
1498 else if ( blockOffset == 5 )
1499 {
1500 startingExt = 14;
1501 endingExt = 17;
1502 reservedField = Fields.FIELD_C59;
1503 reservedOffset = CRECORD_OFFSETS_EXT[8];
1504 reservedLength = CRECORD_LENGTH_EXT[8];
1505 }
1506 else
1507 {
1508 throw new IllegalArgumentException( Integer.toString( blockOffset ) );
1509 }
1510
1511
1512 for ( extIndex = startingExt; extIndex <= endingExt; extIndex++ )
1513 {
1514 this.writeNumber(
1515 CRECORD_EXTINDEX_TO_TYPEFIELD[extIndex], blockPos + CRECORD_EXTINDEX_TO_TYPEOFFSET[extIndex],
1516 CRECORD_EXTINDEX_TO_TYPELENGTH[extIndex], 0L, ENCODING_ASCII );
1517
1518 this.writeAlphaNumeric(
1519 CRECORD_EXTINDEX_TO_VALUEFIELD[extIndex], blockPos + CRECORD_EXTINDEX_TO_VALUEOFFSET[extIndex],
1520 CRECORD_EXTINDEX_TO_VALUELENGTH[extIndex], "", ENCODING_ASCII );
1521
1522 }
1523
1524
1525 this.writeAlphaNumeric( reservedField, blockPos + reservedOffset, reservedLength, "", ENCODING_ASCII );
1526 }
1527
1528 protected Implementation getImplementation()
1529 {
1530 return ModelFactory.getModel().getModules().
1531 getImplementation( DTAUSDisk.class.getName() );
1532
1533 }
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545 protected Logger getLogger()
1546 {
1547 return (Logger) ContainerFactory.getContainer().
1548 getDependency( this, "Logger" );
1549
1550 }
1551
1552
1553
1554
1555 }