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]
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@ public class XMLMessageEncoder {
|
|||||||
this.xmlMessage = xmlMessage;
|
this.xmlMessage = xmlMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getByteArray() {
|
public byte[] encode() {
|
||||||
byte[] messageBytes = xmlMessage.getBytes();
|
byte[] messageBytes = xmlMessage.getBytes();
|
||||||
if (messageBytes.length > this.xmlMsgLength) {
|
if (messageBytes.length > this.xmlMsgLength) {
|
||||||
//System.err.println("Xml message is to big");
|
//System.err.println("Xml message is to big");
|
||||||
@@ -61,9 +61,17 @@ public class XMLMessageEncoder {
|
|||||||
return tempOutputByteBuffer.array();
|
return tempOutputByteBuffer.array();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] longToSixBytes(long x) {
|
private byte[] longToSixBytes(long x) {
|
||||||
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
|
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
|
||||||
buffer.putLong(x);
|
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);
|
return Arrays.copyOfRange(buffer.array(), 2, 8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import seng302.XMLMessageEncoder;
|
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());
|
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
|
//1 + 2 + 6 + 1 + 2 + 2 + 374
|
||||||
Assert.assertEquals(388, encodedXML.length);
|
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());
|
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);
|
Assert.assertEquals(null, encodedXML);
|
||||||
}catch (IOException e){
|
}catch (IOException e){
|
||||||
|
|||||||
Reference in New Issue
Block a user