diff --git a/src/main/java/seng302/XMLMessageEncoder.java b/src/main/java/seng302/XMLMessageEncoder.java new file mode 100644 index 00000000..39a8901d --- /dev/null +++ b/src/main/java/seng302/XMLMessageEncoder.java @@ -0,0 +1,69 @@ +package seng302; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * Encodes a XML file into a message of AC35 format + */ +public class XMLMessageEncoder { + private byte messageVersionNumber; + private short ackNumber; + private long timeStamp; + private byte xmlMsgSubType; + private short sequenceNumber; + private short xmlMsgLength; + private String xmlMessage; + + public XMLMessageEncoder(byte messageVersionNumber, short ackNumber, long timeStamp, byte xmlMsgSubType, short sequenceNumber, short xmlMsgLenght, String xmlMessage) { + this.messageVersionNumber = messageVersionNumber; + this.ackNumber = ackNumber; + this.timeStamp = timeStamp; + this.xmlMsgSubType = xmlMsgSubType; + this.sequenceNumber = sequenceNumber; + this.xmlMsgLength = xmlMsgLenght; + this.xmlMessage = xmlMessage; + } + + public byte[] getByteArray() { + byte[] messageBytes = xmlMessage.getBytes(); + if (messageBytes.length > this.xmlMsgLength) { + //System.err.println("Xml message is to big"); + return null; + } + ByteBuffer tempOutputByteBuffer = ByteBuffer.allocate(14 + messageBytes.length); + + //ackNumber converted to bytes + byte[] ackNumberBytes = new byte[2]; + ackNumberBytes[0] = (byte) (ackNumber & 0xff); + ackNumberBytes[1] = (byte) ((ackNumber >> 8) & 0xff); + + //sequenceNumber converted to bytes + byte[] sequenceNumberBytes = new byte[2]; + sequenceNumberBytes[0] = (byte) (sequenceNumber & 0xff); + sequenceNumberBytes[1] = (byte) ((sequenceNumber >> 8) & 0xff); + + //xmlMsgLength converted to bytes + byte[] xmlMsgLengthBytes = new byte[2]; + xmlMsgLengthBytes[0] = (byte) (xmlMsgLength & 0xff); + xmlMsgLengthBytes[1] = (byte) ((xmlMsgLength >> 8) & 0xff); + + + tempOutputByteBuffer.put(messageVersionNumber); + tempOutputByteBuffer.put(ackNumberBytes); + tempOutputByteBuffer.put(longToSixBytes(timeStamp)); + tempOutputByteBuffer.put(xmlMsgSubType); + tempOutputByteBuffer.put(sequenceNumberBytes); + tempOutputByteBuffer.put(xmlMsgLengthBytes); + tempOutputByteBuffer.put(messageBytes); + + return tempOutputByteBuffer.array(); + } + + public byte[] longToSixBytes(long x) { + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.putLong(x); + return Arrays.copyOfRange(buffer.array(), 2, 8); + } +} diff --git a/src/test/java/XMLMessageEncoderTest.java b/src/test/java/XMLMessageEncoderTest.java new file mode 100644 index 00000000..f4522683 --- /dev/null +++ b/src/test/java/XMLMessageEncoderTest.java @@ -0,0 +1,54 @@ +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import seng302.XMLMessageEncoder; + +import java.io.*; + +/** + * Created by hba56 on 19/04/17. + */ +public class XMLMessageEncoderTest { + @Test + public void getByteArrayTest(){ + StringBuilder xmlString; + try{ + BufferedReader br = new BufferedReader(new InputStreamReader( + this.getClass().getResourceAsStream(("raceXML/Regatta.xml")))); + String line; + xmlString = new StringBuilder(); + while((line=br.readLine())!= null){ + xmlString.append(line.trim()); + } + XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)xmlString.length(), xmlString.toString()); + + byte[] encodedXML = testEncoder.getByteArray(); + + //1 + 2 + 6 + 1 + 2 + 2 + 374 + Assert.assertEquals(388, encodedXML.length); + }catch (IOException e){ + System.out.println(e); + } + } + + @Test + public void getByteArrayNullTest(){ + StringBuilder xmlString; + try{ + BufferedReader br = new BufferedReader(new InputStreamReader( + this.getClass().getResourceAsStream(("raceXML/Regatta.xml")))); + String line; + xmlString = new StringBuilder(); + while((line=br.readLine())!= null){ + xmlString.append(line.trim()); + } + XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)1, xmlString.toString()); + + byte[] encodedXML = testEncoder.getByteArray(); + + Assert.assertEquals(null, encodedXML); + }catch (IOException e){ + System.out.println(e); + } + } +} diff --git a/src/test/resources/raceXML/Regatta.xml b/src/test/resources/raceXML/Regatta.xml new file mode 100644 index 00000000..23fde025 --- /dev/null +++ b/src/test/resources/raceXML/Regatta.xml @@ -0,0 +1,12 @@ + + + + 1 + Seng302 Mock Test + Bermuda AC35 + -32.296577 + 64.854304 + 0.00 + -4 + -14.78 + \ No newline at end of file