Sample EDI Program

import	com.americancoders.edi.*;
import	com.americancoders.edi.x12.*;
import	java.util.*;
import	java.text.*;
import	java.io.*;

public class AccountEDI {

	private static final int	BLANK_FILL = 0;
	private static final int	ZERO_FILL = 1;
	private static final int	LEFT_JUSTIFY = 0;
	private static final int	RIGHT_JUSTIFY = 1;
	private static final int	DATA_LENGTH = 0;
	private static final int	MIN_LENGTH = 1;
	private static final int	MAX_LENGTH = 2;
	private static final String	accountNum = "GMT100000009999";
	private static final String	fromID = "1111111111111";
	private static final String	toID = "2222222222222";

	public static void main( String args[] ) {
		String	fullDate;
		String	transDate;
		String	transTime;
		Segment	seg = null;
		Segment	detail = null;
		Segment	names = null;
		Segment	qty = null;
		Table	tbl = null;
		String	inputFileName;
		String	interchangeControlNumber;
		String	functionalGroupControlNumber;
		String	transactionSetControlNumber;
		DataElement	elem = null;
		Date	date = new Date();
		SimpleDateFormat	fmt;
		BufferedReader		br = null;
		StringTokenizer		st;
		String	lineIn = null;
		String	token = null;
		String	cmd = null;
		int	lineNum = 0;
		int	count = 0;
		int	segs = 0;

		/*
		 * get the date and time in the correct format
		 */

		fmt = new SimpleDateFormat( "yyyyMMdd" );
		fullDate = fmt.format( date );
		transDate = fullDate.substring( 2 );
		fmt = new SimpleDateFormat( "HHmmss" );
		transTime = fmt.format( date );

		/*
		 * ensure correct usage
		 */

		if( args.length != 4 ) {
			System.err.println( "Usage: AccountEDI filename " +
			  "ic# gc# tc#" );
			System.exit( 12 );
		}
		inputFileName = args[0];
		interchangeControlNumber = args[1];
		functionalGroupControlNumber = args[2];
		transactionSetControlNumber = args[3];

		/*
		 * open the specified input file
		 */

		try {
			br = new BufferedReader( new FileReader(
			  inputFileName ) );
		}
		catch( Exception e ) {
			System.err.println( "AccountEDI: open(" + inputFileName
			  + "): " + e.toString() );
			System.exit( 12 );
		}

		/*
		 * create a new envelope
		 */

		X12Envelope	env = new X12Envelope();

		/*
		 * build the ISA header
		 */

		seg = Interchange_Control_Header.getInstance();
		setElement( seg.getDataElement( 0 ), "0", ZERO_FILL, 0,
		  MIN_LENGTH );
		setElement( seg.getDataElement( 1 ), " ", BLANK_FILL, 0,
		  MIN_LENGTH );
		setElement( seg.getDataElement( 2 ), "0", ZERO_FILL, 0,
		  MIN_LENGTH );
		setElement( seg.getDataElement( 3 ), " ", BLANK_FILL, 0,
		  MIN_LENGTH );
		setElement( seg.getDataElement( 4 ), "1", ZERO_FILL,
		  RIGHT_JUSTIFY, MIN_LENGTH );
		setElement( seg.getDataElement( 5 ), fromID,
		  BLANK_FILL, 0, MIN_LENGTH );
		setElement( seg.getDataElement( 6 ), "1", ZERO_FILL,
		  RIGHT_JUSTIFY, MIN_LENGTH );
		setElement( seg.getDataElement( 7 ), toID,
		  BLANK_FILL, 0, MIN_LENGTH );
		setElement( seg.getDataElement( 8 ), transDate, 0, 0, 0 );
		setElement( seg.getDataElement( 9 ), transTime, 0, 0, 0 );
		setElement( seg.getDataElement( 10 ), "U", 0, 0, 0 );
		setElement( seg.getDataElement( 11 ), "200", ZERO_FILL, 
		  RIGHT_JUSTIFY, MIN_LENGTH );
		setElement( seg.getDataElement( 12 ), interchangeControlNumber,
		  ZERO_FILL, RIGHT_JUSTIFY, MIN_LENGTH );
		setElement( seg.getDataElement( 13 ), "0", 0, 0, 0 );
		setElement( seg.getDataElement( 14 ), "T", 0, 0, 0 );
		setElement( seg.getDataElement( 15 ), ":", 0, 0, 0 );
		env.setInterchange_Header( seg );

		env.setInProcess();

		/*
		 * create a new functional group
		 */

		FunctionalGroup	fg = null;
		try {
			fg = X12FunctionalGroup.getInstance();
		}
		catch( Exception e ) {
			e.printStackTrace();
			System.exit( 12 );
		}

		/*
		 * build the group header
		 */

		seg = fg.getHeader();
		setElement( seg.getDataElement( 0 ), "PT", 0, 0, 0 );
		setElement( seg.getDataElement( 1 ), fromID, 0, 0, 0 );
		setElement( seg.getDataElement( 2 ), toID, 0, 0, 0 );
		setElement( seg.getDataElement( 3 ), transDate, 0, 0, 0 );
		setElement( seg.getDataElement( 4 ), transTime, 0, 0, 0 );
		seg.getDataElement( 5 ).setMinLength( 1 );
		setElement( seg.getDataElement( 5 ),
		  functionalGroupControlNumber, 0, 0, DATA_LENGTH );
		setElement( seg.getDataElement( 6 ), "T", 0, 0, 0 );
		setElement( seg.getDataElement( 7 ), "004010", 0, 0, 0 );

		/*
		 * create a new transaction set
		 */

		TransactionSet	ts = null;
		try {
			ts = TransactionSetFactory.buildTransactionSet( "867" );
		}
		catch( Exception e ) {
			e.printStackTrace();
		}

		/*
		 * build the header table
		 */

		tbl = ts.getHeaderTable();
		seg = tbl.createSegment( "ST" );
		segs++;
		elem = (DataElement) seg.buildDE( 0 );
		elem.set( "867" );
		seg.addDataElement( elem );
		elem = (DataElement) seg.buildDE( 1 );
		setElement( elem, transactionSetControlNumber, ZERO_FILL,
		  RIGHT_JUSTIFY, MIN_LENGTH );
		seg.addDataElement( elem );
		tbl.addSegment( seg );

		/*
		 * build the beginning segment
		 */

		seg = tbl.createSegment( "BPT" );
		segs++;
		elem = (DataElement) seg.buildDE( 0 );
		elem.set( "08" );
		seg.addDataElement( elem );
		elem = (DataElement) seg.buildDE( 2 );
		elem.set( fullDate );
		seg.addDataElement( elem );
		tbl.addSegment( seg );

		/*
		 * build the reference
		 */

		seg = tbl.createSegment( "REF" );
		segs++;
		elem = (DataElement) seg.buildDE( 0 );
		elem.set( "VR" );
		seg.addDataElement( elem );
		elem = (DataElement) seg.buildDE( 1 );
		elem.set( accountNum );
		seg.addDataElement( elem );
		tbl.addSegment( seg );

		/*
		 * build the detail table
		 */

		tbl = ts.getDetailTable();
		for(;;) {
			try {
				lineIn = br.readLine();
			}
			catch( IOException e ) {
				System.err.println( "AccountEDI: read(" +
				  inputFileName + "): " + e.toString() );
				break;
			}
			if( lineIn == null )
				break;
			lineNum++;
			st = new StringTokenizer( lineIn, "\t" );
			token = st.nextToken();
			if( token.equals( "create" ) )
				cmd = "DS";
			else if( token.equals( "delete" ) )
				cmd = "SC";
			else if( token.equals( "modify" ) )
				cmd = "BK";
			else {
				System.err.println( "AccountEDI: " + token +
				  ": invalid operation in line " + lineNum );
				continue;
			}
			count++;
			detail = tbl.createSegment( "PTD" );
			segs++;
			elem = (DataElement) detail.buildDE( 0 );
			elem.set( cmd );
			detail.addDataElement( elem );
			seg = detail.createSegment( "DTM" );
			segs++;
			elem = (DataElement) seg.buildDE( 0 );
			elem.set( "771" );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 1 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			detail.addSegment( seg );
			seg = detail.createSegment( "REF" );
			segs++;
			elem = (DataElement) seg.buildDE( 0 );
			elem.set( "11" );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 2 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			detail.addSegment( seg );
			seg = detail.createSegment( "REF" );
			segs++;
			elem = (DataElement) seg.buildDE( 0 );
			elem.set( "U5" );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 2 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			detail.addSegment( seg );
			names = detail.createSegment( "N1" );
			segs++;
			elem = (DataElement) names.buildDE( 0 );
			elem.set( "53" );
			names.addDataElement( elem );
			elem = (DataElement) names.buildDE( 1 );
			elem.set( st.nextToken() );
			names.addDataElement( elem );
			elem = (DataElement) names.buildDE( 2 );
			elem.set( "12" );
			names.addDataElement( elem );
			elem = (DataElement) names.buildDE( 3 );
			token = dequote( st.nextToken() );
			elem.set( token );
			names.addDataElement( elem );
			seg = names.createSegment( "N3" );
			segs++;
			elem = (DataElement) seg.buildDE( 0 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			token = dequote( st.nextToken() );
			if( token.length() > 0 ) {
				elem = (DataElement) seg.buildDE( 1 );
				elem.set( token );
				seg.addDataElement( elem );
			}
			names.addSegment( seg );
			seg = names.createSegment( "N4" );
			segs++;
			elem = (DataElement) seg.buildDE( 0 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 1 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 2 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 3 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			names.addSegment( seg );
			seg = names.createSegment( "PER" );
			segs++;
			elem = (DataElement) seg.buildDE( 0 );
			elem.set( "CW" );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 2 );
			elem.set( "EM" );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 3 );
			token = dequote( st.nextToken() );
			elem.set( token );
			seg.addDataElement( elem );
			names.addSegment( seg );
			detail.addSegment( names );
			names = detail.createSegment( "N1" );
			segs++;
			elem = (DataElement) names.buildDE( 0 );
			elem.set( "BB" );
			names.addDataElement( elem );
			elem = (DataElement) names.buildDE( 1 );
			elem.set( st.nextToken() );
			names.addDataElement( elem );
			detail.addSegment( names );
			names = detail.createSegment( "N1" );
			segs++;
			elem = (DataElement) names.buildDE( 0 );
			elem.set( "DS" );
			names.addDataElement( elem );
			elem = (DataElement) names.buildDE( 1 );
			token = dequote( st.nextToken() );
			elem.set( token );
			names.addDataElement( elem );
			elem = (DataElement) names.buildDE( 2 );
			elem.set( "MI" );
			names.addDataElement( elem );
			elem = (DataElement) names.buildDE( 3 );
			elem.set( st.nextToken() );
			names.addDataElement( elem );
			detail.addSegment( names );
			qty = detail.createSegment( "QTY" );
			segs++;
			elem = (DataElement) qty.buildDE( 0 );
			elem.set( "01" );
			qty.addDataElement( elem );
			elem = (DataElement) qty.buildDE( 1 );
			elem.set( "1" );
			qty.addDataElement( elem );
			seg = qty.createSegment( "REF" );
			segs++;
			elem = (DataElement) seg.buildDE( 0 );
			elem.set( "44" );
			seg.addDataElement( elem );
			elem = (DataElement) seg.buildDE( 1 );
			elem.set( st.nextToken() );
			seg.addDataElement( elem );
			qty.addSegment( seg );
			detail.addSegment( qty );
			tbl.addSegment( detail );
		}
		try {
			br.close();
		}
		catch( IOException e ) {
		}

		/*
		 * build the summary table
		 */

		tbl = ts.getSummaryTable();
		seg = tbl.createSegment( "CTT" );
		segs++;
		elem = (DataElement) seg.buildDE( 0 );
		elem.set( String.valueOf( count ) );
		seg.addDataElement( elem );
		tbl.addSegment( seg );
		seg = tbl.createSegment( "SE" );
		segs++;
		elem = (DataElement) seg.buildDE( 0 );
		elem.set( String.valueOf( segs ) );
		seg.addDataElement( elem );
		elem = (DataElement) seg.buildDE( 1 );
		setElement( elem, transactionSetControlNumber, ZERO_FILL,
		  RIGHT_JUSTIFY, MIN_LENGTH );
		seg.addDataElement( elem );
		tbl.addSegment( seg );

		/*
		 * add the transaction set to the functional group
		 */

		if( ts != null )
			fg.addTransactionSet( ts );

		/*
		 * add the functional group to the envelope
		 */

		env.addFunctionalGroup( fg );

		/*
		 * build the group trailer
		 */

		seg = fg.getTrailer();
		setElement( seg.getDataElement( 0 ), "1", 0, 0, DATA_LENGTH );
		seg.getDataElement( 1 ).setMinLength(
		  functionalGroupControlNumber.length() );
		setElement( seg.getDataElement( 1 ),
		  functionalGroupControlNumber, 0, 0, DATA_LENGTH );

		/*
		 * build the interchange trailer
		 */

		seg = Interchange_Control_Trailer.getInstance();
		setElement( seg.getDataElement( 0 ), "1", 0, 0, DATA_LENGTH );
		setElement( seg.getDataElement( 1 ), interchangeControlNumber,
		  ZERO_FILL, RIGHT_JUSTIFY, MIN_LENGTH );
		env.setInterchange_Trailer( seg );

		/*
		 * generate the output
		 */

		System.out.print( env.getFormattedText( Envelope.X12_FORMAT ) );
	}

	private static void setElement( DataElement elem, String contents,
	  int fill, int justify, int length ) {
		int	bufLen = 0;
		switch( length ) {
		case MIN_LENGTH:
			bufLen = elem.getMinLength();
			break;
		case MAX_LENGTH:
			bufLen = elem.getMaxLength();
			break;
		default:
			bufLen = contents.length();
			elem.set( new String( contents ) );
			return;
		}
		if( contents.length() > bufLen ) {
			if( justify == RIGHT_JUSTIFY )
				elem.set( contents.substring(
				  bufLen - contents.length() ) );
			else
				elem.set( contents.substring( 0, bufLen ) );
			return;
		}
		StringBuffer	sb = new StringBuffer( bufLen );
		sb.append( contents );
		while( sb.length() < bufLen ) {
			if( justify == RIGHT_JUSTIFY )
				sb.insert( 0, ( fill == ZERO_FILL ) ? '0' :
				  ' ' );
			else
				sb.append( ( fill == ZERO_FILL ) ? '0' : ' ' );
		}
		elem.set( sb.toString() );
	}

	private static String dequote( String string ) {
		if( ( string.charAt( 0 ) == '\'' ) ||
		  ( string.charAt( 0 ) == '"' ) )
			return( string.substring( 1, string.length() - 1 ) );
		return( string );
	}
}