|
|
/*
*
*/
package org.uic.barcode.ticket;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.uic.barcode.ticket.api.spec.IUicRailTicket;
import org.uic.barcode.ticket.api.utils.Api2OpenAsnEncoder;
import org.uic.barcode.ticket.api.utils.Api2OpenAsnEncoderV2;
import org.uic.barcode.ticket.api.utils.Api2OpenAsnEncoderV3;
import org.uic.barcode.ticket.api.utils.OpenAsn2ApiDecoder;
import org.uic.barcode.ticket.api.utils.OpenAsn2ApiDecoderV2;
import org.uic.barcode.ticket.api.utils.OpenAsn2ApiDecoderV3;
/**
* 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 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 == 13) {
Api2OpenAsnEncoder uicEncoder = new Api2OpenAsnEncoder();
return uicEncoder.encode(uicRailTicket);
} else if (version == 2) {
Api2OpenAsnEncoderV2 uicEncoder = new Api2OpenAsnEncoderV2();
return uicEncoder.encode(uicRailTicket);
} else if (version == 3) {
Api2OpenAsnEncoderV3 uicEncoder = new Api2OpenAsnEncoderV3();
return uicEncoder.encode(uicRailTicket);
}
throw new EncodingFormatException(String.format("Encoding version %d not supported", version));
}
/**
* 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 == 13) {
Api2OpenAsnEncoder uicEncoder = new Api2OpenAsnEncoder();
org.uic.barcode.ticket.api.asn.omv1.UicRailTicketData asnUicRailTicketData = uicEncoder.populateToAsn1Model(uicRailTicket);
outputStream.write(asnUicRailTicketData.encode());
return;
} else if (version == 2) {
Api2OpenAsnEncoderV2 uicEncoder = new Api2OpenAsnEncoderV2();
org.uic.barcode.ticket.api.asn.omv2.UicRailTicketData asnUicRailTicketData = uicEncoder.populateToAsn1Model(uicRailTicket);
outputStream.write(asnUicRailTicketData.encode());
return;
} else if (version == 3) {
Api2OpenAsnEncoderV3 uicEncoder = new Api2OpenAsnEncoderV3();
org.uic.barcode.ticket.api.asn.omv3.UicRailTicketData asnUicRailTicketData = uicEncoder.populateToAsn1Model(uicRailTicket);
outputStream.write(asnUicRailTicketData.encode());
return;
}
throw new EncodingFormatException(String.format("Encoding version %d not supported", version));
}
/**
* 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 || version == 13) {
OpenAsn2ApiDecoder uicDecoder = new OpenAsn2ApiDecoder();
IUicRailTicket uicRailTicket = uicDecoder.decodeFromAsn(byteData);
return uicRailTicket;
} else if (version == 2) {
OpenAsn2ApiDecoderV2 uicDecoder = new OpenAsn2ApiDecoderV2();
IUicRailTicket uicRailTicket = uicDecoder.decodeFromAsn(byteData);
return uicRailTicket;
} else if (version == 3) {
OpenAsn2ApiDecoderV3 uicDecoder = new OpenAsn2ApiDecoderV3();
IUicRailTicket uicRailTicket = uicDecoder.decodeFromAsn(byteData);
return uicRailTicket;
}
throw new EncodingFormatException(String.format("Encoding version %d not supported", version));
}
/**
* 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 && version != 2 && version != 13 && version != 3) {
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);
}
}
|