From 79c5b939359a9c6d312d49f45d77d29066cf81f6 Mon Sep 17 00:00:00 2001 From: hba56 Date: Thu, 20 Apr 2017 13:36:09 +1200 Subject: [PATCH 1/2] XML Message Encoder and tests class added -added XMLMessageEncoder to encode xml files into byte array -added test class for xml encoder -added regatta.xml to the test resources #story[778, 782] --- src/main/java/seng302/XMLMessageEncoder.java | 69 ++++++++++++++++++++ src/test/java/XMLMessageEncoderTest.java | 54 +++++++++++++++ src/test/resources/raceXML/Regatta.xml | 12 ++++ 3 files changed, 135 insertions(+) create mode 100644 src/main/java/seng302/XMLMessageEncoder.java create mode 100644 src/test/java/XMLMessageEncoderTest.java create mode 100644 src/test/resources/raceXML/Regatta.xml 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 From 9d9c491372b7c5f6c5c0d05a5e689e9b3e29677c Mon Sep 17 00:00:00 2001 From: hba56 Date: Thu, 20 Apr 2017 14:26:09 +1200 Subject: [PATCH 2/2] XML Message Decoder added with test -added XMLMessageDecoder to decode xml files from byte array -added test class for xml decoder -renamed getByteArray method to encode -made longToSixBytes private #story[778, 782] --- src/main/java/seng302/XMLMessageDecoder.java | 102 +++++++++++++++++++ src/main/java/seng302/XMLMessageEncoder.java | 12 ++- src/test/java/XMLMessageDecoderTest.java | 47 +++++++++ src/test/java/XMLMessageEncoderTest.java | 5 +- 4 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 src/main/java/seng302/XMLMessageDecoder.java create mode 100644 src/test/java/XMLMessageDecoderTest.java diff --git a/src/main/java/seng302/XMLMessageDecoder.java b/src/main/java/seng302/XMLMessageDecoder.java new file mode 100644 index 00000000..1ff42831 --- /dev/null +++ b/src/main/java/seng302/XMLMessageDecoder.java @@ -0,0 +1,102 @@ +package seng302; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * Created by hba56 on 20/04/17. + */ +public class XMLMessageDecoder { + private byte messageVersionNumber; + private short ackNumber; + private long timeStamp; + private byte xmlMsgSubType; + private short sequenceNumber; + private short xmlMsgLength; + private String xmlMessage; + + private byte[] bytes; + + public XMLMessageDecoder(byte[] bytes) { + this.bytes = bytes; + } + + public void decode(){ + byte[] ackNumberBytes = Arrays.copyOfRange(bytes, 1, 3); + byte[] timeStampBytes = Arrays.copyOfRange(bytes, 3, 9); + byte[] sequenceNumberBytes = Arrays.copyOfRange(bytes, 10, 12); + byte[] xmlMsgLengthBytes = Arrays.copyOfRange(bytes, 12, 14); + byte[] xmlMessagebytes = Arrays.copyOfRange(bytes, 14, bytes.length); + + this.xmlMsgSubType = bytes[9]; + this.messageVersionNumber = bytes[0]; + this.ackNumber = bytesToShort(ackNumberBytes); + + this.timeStamp = bytesToLong(timeStampBytes); + + this.sequenceNumber = bytesToShort(sequenceNumberBytes); + this.xmlMsgLength = bytesToShort(xmlMsgLengthBytes); + this.xmlMessage = new String(xmlMessagebytes); + } + + private short bytesToShort(byte[] bytesShort){ + ByteBuffer byteBuffer = ByteBuffer.allocate(2); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.put(bytesShort[0]); + byteBuffer.put(bytesShort[1]); + short shortVal = byteBuffer.getShort(0); + return shortVal; + } + + private long bytesToLong(byte[] bytesLong){ + ByteBuffer byteBuffer = ByteBuffer.allocate(8); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.put((byte)0); + byteBuffer.put((byte)0); + byteBuffer.put(bytesLong[0]); + byteBuffer.put(bytesLong[1]); + byteBuffer.put(bytesLong[2]); + byteBuffer.put(bytesLong[3]); + byteBuffer.put(bytesLong[4]); + byteBuffer.put(bytesLong[5]); + +// System.out.println("====decode===="); +// for (byte i:byteBuffer.array() +// ) { +// System.out.println(i); +// } +// System.out.println("====decode===="); + + long longVal = byteBuffer.getLong(0); + return longVal; + } + + public byte getMessageVersionNumber() { + return messageVersionNumber; + } + + public short getAckNumber() { + return ackNumber; + } + + public long getTimeStamp() { + return timeStamp; + } + + public byte getXmlMsgSubType() { + return xmlMsgSubType; + } + + public short getSequenceNumber() { + return sequenceNumber; + } + + public short getXmlMsgLength() { + return xmlMsgLength; + } + + public String getXmlMessage() { + return xmlMessage; + } +} diff --git a/src/main/java/seng302/XMLMessageEncoder.java b/src/main/java/seng302/XMLMessageEncoder.java index 39a8901d..85cd5d2f 100644 --- a/src/main/java/seng302/XMLMessageEncoder.java +++ b/src/main/java/seng302/XMLMessageEncoder.java @@ -26,7 +26,7 @@ public class XMLMessageEncoder { this.xmlMessage = xmlMessage; } - public byte[] getByteArray() { + public byte[] encode() { byte[] messageBytes = xmlMessage.getBytes(); if (messageBytes.length > this.xmlMsgLength) { //System.err.println("Xml message is to big"); @@ -61,9 +61,17 @@ public class XMLMessageEncoder { return tempOutputByteBuffer.array(); } - public byte[] longToSixBytes(long x) { + private byte[] longToSixBytes(long x) { ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); buffer.putLong(x); + +// System.out.println("====encode===="); +// for (byte i:buffer.array() +// ) { +// System.out.println(i); +// } +// System.out.println("====encode===="); + return Arrays.copyOfRange(buffer.array(), 2, 8); } } diff --git a/src/test/java/XMLMessageDecoderTest.java b/src/test/java/XMLMessageDecoderTest.java new file mode 100644 index 00000000..a373db5a --- /dev/null +++ b/src/test/java/XMLMessageDecoderTest.java @@ -0,0 +1,47 @@ +import org.junit.Assert; +import org.junit.Test; +import seng302.XMLMessageDecoder; +import seng302.XMLMessageEncoder; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Created by hba56 on 20/04/17. + */ +public class XMLMessageDecoderTest { + @Test + public void getByteArrayTest(){ + try{ + StringBuilder xmlString; + 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()); + } + long time = System.currentTimeMillis(); + XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte)1, (short)1, time, (byte)7, (short)1, (short)xmlString.length(), xmlString.toString()); + + byte[] encodedXML = testEncoder.encode(); + + XMLMessageDecoder decoderXML = new XMLMessageDecoder(encodedXML); + decoderXML.decode(); + + + Assert.assertEquals((byte)1, decoderXML.getMessageVersionNumber()); + Assert.assertEquals((short)1, decoderXML.getAckNumber()); + Assert.assertEquals(time, decoderXML.getTimeStamp()); + Assert.assertEquals((byte)7, decoderXML.getXmlMsgSubType()); + Assert.assertEquals((short)1, decoderXML.getSequenceNumber()); + Assert.assertEquals((short)xmlString.length(), decoderXML.getXmlMsgLength()); + Assert.assertEquals(xmlString.toString(), decoderXML.getXmlMessage()); + + + }catch (IOException e){ + System.out.println(e); + } + } +} diff --git a/src/test/java/XMLMessageEncoderTest.java b/src/test/java/XMLMessageEncoderTest.java index f4522683..b00c6565 100644 --- a/src/test/java/XMLMessageEncoderTest.java +++ b/src/test/java/XMLMessageEncoderTest.java @@ -1,5 +1,4 @@ import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import seng302.XMLMessageEncoder; @@ -22,7 +21,7 @@ public class XMLMessageEncoderTest { } XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)xmlString.length(), xmlString.toString()); - byte[] encodedXML = testEncoder.getByteArray(); + byte[] encodedXML = testEncoder.encode(); //1 + 2 + 6 + 1 + 2 + 2 + 374 Assert.assertEquals(388, encodedXML.length); @@ -44,7 +43,7 @@ public class XMLMessageEncoderTest { } XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)1, xmlString.toString()); - byte[] encodedXML = testEncoder.getByteArray(); + byte[] encodedXML = testEncoder.encode(); Assert.assertEquals(null, encodedXML); }catch (IOException e){