From 9d9c491372b7c5f6c5c0d05a5e689e9b3e29677c Mon Sep 17 00:00:00 2001 From: hba56 Date: Thu, 20 Apr 2017 14:26:09 +1200 Subject: [PATCH] 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){