package com.digertech.sdk.samples;

import java.io.File;
import java.io.RandomAccessFile;

import com.digertech.sdk.reader.*;
import com.digertech.sdk.records.*;
import com.digertech.sdk.records.x9100.*;
import com.digertech.sdk.records.x937.*;
import com.digertech.sdk.writer.DTFileWriter;

/**
* This sample writes ICL records to an ICL file.
* 
* To run this sample, a jar file in the lib folder should 
* be included in the classpath:
*   FileProcessingSDK.jar
*   
* Execute the commmand to run the sample :
*  java com.digertech.sdk.samples.SampleICLFileWriter [ICL file] [license key]
*           [ICL file]    - ICL file full path name.
*           [license key] - File processing SDK license key.
*/
public class SampleICLFileWriter {
	
	private long bundleAmount     = 0;
	private long cashLeterAmount  = 0;
	private long fileAmount       = 0;
	
	private int  bundleItem       = 0;
	private int  cashLeterItem    = 0;
	private int  fileItem         = 0;

	private int  bundleImage      = 0;
	private int  cashLeterImage   = 0;

	private int  bundleCount      = 0;
	private int  cashLetterCount  = 0;
	private int  recordCount      = 0;
	
	private boolean forward       = true;
	
	public SampleICLFileWriter() {
		super();
	}
	
	public void writeRecords(File file, int format, boolean forward) throws FileIOException {
		DTFileWriter writer = null;
		byte[] imageData    = null;
		int    imageSize    = 0;
		
		this.forward = forward;
		
		try {
			writer = new DTFileWriter(file);
			
			// all records should be written to the file in order
			// the SDK will not validate the order of the records.
			
			writer.writeRecord(getType01Record(format));
			System.out.println("Write Type 01 record.");
			
				writer.writeRecord(getType10Record(format));
				System.out.println("Write Type 10 record.");
					writer.writeRecord(getType20Record(format));
					System.out.println("Write Type 20 record.");
					if (forward) {
						writer.writeRecord(getType25Record(format));
						System.out.println("Write Type 25 record.");
							writer.writeRecord(getType26Record(format));
							System.out.println("Write Type 26 record.");
							writer.writeRecord(getType27Record(format));
							System.out.println("Write Type 27 record.");
							writer.writeRecord(getType28Record(format));
							System.out.println("Write Type 28 record.");
					} else {
						writer.writeRecord(getType31Record(format));
						System.out.println("Write Type 31 record.");
							writer.writeRecord(getType32Record(format));
							System.out.println("Write Type 32 record.");
							writer.writeRecord(getType33Record(format));
							System.out.println("Write Type 33 record.");
							writer.writeRecord(getType34Record(format));
							System.out.println("Write Type 34 record.");
							writer.writeRecord(getType35Record(format));
							System.out.println("Write Type 35 record.");
					}
							imageData = getImageData(true);
							imageSize = imageData == null ? 0 : imageData.length;
							writer.writeRecord(getType50Record(format, imageSize, true));
							System.out.println("Write Type 50 record.");
							writer.writeRecord(getType52Record(format, imageData));
							System.out.println("Write Type 52 record.");
							writer.writeRecord(getType54Record(format));
							System.out.println("Write Type 54 record.");

							imageData = getImageData(false);
							imageSize = imageData == null ? 0 : imageData.length;
							writer.writeRecord(getType50Record(format, imageSize, false));
							System.out.println("Write Type 50 record.");
							writer.writeRecord(getType52Record(format, imageData));
							System.out.println("Write Type 52 record.");
							writer.writeRecord(getType54Record(format));
							System.out.println("Write Type 54 record.");
					writer.writeRecord(getType70Record(format));
					System.out.println("Write Type 70 record.");
				writer.writeRecord(getType90Record(format));
				System.out.println("Write Type 90 record.");
			writer.writeRecord(getType99Record(format));
			System.out.println("Write Type 99 record.");
		} catch (RecordException ex) {
			throw new FileIOException(ex.toString());
		} catch (Exception ex) {
			throw new FileIOException(ex.toString());
		} finally {
			if (writer != null) {
				writer.close();
				System.out.println("File is closed.");
			}
		}
	}
	
	private byte[] getImageData(boolean front) {
		byte[] imageData = null;
		RandomAccessFile raf = null;

		try {
			if (front) {
				raf = new RandomAccessFile("images/front.tif", "r");
			} else {
				raf = new RandomAccessFile("images/back.tif", "r");
			}
			imageData = new byte[(int)raf.length()];
			raf.read(imageData);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (raf != null) {
				try {
					raf.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		
		return imageData; 
	}
	
	private X9Record getType01Record(int format) throws RecordException {
		this.fileAmount = 0;
		this.fileItem = 0;
		this.cashLetterCount = 0;
		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type01Record t01 = new X9100Type01Record(RecordDefines.X9100_180);

			t01.setStandardLevel("20"); 
			t01.setTestFileInd("P");  
			t01.setDestRoutingNum("123456789");    
			t01.setOriginRoutingNum("987654321"); 
			t01.setFileCreateDate("20090805");  
			t01.setFileCreateTime("0828"); 
			t01.setResendInd("N");     
			t01.setDestName("Destation Bank");      
			t01.setOriginName("Origin Bank");      
			t01.setFileIdModifier(""); 
			t01.setCountryCode("");  
			t01.setUserField("");      
			t01.setReserved("");     
			
			return t01;
		} else {
			X937Type01Record t01 = new X937Type01Record(RecordDefines.X937_2003);
			
			t01.setStandardLevel("03"); 
			t01.setTestFileInd("P");  
			t01.setDestRoutingNum("123456789");    
			t01.setOriginRoutingNum("987654321"); 
			t01.setFileCreateDate("20090805");  
			t01.setFileCreateTime("0828"); 
			t01.setResendInd("N");     
			t01.setDestName("Destation Bank");      
			t01.setOriginName("Origin Bank");      
			t01.setFileIdModifier(""); 
			t01.setCountryCode("");  
			t01.setUserField("");      
			t01.setReserved("");     
			
			return t01;
		}
	}
	
	private X9Record getType10Record(int format) throws RecordException {
		
		this.cashLeterAmount = 0;
		this.cashLeterImage = 0;
		this.cashLeterItem = 0;
		this.bundleCount = 0;
		this.cashLetterCount ++;
		this.recordCount++;
		
		if (format == RecordDefines.X9100_180) {
			X9100Type10Record t10 = new X9100Type10Record(RecordDefines.X9100_180);
			
			t10.setCollectionTypeInd(this.forward ? "01" : "03");
			t10.setDestRoutingNum("123456789");
			t10.setInstitutionRoutingNum("987654321");
			t10.setBusinessDate("20090805");
			t10.setCreateDate("20090805");
			t10.setCreateTime("0828");
			t10.setRecordTypeInd("F");
			t10.setDocTypeInd("C");
			t10.setCashletterID("21153223");
			t10.setOrigContactName("");
			t10.setOrigContactPhone("");
			t10.setFedWorkType("");
			t10.setUserField("");
			
			return t10;
		} else {
			X937Type10Record t10 = new X937Type10Record(RecordDefines.X937_2003);
			
			t10.setCollectionTypeInd("01");
			t10.setDestRoutingNum("123456789");
			t10.setInstitutionRoutingNum("987654321");
			t10.setBusinessDate("20090805");
			t10.setCreateDate("20090805");
			t10.setCreateTime("0828");
			t10.setRecordTypeInd("F");
			t10.setDocTypeInd("C");
			t10.setCashletterID("21153223");
			t10.setOrigContactName("");
			t10.setOrigContactPhone("");
			t10.setFedWorkType("");
			t10.setUserField("");
			t10.setReserved("");
			
			return t10;
		}
	}

	private X9Record getType20Record(int format) throws RecordException {
	
		this.bundleAmount = 0;
		this.bundleImage = 0;
		this.bundleItem = 0;
		this.bundleCount++;
		this.recordCount++;
		
		if (format == RecordDefines.X9100_180) {
			X9100Type20Record t20 = new X9100Type20Record(RecordDefines.X9100_180);
			
			t20.setCollectionTypeInd(this.forward ? "01" : "03");
			t20.setDestRoutingNum("123456789");
			t20.setInstitutionRoutingNum("987654321");
			t20.setBusinessDate("20090805");
			t20.setCreateDate("20090805");
			t20.setBundleID("0000100400");
			t20.setBundleSeqNum("0001");
			t20.setCycleNum("02");
			t20.setReturnRoutingNum("100000010");
			t20.setBundleCreateTime("0829");
			t20.setUserField("");
			t20.setReserved("");
			
			return t20;
		} else {
			X937Type20Record t20 = new X937Type20Record(RecordDefines.X937_2003);
			
			t20.setCollectionTypeInd("01");
			t20.setDestRoutingNum("123456789");
			t20.setInstitutionRoutingNum("987654321");
			t20.setBusinessDate("20090805");
			t20.setCreateDate("20090805");
			t20.setBundleID("0000100400");
			t20.setBundleSeqNum("0001");
			t20.setCycleNum("02");
			t20.setReturnRoutingNum("100000010");
			t20.setUserField("");
			t20.setReserved("");
			
			return t20;
		}
	}

	private X9Record getType25Record(int format) throws RecordException {

		this.recordCount++;
		this.bundleAmount += 19800;
		this.cashLeterAmount += 19800;
		this.fileAmount += 19800;
		this.bundleItem++;
		this.cashLeterItem++;
		this.fileItem++;
		
		if (format == RecordDefines.X9100_180) {
			X9100Type25Record t25 = new X9100Type25Record(RecordDefines.X9100_180);

			t25.setAuxOnUs("         100008");
			t25.setExtProcCode("");
			t25.setRoutingNum("123456789");
			t25.setOnUsField("        98989898618/");
			t25.setAmount(19800);
			t25.setItemSeqNum("000002800012001");
			t25.setDocTypeInd("C");
			t25.setRetAcceptInd("6");
			t25.setMicrValidInd("");
			t25.setBofdInd("U");
			t25.setAddendumCount(3);
			t25.setCorrectionInd("");
			t25.setArchiveTypeInd("");
			
			return t25;
		} else {
			X937Type25Record t25 = new X937Type25Record(RecordDefines.X937_2003);

			t25.setAuxOnUs("         100008");
			t25.setExtProcCode("");
			t25.setRoutingNum("12345678");
			t25.setRoutingNumCheckDigit("9");
			t25.setOnUsField("        98989898618/");
			t25.setAmount(19800);
			t25.setItemSeqNum("000002800012001");
			t25.setDocTypeInd("C");
			t25.setRetAcceptInd("6");
			t25.setMicrValidInd("");
			t25.setBofdInd("U");
			t25.setAddendumCount(3);
			t25.setCorrectionInd("");
			t25.setArchiveTypeInd("");
			
			return t25;
		}
	}

	private X9Record getType26Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type26Record t26 = new X9100Type26Record(RecordDefines.X9100_180);

			t26.setAddendumNum("1");
			t26.setBofdRoutingNum("987654321");
			t26.setBofdBusinessDate("20090805");
			t26.setBofdItemSeqNum("000002800012001");
			t26.setBofdDepositAccountNum("");
			t26.setBofdDepositBranch("");
			t26.setPayeeName("");
			t26.setTruncationInd("Y");
			t26.setBofdConversionInd("2");
			t26.setBofdCorrectionInd("0");
			t26.setMagneticReadInd("3");
			t26.setUserField("");
			t26.setReserved("");
			
			return t26;
		} else {
			X937Type26Record t26 = new X937Type26Record(RecordDefines.X937_2003);

			t26.setAddendumNum("1");
			t26.setBofdRoutingNum("987654321");
			t26.setBofdBusinessDate("20090805");
			t26.setBofdItemSeqNum("000002800012001");
			t26.setBofdDepositAccountNum("");
			t26.setBofdDepositBranch("");
			t26.setPayeeName("");
			t26.setTruncationInd("Y");
			t26.setBofdConversionInd("2");
			t26.setBofdCorrectionInd("0");
			t26.setUserField("");
			t26.setReserved("");
			
			return t26;
		}
	}

	private X9Record getType27Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type27Record t27 = new X9100Type27Record(RecordDefines.X9100_180);

			t27.setDescription("Description");
			t27.setImgCaptureDate("20090805");
			t27.setImgCaptureTime("0806");
			t27.setMicroArchiveSeqNum("0123456");
			
			t27.setImgArchiveLocatorLen(34);
			t27.setCapturedUnparsedMICRDataLen(27);
			t27.setCapturedHighUnparsedMICRDataLen(28);
			t27.setCorrectedUnparsedMICRDataLen(29);
			t27.setCorrectedHighUnparsedMICRDataLen(30);
			t27.setUserDataLen(31);
			
			t27.setReserved("");
			
			t27.setImgArchiveLocator("Image Archive Locator");
			t27.setCapturedUnparsedMICRData("capturedUnparsedMICRData");
			t27.setCapturedHighUnparsedMICRData("capturedHighUnparsedMICRData");
			t27.setCorrectedUnparsedMICRData("correctedUnparsedMICRData");
			t27.setCorrectedHighUnparsedMICRData("correctedHighUnparsedMICRData");
			t27.setUserField("UserField");
			
			return t27;
		} else {
			X937Type27Record t27 = new X937Type27Record(RecordDefines.X937_2003);

			t27.setVarRecordInd("0");
			t27.setMicroArchiveSeqNum("0123456");
			t27.setImgArchiveLocatorLen(34);
			t27.setImgArchiveLocator("Image Archive Locator");
			t27.setDescription("Description");
			t27.setUserField("UserField");
			t27.setReserved("");
			
			return t27;
		}
	}

	private X9Record getType28Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type28Record t28 = new X9100Type28Record(RecordDefines.X9100_180);

			t28.setAddendumRecordNum("01");
			t28.setRoutingNum("987654321");
			t28.setEndorsingDate("20090805");
			t28.setItemSeqNum("000002800012001");
			t28.setTruncationInd("N");
			t28.setConversionInd("2");
			t28.setCorrectionInd("0");
			t28.setReturnReason("");
			t28.setMagneticReadInd("3");
			t28.setBankId("0");
			t28.setDepositAccount("0123456789");
			t28.setUserField("");
			t28.setReserved("");
			
			return t28;
		} else {
			X937Type28Record t28 = new X937Type28Record(RecordDefines.X937_2003);

			t28.setAddendumRecordNum("01");
			t28.setRoutingNum("987654321");
			t28.setEndorsingDate("20090805");
			t28.setItemSeqNum("000002800012001");
			t28.setTruncationInd("N");
			t28.setConversionInd("2");
			t28.setCorrectionInd("0");
			t28.setReturnReason("");
			t28.setUserField("");
			t28.setReserved("");
			
			return t28;
		}
	}

	private X9Record getType31Record(int format) throws RecordException {

		this.recordCount++;
		this.bundleAmount += 19800;
		this.cashLeterAmount += 19800;
		this.fileAmount += 19800;
		this.bundleItem++;
		this.cashLeterItem++;
		this.fileItem++;
		
		if (format == RecordDefines.X9100_180) {
			X9100Type31Record t31 = new X9100Type31Record(RecordDefines.X9100_180);

			t31.setAuxOnUs("         100008");
			t31.setExtProcCode("");
			t31.setRoutingNum("123456789");
			t31.setOnUs("        98989898618/");
			t31.setAmount(19800);
			t31.setItemSeqNum("000002800012001");
			t31.setAddendumCount(4);
			t31.setReserved("");
			
			return t31;
		} else {
			X937Type31Record t31 = new X937Type31Record(RecordDefines.X937_2003);

			t31.setRoutingNum("12345678");
			t31.setRoutingNumCheckDigit("9");
			t31.setOnUs("        98989898618/");
			t31.setAmount(19800);
			t31.setReturnReason("W");
			t31.setAddendumCount(4);
			t31.setDocTypeInd("C");
			t31.setForwardBundleDate("20090801");
			t31.setItemSeqNum("000002800012001");
			t31.setExtProcCode("");
			t31.setNotificationInd("2");
			t31.setArchiveTypeInd("");
			t31.setReserved("");
			
			return t31;
		}
	}

	private X9Record getType32Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type32Record t32 = new X9100Type32Record(RecordDefines.X9100_180);

			t32.setAddendumNum("1");
			t32.setBofdRoutingNum("987654321");
			t32.setBofdBusinessDate("20090805");
			t32.setBofdItemSeqNum("000002800012001");
			t32.setBofdDepositAccountNum("");
			t32.setBofdDepositBranch("");
			t32.setPayeeName("");
			t32.setTruncationInd("Y");
			t32.setBofdConversionInd("2");
			t32.setBofdCorrectionInd("0");
			t32.setMagneticReadInd("3");
			t32.setUserField("");
			t32.setReserved("");
			
			return t32;
		} else {
			X937Type32Record t32 = new X937Type32Record(RecordDefines.X937_2003);

			t32.setAddendumNum("1");
			t32.setBofdRoutingNum("987654321");
			t32.setBofdBusinessDate("20090805");
			t32.setBofdItemSeqNum("000002800012001");
			t32.setBofdDepositAccountNum("");
			t32.setBofdDepositBranch("");
			t32.setPayeeName("");
			t32.setTruncationInd("Y");
			t32.setBofdConversionInd("2");
			t32.setBofdCorrectionInd("0");
			t32.setUserField("");
			t32.setReserved("");
			
			return t32;
		}
	}

	private X9Record getType33Record(int format) throws RecordException {

		this.recordCount++;
		
		if (format == RecordDefines.X9100_180) {
			X9100Type33Record t33 = new X9100Type33Record(RecordDefines.X9100_180);

			t33.setReturnReason("W");
			t33.setForwardBundleDate("20090801");
			t33.setAdditionalReturnReason("U");
			t33.setNumReturned("0");
			t33.setRetDocTypeInd("C");
			t33.setArchiveTypeInd("");
			t33.setPayorBankName("Payor Bank Name");
			t33.setPayBankItemSeqNum("000002800012001");
			t33.setPayBankBusinessDate("20090805");
			t33.setPayAccountName("Pay Account Name");
			
			return t33;
		} else {
			X937Type33Record t33 = new X937Type33Record(RecordDefines.X937_2003);

			t33.setPayorBankName("Payor Bank Name");
			t33.setAuxOnUs("         100008");
			t33.setPayBankItemSeqNum("000002800012001");
			t33.setPayBankBusinessDate("20090805");
			t33.setPayAccountName("Pay Account Name");
			
			return t33;
		}
	}


	private X9Record getType34Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type34Record t34 = new X9100Type34Record(RecordDefines.X9100_180);

			t34.setDescription("Description");
			t34.setImgCaptureDate("20090805");
			t34.setImgCaptureTime("0806");
			t34.setMicroArchiveSeqNum("0123456");
			
			t34.setImgArchiveLocatorLen(34);
			t34.setCapturedUnparsedMICRDataLen(27);
			t34.setCapturedHighUnparsedMICRDataLen(28);
			t34.setCorrectedUnparsedMICRDataLen(29);
			t34.setCorrectedHighUnparsedMICRDataLen(30);
			t34.setUserDataLen(31);
			
			t34.setReserved("");
			
			t34.setImgArchiveLocator("Image Archive Locator");
			t34.setCapturedUnparsedMICRData("capturedUnparsedMICRData");
			t34.setCapturedHighUnparsedMICRData("capturedHighUnparsedMICRData");
			t34.setCorrectedUnparsedMICRData("correctedUnparsedMICRData");
			t34.setCorrectedHighUnparsedMICRData("correctedHighUnparsedMICRData");
			t34.setUserField("UserField");
			
			return t34;
		} else {
			X937Type34Record t34 = new X937Type34Record(RecordDefines.X937_2003);

			t34.setVarRecordInd("0");
			t34.setMicroArchiveSeqNum("0123456");
			t34.setImgArchiveLocatorLen(34);
			t34.setImgArchiveLocator("Image Archive Locator");
			t34.setDescription("Description");
			t34.setUserField("UserField");
			t34.setReserved("");
			
			return t34;
		}
	}

	private X9Record getType35Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type35Record t35 = new X9100Type35Record(RecordDefines.X9100_180);

			t35.setAddendumRecordNum("01");
			t35.setRoutingNum("987654321");
			t35.setEndorsingDate("20090805");
			t35.setItemSeqNum("000002800012001");
			t35.setTruncationInd("N");
			t35.setConversionInd("2");
			t35.setCorrectionInd("0");
			t35.setReturnReason("");
			t35.setMagneticReadInd("3");
			t35.setBankId("0");
			t35.setDepositAccount("0123456789");
			t35.setUserField("");
			t35.setReserved("");
			
			return t35;
		} else {
			X937Type35Record t35 = new X937Type35Record(RecordDefines.X937_2003);

			t35.setAddendumRecordNum("01");
			t35.setRoutingNum("987654321");
			t35.setEndorsingDate("20090805");
			t35.setItemSeqNum("000002800012001");
			t35.setTruncationInd("N");
			t35.setConversionInd("2");
			t35.setCorrectionInd("0");
			t35.setReturnReason("");
			t35.setUserField("");
			t35.setReserved("");
			
			return t35;
		}
	}

	private X9Record getType40Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type40Record t40 = new X9100Type40Record(RecordDefines.X9100_180);

			t40.setDestRoutingNum("987654321");
			t40.setLowAccount("0123456789");
			t40.setHighAccount("9876543210");
			t40.setTotalItemCount(1);
			t40.setTotalItemAmount(19800);
			t40.setUserField("");
			t40.setReserved("");
			
			return t40;
		} else {
			X937Type40Record t40 = new X937Type40Record(RecordDefines.X937_2003);

			t40.setDestRoutingNum("987654321");
			t40.setLowAccount("0123456789");
			t40.setHighAccount("9876543210");
			t40.setTotalItemCount(1);
			t40.setTotalItemAmount(19800);
			t40.setUserField("");
			t40.setReserved("");
			
			return t40;
		}
	}

	private X9Record getType41Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type41Record t41 = new X9100Type41Record(RecordDefines.X9100_180);

			t41.setDestRoutingNum("987654321");
			t41.setNonHitInd("O");
			t41.setTotalItemCount(1);
			t41.setTotalItemAmount(19800);
			t41.setUserField("");
			t41.setReserved("");
			
			return t41;
		} else {
			X937Type41Record t41 = new X937Type41Record(RecordDefines.X937_2003);

			t41.setDestRoutingNum("987654321");
			t41.setNonHitInd("O");
			t41.setTotalItemCount(1);
			t41.setTotalItemAmount(19800);
			t41.setUserField("");
			t41.setReserved("");
			
			return t41;
		}
	}

	private X9Record getType50Record(int format, long imageSize, boolean front) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type50Record t50 = new X9100Type50Record(RecordDefines.X9100_180);

			t50.setImageInd("1");
			t50.setRoutingNum("987654321");
			t50.setCreateDate("20090805");
			t50.setViewFormatInd("00");
			t50.setViewCompression("00");
			t50.setViewType("0");
			t50.setViewSideInd(front ? "0" : "1");
			t50.setViewDescriptor("00");
			t50.setDigSignInd("0");
			t50.setDigSignHashFuncMethod("");
			t50.setDigSignCryptAlgrMethod("");
			t50.setDsaKeySize("0000000000");
			t50.setDigCertfInd("0");
			t50.setDigCertfFormat("");
			t50.setDigCertfConvMethod("");
			t50.setProtectedDataStart("0000000");
			t50.setProtectedDatatLen("0000000");
			t50.setImgRecreateInd("1");
			t50.setImgTestOverrideInd("0");
			t50.setImgCaptureTime("0806");
			t50.setUserField("");
			t50.setReserved("");
			
			return t50;
		} else {
			X937Type50Record t50 = new X937Type50Record(RecordDefines.X937_2003);

			t50.setImageInd("1");
			t50.setRoutingNum("987654321");
			t50.setCreateDate("20090805");
			t50.setViewFormatInd("00");
			t50.setViewCompression("00");
			t50.setViewDataSize(String.valueOf(imageSize));
			t50.setViewSideInd(front ? "0" : "1");
			t50.setViewDescriptor("00");
			t50.setDigSignInd("0");
			t50.setDigSignMethod("00");
			t50.setSecurityKeySize("00000");
			t50.setProtectedDataStart("0000000");
			t50.setProtectedDatatLen("0000000");
			t50.setImgRecreateInd("1");
			t50.setUserField("");
			t50.setReserved("");
			
			return t50;
		}
	}

	private X9Record getType52Record(int format, byte[] imageData) throws RecordException {
		
		this.recordCount++;
		this.bundleImage++;
		this.cashLeterImage++;

		if (format == RecordDefines.X9100_180) {
			X9100Type52Record t52 = new X9100Type52Record(RecordDefines.X9100_180);

			t52.setRoutingNum("987654321");
			t52.setBusinessDate("20090805");
			t52.setCycleNum("02");
			t52.setItemSeqNum("000002800012001");
			
			t52.setSecurityOrigName("");
			t52.setSecurityAuthName("");
			t52.setSecurityKeyName("");
			
			t52.setClippingOrigin("0");
			t52.setClippingCoordinateH1("");
			t52.setClippingCoordinateH2("");
			t52.setClippingCoordinateV1("");
			t52.setClippingCoordinateV2("");
			
			t52.setAncillaryDataInd("0");
			
			t52.setImageRefKeyLen(12);
			t52.setImageRefKey("012345678901");
			
			t52.setDigSigLen(0);
			t52.setDigSig(null);
			
			t52.setDigCertfIssuerDistNameLen(18);
			t52.setDigCertfIssuerDistName("digCertfIssuerDistName");
			
			t52.setDigCertfSerialNumLen(19);
			t52.setDigCertfSerialNum("digCertfSerialNum");
			
			t52.setDigCertfLen(0);
			t52.setDigCertf(null);
			
			if (imageData == null || imageData.length == 0) {
				t52.setImageDataLen(0);
				t52.setImageData(null);
			} else {
				t52.setImageDataLen(imageData.length);
				t52.setImageData(imageData);
			}
			
			t52.setAncillaryDataLen(0);
			t52.setAncillaryData(null);
			
			return t52;
		} else {
			X937Type52Record t52 = new X937Type52Record(RecordDefines.X937_2003);

			t52.setRoutingNum("987654321");
			t52.setBusinessDate("20090805");
			t52.setCycleNum("02");
			t52.setItemSeqNum("000002800012001");
			t52.setSecurityOrigName("");
			t52.setSecurityAuthName("");
			t52.setSecurityKeyName("");
			t52.setClippingOrigin("0");
			t52.setClippingCoordinateH1("");
			t52.setClippingCoordinateH2("");
			t52.setClippingCoordinateV1("");
			t52.setClippingCoordinateV2("");
			t52.setImageRefKeyLen(12);
			t52.setImageRefKey("012345678901");
			t52.setDigSigLen(0);
			t52.setDigSig(null);
			if (imageData == null || imageData.length == 0) {
				t52.setImageDataLen(0);
				t52.setImageData(null);
			} else {
				t52.setImageDataLen(imageData.length);
				t52.setImageData(imageData);
			}
			
			return t52;
		}
	}

	private X9Record getType54Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type54Record t54 = new X9100Type54Record(RecordDefines.X9100_180);

			t54.setGlobalImageQuality("0");
			t54.setGlobalImageUsability("0");
			t54.setImageBankSpecificTest("0");
			t54.setPartialImage("0");
			t54.setExcessImageSkew("0");
			t54.setPiggybackImage("0");
			t54.setTooLight("0");
			t54.setTooDark("0");
			t54.setStreakBands("0");
			t54.setBelowMinImageSize("0");
			t54.setExceedMaxImageSize("0");
			t54.setReserved12_24("");

			t54.setImageEnabledPod("0");
			t54.setSourceDocBad("0");
			t54.setDateUsability("0");
			t54.setPayeeUsability("0");
			t54.setConvenientAmountUsability("0");
			t54.setAmountWordsUsability("0");
			t54.setSignatureUsability("0");
			t54.setPayorNameAddressUsability("0");
			t54.setMicrLineUsability("0");
			t54.setMemoLineUsability("0");
			t54.setPayorBankNameAddressUsability("0");
			t54.setPayeeEndorsementUsability("0");
			t54.setBofdEndorsementUsability("0");
			t54.setTransitEndorsementUsability("0");
			t54.setReserved39_44("");

			t54.setUserField("");
			t54.setReserved("");
			
			return t54;
		} else {
			X937Type54Record t54 = new X937Type54Record(RecordDefines.X937_2003);

			t54.setGlobalImageQuality("0");
			t54.setGlobalImageUsability("0");
			t54.setImageBankSpecificTest("0");
			t54.setPartialImage("0");
			t54.setExcessImageSkew("0");
			t54.setPiggybackImage("0");
			t54.setTooLightOrDark("0");
			t54.setStreakBands("0");
			t54.setBelowMinImageSize("0");
			t54.setExceedMaxImageSize("0");
			t54.setReserved12_24("0000000000000");

			t54.setImageEnabledPod("0");
			t54.setSourceDocBad("0");
			t54.setDateUsability("0");
			t54.setPayeeUsability("0");
			t54.setConvenientAmountUsability("0");
			t54.setAmountWordsUsability("0");
			t54.setSignatureUsability("0");
			t54.setPayorNameAddressUsability("0");
			t54.setMicrLineUsability("0");
			t54.setMemoLineUsability("0");
			t54.setPayorBankNameAddressUsability("0");
			t54.setPayeeEndorsementUsability("0");
			t54.setBofdEndorsementUsability("0");
			t54.setTransitEndorsementUsability("0");
			t54.setReserved39_44("000000");

			t54.setUserField("");
			t54.setReserved("");
			
			return t54;
		}
	}

	private X9Record getType70Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type70Record t70 = new X9100Type70Record(RecordDefines.X9100_180);

			t70.setItemCount(this.bundleItem);
			t70.setTotalAmount(this.bundleAmount);
			t70.setMicrTotalAmount(0);
			t70.setImageCount(this.bundleImage);
			t70.setCreditTotalAmount(0);
			t70.setCreditItemCount(0);
			t70.setUserField("");
			t70.setReserved("");
			
			return t70;
		} else {
			X937Type70Record t70 = new X937Type70Record(RecordDefines.X937_2003);

			t70.setItemCount(this.bundleItem);
			t70.setTotalAmount(this.bundleAmount);
			t70.setMicrTotalAmount(0);
			t70.setImageCount(this.bundleImage);
			t70.setUserField("");
			t70.setReserved("");
			
			return t70;
		}
	}

	private X9Record getType75Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type75Record t75 = new X9100Type75Record(RecordDefines.X9100_180);

			t75.setDestRoutingNum("987654321");
			t75.setSeqNum("001");
			t75.setBundleCount(1);
			t75.setNumberId("00000001");
			t75.setTotalAmount(this.bundleAmount);
			t75.setTotalCreditAmount(0);
			t75.setReserved("");
			
			return t75;
		} else {
			X937Type75Record t75 = new X937Type75Record(RecordDefines.X937_2003);

			t75.setDestRoutingNum("987654321");
			t75.setSeqNum("001");
			t75.setBundleCount(1);
			t75.setNumberId("00000001");
			t75.setTotalAmount(this.bundleAmount);
			t75.setReserved("");
			
			return t75;
		}
	}

	private X9Record getType85Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type85Record t85 = new X9100Type85Record(RecordDefines.X9100_180);

			t85.setRoutingNum("987654321");
			t85.setTotalAmount(this.bundleAmount);
			t85.setItemCount(this.bundleItem);
			t85.setCreditTotalAmount(0);
			t85.setUserField("");
			t85.setReserved("");
			
			return t85;
		} else {
			X937Type85Record t85 = new X937Type85Record(RecordDefines.X937_2003);

			t85.setRoutingNum("987654321");
			t85.setTotalAmount(this.bundleAmount);
			t85.setItemCount(this.bundleItem);
			t85.setUserField("");
			t85.setReserved("");
			
			return t85;
		}
	}

	private X9Record getType90Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type90Record t90 = new X9100Type90Record(RecordDefines.X9100_180);
		
			t90.setBundleCount(this.bundleCount);
			t90.setItemCount(this.cashLeterItem);
			t90.setTotalAmount(this.cashLeterAmount);
			t90.setImageCount(this.cashLeterImage);
			t90.setInstitutionName("");
			t90.setSettlementDate("");
			t90.setCreditItemCount(0);
			t90.setCreditTotalAmount(0);
			
			return t90;
		} else {
			X937Type90Record t90 = new X937Type90Record(RecordDefines.X937_2003);
		
			t90.setBundleCount(this.bundleCount);
			t90.setItemCount(this.cashLeterItem);
			t90.setTotalAmount(this.cashLeterAmount);
			t90.setImageCount(this.cashLeterImage);
			t90.setInstitutionName("");
			t90.setSettlementDate("");
			t90.setReserved("");
			
			return t90;
		}
	}

	private X9Record getType99Record(int format) throws RecordException {

		this.recordCount++;

		if (format == RecordDefines.X9100_180) {
			X9100Type99Record t99 = new X9100Type99Record(RecordDefines.X9100_180);

			t99.setCashletterCount(this.cashLetterCount);
			t99.setTotalRecordCount(this.recordCount);
			t99.setTotalItemCount(this.fileItem);
			t99.setTotalAmount(this.fileAmount);
			t99.setContactName("");
			t99.setContactPhone("");
			t99.setCreditTotalAmount(0);
			
			return t99;
		} else {
			X937Type99Record t99 = new X937Type99Record(RecordDefines.X937_2003);

			t99.setCashletterCount(this.cashLetterCount);
			t99.setTotalRecordCount(this.recordCount);
			t99.setTotalItemCount(this.fileItem);
			t99.setTotalAmount(this.fileAmount);
			t99.setContactName("");
			t99.setContactPhone("");
			t99.setReserved("");
			
			return t99;
		}
	}
	
	public static void setLicenseKey() {
		// The license key contains 25 chars. You will recieve the license key after you
		// purchase the SDK product.
		String licenseKey = "XXXXXXXXXXXXXXXXXXXXXXXXX";

		setLicenseKey(licenseKey);
	}
	public static void setLicenseKey(String licenseKey) {
		System.out.println("***********************************************");
		System.out.println("*  DigerTech Inc. ICL File Writer SDK Sample  *");
		System.out.println("*                                             *");
		System.out.println("*               Version : " + FPLicenseInfo.VERSION + "               *");
		System.out.println("***********************************************");
		System.out.println("                                              ");

		// Make sure the license key is set to the SDK before it starts to process files.
		// Set the license key only one time when the JVM starts.
		
		// If the license key is valid, SDK will return the valid product id of the license.
		// othwise the productId is free version
		int productId = DTFileWriter.setLicenseKey(licenseKey);
		
		if (productId == DTFileWriter.SDK_FILE_WRITER_DEVELOPER) {
			System.out.println("This is a Developer version SDK license. SDK can process file less than 500 items.");
		} else if (productId == DTFileWriter.SDK_FILE_WRITER_ENTERPRISE_I) {
			System.out.println("This is an Enterprise I version SDK license. SDK can process file less than 10000 items.");
		} else if (productId == DTFileWriter.SDK_FILE_WRITER_ENTERPRISE_II) {
			System.out.println("This is an Enterprise II version SDK license. SDK can process file unlimited items.");
 		} else {
			System.out.println("This is a free version SDK license. SDK can process file less than 10 items.");
		}
		
		FPLicenseInfo fpLicenseInfo = DTFileWriter.getLicenseInfo();
		System.out.println("------------------------- ");
		System.out.println("Computer Id             = " + fpLicenseInfo.getComputerId());
		System.out.println("Product Id              = " + fpLicenseInfo.getProductId());
		System.out.println("Version                 = " + fpLicenseInfo.getVersion());
		System.out.println("Permanent               = " + fpLicenseInfo.isPermanent());
		System.out.println("Expired                 = " + fpLicenseInfo.isExpired());
		System.out.println("Maintiance Expired Date = " + fpLicenseInfo.getMaintainanceDate());
		System.out.println("------------------------- ");
	}

	
	public static void main(String args[]) {
		if (args == null || args.length < 1) {
			System.out.println(new StringBuffer().append("Usage:  \n") 
				  .append("java com.digertech.sdk.samples.SampleICLFileWriter [ICL file] [license key]\n")
				  .append("              [ICL file]    - ICL file with full path name.\n")
				  .append("              [license key] - File processing SDK license key.\n")
				  .toString());
		} else {
			// Set the SDK license key before we process any files.
			// If it is better to set SDK license key when the JVM starts.
			if (args.length == 2) {
				setLicenseKey(args[1]);
			} else {
				setLicenseKey();
			}
			
			File                 file          = new File(args[0]);
			SampleICLFileWriter  writer        = new SampleICLFileWriter();
			
			try {
				// Call the writeRecords method in this sample class
				// to create and write ICL records to the file.
				writer.writeRecords(file, RecordDefines.X937_2003, true);
//				writer.writeRecords(file, RecordDefines.X9100_180, false);
				
			} catch (FileIOException e) {
				System.out.println("Error writing ICL file. " + e.toString());
			}
			
		}
	}

}
