|
|
|
|
@ -8,6 +8,13 @@ import seng302.DataInput.RegattaDataSource;
|
|
|
|
|
import seng302.Exceptions.InvalidBoatDataException;
|
|
|
|
|
import seng302.Exceptions.InvalidRaceDataException;
|
|
|
|
|
import seng302.Exceptions.InvalidRegattaDataException;
|
|
|
|
|
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
|
|
|
|
import seng302.Networking.Utils.XMLMessage;
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.OutputStream;
|
|
|
|
|
import java.io.UnsupportedEncodingException;
|
|
|
|
|
import java.nio.charset.Charset;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -18,22 +25,33 @@ public class Event {
|
|
|
|
|
RaceDataSource raceDataSource;
|
|
|
|
|
RegattaDataSource regattaDataSource;
|
|
|
|
|
|
|
|
|
|
public Event(RaceDataSource raceData, RegattaDataSource regattaData) {
|
|
|
|
|
///The stream to which we send all data.
|
|
|
|
|
private OutputStream outputStream;
|
|
|
|
|
|
|
|
|
|
//Sequence numbers for XML messages.
|
|
|
|
|
private short regattaXMLSequenceNumber = 0;
|
|
|
|
|
private short raceXMLSequenceNumber = 0;
|
|
|
|
|
private short boatXMLSequenceNumber = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Event(RaceDataSource raceData, RegattaDataSource regattaData, OutputStream outputStream) {
|
|
|
|
|
this.raceDataSource = raceData;
|
|
|
|
|
this.regattaDataSource = regattaData;
|
|
|
|
|
this.outputStream = outputStream;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void start() {
|
|
|
|
|
System.out.println("\nREGATTA DATA\n");//TEMP REMOVE debug
|
|
|
|
|
//System.out.println("\nREGATTA DATA\n");//TEMP REMOVE debug
|
|
|
|
|
sendRegattaData();
|
|
|
|
|
System.out.println("\nRACE DATA\n");//TEMP REMOVE debug
|
|
|
|
|
//System.out.println("\nRACE DATA\n");//TEMP REMOVE debug
|
|
|
|
|
sendRaceData();
|
|
|
|
|
System.out.println("\nBOAT DATA\n");//TEMP REMOVE debug
|
|
|
|
|
//System.out.println("\nBOAT DATA\n");//TEMP REMOVE debug
|
|
|
|
|
sendBoatData();
|
|
|
|
|
|
|
|
|
|
System.out.println("RACE STARTING!!\n\n");//TEMP REMOVE debug
|
|
|
|
|
//System.out.println("RACE STARTING!!\n\n");//TEMP REMOVE debug
|
|
|
|
|
|
|
|
|
|
Race newRace = new Race(raceDataSource, 15);
|
|
|
|
|
Race newRace = new Race(raceDataSource, 15, this.outputStream);
|
|
|
|
|
new Thread((newRace)).start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -43,7 +61,34 @@ public class Event {
|
|
|
|
|
RegattaData regattaData = new RegattaData(regattaDataSource);
|
|
|
|
|
String xmlString = regattaData.createXML();
|
|
|
|
|
|
|
|
|
|
System.out.println(xmlString); // to be replaced by TCPClient.send(xmlString) type function call
|
|
|
|
|
byte[] xmlStringUTF8 = new byte[0];
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
xmlStringUTF8 = xmlString.getBytes("UTF-8");
|
|
|
|
|
}
|
|
|
|
|
catch (UnsupportedEncodingException e)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidRegattaDataException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Create XML message object and serialize.
|
|
|
|
|
short ackNumber = 1;//TEMP need a more sensible way of getting ack number. Is it per packet type, or per packet?
|
|
|
|
|
|
|
|
|
|
XMLMessageEncoder xmlMessageEncoder = new XMLMessageEncoder(ackNumber, System.currentTimeMillis(), XMLMessage.XMLTypeRegatta, getNextRegattaXMLSequenceNumber(), (short) xmlStringUTF8.length, xmlString);
|
|
|
|
|
|
|
|
|
|
byte[] serializedMessage = xmlMessageEncoder.encode();
|
|
|
|
|
|
|
|
|
|
//Write it.
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
this.outputStream.write(serializedMessage);
|
|
|
|
|
}
|
|
|
|
|
catch (IOException e)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidRegattaDataException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -52,7 +97,32 @@ public class Event {
|
|
|
|
|
//Serialize race data to an XML as a string.
|
|
|
|
|
String xmlString = raceData.createXML();
|
|
|
|
|
|
|
|
|
|
System.out.println(xmlString); // to be replaced by TCPClient.send(xmlString) type function call
|
|
|
|
|
byte[] xmlStringUTF8 = new byte[0];
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
xmlStringUTF8 = xmlString.getBytes("UTF-8");
|
|
|
|
|
}
|
|
|
|
|
catch (UnsupportedEncodingException e)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidRaceDataException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Create XML message object and serialize.
|
|
|
|
|
short ackNumber = 1;//TEMP need a more sensible way of getting ack number. Is it per packet type, or per packet?
|
|
|
|
|
|
|
|
|
|
XMLMessageEncoder xmlMessageEncoder = new XMLMessageEncoder(ackNumber, System.currentTimeMillis(), XMLMessage.XMLTypeRace, getNextRaceXMLSequenceNumber(), (short) xmlStringUTF8.length, xmlString);
|
|
|
|
|
|
|
|
|
|
byte[] serializedMessage = xmlMessageEncoder.encode();
|
|
|
|
|
|
|
|
|
|
//Write it.
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
this.outputStream.write(serializedMessage);
|
|
|
|
|
}
|
|
|
|
|
catch (IOException e)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidRaceDataException();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void sendBoatData() throws InvalidBoatDataException {
|
|
|
|
|
@ -60,8 +130,65 @@ public class Event {
|
|
|
|
|
//Serialize race data to an XML as a string.
|
|
|
|
|
String xmlString = boatData.createXML();
|
|
|
|
|
|
|
|
|
|
System.out.println(xmlString); // to be replaced by TCPClient.send(xmlString) type function call
|
|
|
|
|
byte[] xmlStringUTF8 = new byte[0];
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
xmlStringUTF8 = xmlString.getBytes("UTF-8");
|
|
|
|
|
}
|
|
|
|
|
catch (UnsupportedEncodingException e)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidBoatDataException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Create XML message object and serialize.
|
|
|
|
|
short ackNumber = 1;//TEMP need a more sensible way of getting ack number. Is it per packet type, or per packet?
|
|
|
|
|
|
|
|
|
|
XMLMessageEncoder xmlMessageEncoder = new XMLMessageEncoder(ackNumber, System.currentTimeMillis(), XMLMessage.XMLTypeBoat, getNextBoatXMLSequenceNumber(), (short) xmlStringUTF8.length, xmlString);
|
|
|
|
|
|
|
|
|
|
byte[] serializedMessage = xmlMessageEncoder.encode();
|
|
|
|
|
|
|
|
|
|
//Write it.
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
this.outputStream.write(serializedMessage);
|
|
|
|
|
}
|
|
|
|
|
catch (IOException e)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidBoatDataException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns the next sequence number to be used for regatta XML messages.
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public short getNextRegattaXMLSequenceNumber()
|
|
|
|
|
{
|
|
|
|
|
short currentNumber = regattaXMLSequenceNumber;
|
|
|
|
|
regattaXMLSequenceNumber += 1;
|
|
|
|
|
return currentNumber;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns the next sequence number to be used for race XML messages.
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public short getNextRaceXMLSequenceNumber()
|
|
|
|
|
{
|
|
|
|
|
short currentNumber = raceXMLSequenceNumber;
|
|
|
|
|
raceXMLSequenceNumber += 1;
|
|
|
|
|
return currentNumber;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns the next sequence number to be used for boat XML messages.
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public short getNextBoatXMLSequenceNumber()
|
|
|
|
|
{
|
|
|
|
|
short currentNumber = boatXMLSequenceNumber;
|
|
|
|
|
boatXMLSequenceNumber += 1;
|
|
|
|
|
return currentNumber;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|