summaryrefslogblamecommitdiffstats
path: root/src/org/uic/ticket/api/UicRailTicketCoder.java
blob: 022152679de3eb0f3e66aae5359115a6d3ad499a (plain) (tree)










































































































































































                                                                                                                                                         
/*
 * 
 */
package org.uic.ticket.api;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.uic.ticket.api.asn.omv1.UicRailTicketData;
import org.uic.ticket.api.spec.IUicRailTicket;
import org.uic.ticket.api.utils.Api2OpenAsnEncoder;
import org.uic.ticket.api.utils.OpenAsn2ApiDecoder;


/**
 * The Class UicRailTicketCoder.
 */
public class UicRailTicketCoder {


	/**
	 * encode an UicRailTicket to asn.1 format using PER unaligned encoding 
	 *
	 * @param outputStream the output stream for the encoded data
	 * @param uicRailTicket the uic rail ticket to be encoded
	 * @param version version of the asn1 specification
	 * @throws IOException signals that an I/O exception has occurred.
	 * @throws EncodingFormatException signals that a format rule of the asn.1 specification was violated. 
	 */
	public byte[] encodeTag(IUicRailTicket uicRailTicket, int version) throws IOException, EncodingFormatException {
		
				
	    byte[] content = encode(uicRailTicket, version);
			
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		
		String idTag = "U_FLEX"; 
		String versionId = "01";
		int length = 8;
			
		//size of data
		length = length + content.length;
		
		//size of length element
		length = length + 4;  		
		String lengthElement = String.format("%04d",length);		
		
		outputStream.write(idTag.getBytes());
		outputStream.write(versionId.getBytes());
		outputStream.write(lengthElement.getBytes());	
			
		outputStream.write(content);					
					
		return outputStream.toByteArray();
	
}
	


	
	/**
	 * encode an UicRailTicket to asn.1 format using PER unaligned encoding 
	 *
	 * @param outputStream the output stream for the encoded data
	 * @param uicRailTicket the uic rail ticket to be encoded
	 * @param version of the asn1 specification
	 * @throws IOException signals that an I/O exception has occurred.
	 * @throws EncodingFormatException signals that a format rule of the asn.1 specification was violated. 
	 */
	public byte[] encode (IUicRailTicket uicRailTicket, int version) throws IOException, EncodingFormatException{
			
		if (version != 1) {
			throw new EncodingFormatException(String.format("Encoding version %d not supported", version));
		}
		
		Api2OpenAsnEncoder uicEncoder = new Api2OpenAsnEncoder(); 		
		
		UicRailTicketData asnUicRailTicketData = uicEncoder.populateToAsn1Model(uicRailTicket);
		
		return asnUicRailTicketData.encode();

	}	
	

	/**
	 * encode an UicRailTicket to asn.1 format using PER unaligned encoding 
	 *
	 * @param outputStream the output stream for the encoded data
	 * @param uicRailTicket the uic rail ticket to be encoded
	 * @param version of the asn1 specification
	 * @throws IOException signals that an I/O exception has occurred.
	 * @throws EncodingFormatException signals that a format rule of the asn.1 specification was violated. 
	 */
	public void encode ( ByteArrayOutputStream outputStream, IUicRailTicket uicRailTicket, int version) throws IOException, EncodingFormatException{
			
		if (version != 1) {
			throw new EncodingFormatException(String.format("Encoding version %d not supported", version));
		}
		
		Api2OpenAsnEncoder uicEncoder = new Api2OpenAsnEncoder(); 		
		
		UicRailTicketData asnUicRailTicketData = uicEncoder.populateToAsn1Model(uicRailTicket);
		
		outputStream.write(asnUicRailTicketData.encode());
		
		return;

	}	
	
	/**
	 * Decode a rail ticket from asn.1 unaligned PER encoded data. 
	 *
	 * @param byteData the asn.1 PER encoded byte data 
	 * @return the decoded uic rail ticket
	 * @throws IOException signals that an I/O exception has occurred.
	 * @throws EncodingFormatException 
	 */
	public IUicRailTicket decodeFromAsn (byte[] byteData, int version) throws IOException, EncodingFormatException{
		
		if (version != 1) {
			throw new EncodingFormatException(String.format("Encoding version %d not supported", version));
		}
		
		UicRailTicketData asnUicRailTicketData = UicRailTicketData.decode(byteData);
			
		OpenAsn2ApiDecoder uicDecoder = new OpenAsn2ApiDecoder();
			
		IUicRailTicket uicRailTicket = uicDecoder.decodeFromAsn(asnUicRailTicketData);
		
		return uicRailTicket;				

	}	
	
	
	/**
	 * Decode a rail ticket from asn.1 unaligned PER encoded data. 
	 * @param version of the asn1 specification
	 * @param input stream of the asn.1 PER encoded data 
	 * @return the decoded uic rail ticket
	 * @throws IOException signals that an I/O exception has occurred.
	 * @throws EncodingFormatException 
	 */
	public IUicRailTicket decodeFromAsn (InputStream input, int version) throws IOException, EncodingFormatException{
		
		if (version != 1) {
			throw new EncodingFormatException(String.format("Encoding version %d not supported", version));
		}
			
		ByteArrayOutputStream buffer = new ByteArrayOutputStream();

		int nRead;
		byte[] data = new byte[16384];

		while ((nRead = input.read(data, 0, data.length)) != -1) {
		  buffer.write(data, 0, nRead);
		}

		buffer.flush();

		byte[] byteData = buffer.toByteArray();
		
		return decodeFromAsn (byteData, version);
			

	}		

	


}