-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]main
parent
4ba9331528
commit
79c5b93935
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<RegattaConfig>
|
||||||
|
<RegattaID>1</RegattaID>
|
||||||
|
<RegattaName>Seng302 Mock Test</RegattaName>
|
||||||
|
<CourseName>Bermuda AC35</CourseName>
|
||||||
|
<CentralLatitude>-32.296577</CentralLatitude>
|
||||||
|
<CentralLongitude>64.854304</CentralLongitude>
|
||||||
|
<CentralAltitude>0.00</CentralAltitude>
|
||||||
|
<UtcOffset>-4</UtcOffset>
|
||||||
|
<MagneticVariation>-14.78</MagneticVariation>
|
||||||
|
</RegattaConfig>
|
||||||
Loading…
Reference in new issue