From 5ef4ad89630e4c51dcd7093e78d71eeda0be727d Mon Sep 17 00:00:00 2001 From: CGantert345 <57003061+CGantert345@users.noreply.github.com> Date: Fri, 3 Jan 2020 10:42:49 +0100 Subject: api spec --- src/org/uic/ticket/api/UicRailTicketCoder.java | 171 +++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 src/org/uic/ticket/api/UicRailTicketCoder.java (limited to 'src/org/uic/ticket/api/UicRailTicketCoder.java') diff --git a/src/org/uic/ticket/api/UicRailTicketCoder.java b/src/org/uic/ticket/api/UicRailTicketCoder.java new file mode 100644 index 0000000..0221526 --- /dev/null +++ b/src/org/uic/ticket/api/UicRailTicketCoder.java @@ -0,0 +1,171 @@ +/* + * + */ +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); + + + } + + + + +} -- cgit v1.2.3