refactored SwissTiming connector APIs

This commit is contained in:
Axel Uhl committed 2011-09-30 11:11:07 +02:00
1 parent 9ee8128701
commit c802d2885d
10 files changed
+104 -27

No files matched your search

@@ -10,9 +10,9 @@ import java.util.List;
import org.junit.Test;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFormatException;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingMessage;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingMessageParser;
public class ParseSingleSwissTimingPacketFromFileTest {
@Test
@@ -20,7 +20,7 @@ public class ParseSingleSwissTimingPacketFromFileTest {
byte[] message = new byte[65536];
InputStream is = getClass().getResourceAsStream("/SwissTimingExampleTrack.bin");
is.read(message);
SwissTimingMessage swissTimingMessage = SwissTimingMessageParser.INSTANCE.parse(message);
SwissTimingMessage swissTimingMessage = SwissTimingFactory.INSTANCE.createMessageParser().parse(message);
assertNotNull(swissTimingMessage);
int lat = ((0x1e<<8 | 0x2c)<<8 | 0x31)<<8 | 0x14;
int lng = ((0xfe << 8 | 0x97)<<8 | 0x1d)<<8 | 0x73;
@@ -37,7 +37,7 @@ public class ParseSingleSwissTimingPacketFromFileTest {
int offset = 0;
int messageLength = 0;
while (offset < bytesRead) {
SwissTimingMessage swissTimingMessage = SwissTimingMessageParser.INSTANCE.parse(message, offset, bytesRead-offset);
SwissTimingMessage swissTimingMessage = SwissTimingFactory.INSTANCE.createMessageParser().parse(message, offset, bytesRead-offset);
assertNotNull(swissTimingMessage);
messages.add(swissTimingMessage);
messageLength = swissTimingMessage.length();
@@ -3,45 +3,39 @@ package com.sap.sailing.domain.swisstimingadapter.test;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.swisstimingadapter.impl.SailMasterTransceiver;
import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector;
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
public class SailMasterConnectivityTest {
private SailMasterDummy sailMaster;
private static final int port = 50002;
private SailMasterTransceiver transceiver;
private SailMasterConnector connector;
@Before
public void setUp() {
public void setUp() throws InterruptedException {
// create a SailMaster dummy on port 50002 and launch it in a separate thread
sailMaster = new SailMasterDummy(port);
new Thread(sailMaster, "SailMasterDummy on port "+port).start();
transceiver = new SailMasterTransceiver();
Thread.sleep(100); // give dummy sail master server a change to start listening on its socket
connector = SwissTimingFactory.INSTANCE.createSailMasterConnector("localhost", port);
}
@After
public void tearDown() throws IOException {
Socket s = connect();
transceiver.sendMessage("StopServer", s.getOutputStream());
connector.sendRequestAndGetResponse("StopServer");
}
@Test
public void testRaceId() throws UnknownHostException, IOException {
Socket s = connect();
transceiver.sendMessage("RaceId", s.getOutputStream());
String response = transceiver.receiveMessage(s.getInputStream());
assertEquals("RaceId|4711,A wonderful test race|4712,Not such a wonderful race", response);
}
private Socket connect() throws UnknownHostException, IOException {
Socket s = new Socket("localhost", port);
return s;
SailMasterMessage response = connector.sendRequestAndGetResponse("RaceId");
assertEquals("RaceId|4711,A wonderful test race|4712,Not such a wonderful race", response.getMessage());
}
}
@@ -29,6 +29,9 @@ public class SailMasterDummy implements Runnable {
while (!stopped) {
Socket s = listenOn.accept();
processRequests(s);
if (stopped) {
s.close();
}
}
System.out.println("Server stopped. Thread ending.");
} catch (IOException e) {
@@ -39,8 +42,9 @@ public class SailMasterDummy implements Runnable {
private void processRequests(Socket s) throws IOException {
InputStream is = s.getInputStream();
String message = transceiver.receiveMessage(is);
if (message != null) {
while (message != null) {
respondToMessage(message, s.getOutputStream());
message = transceiver.receiveMessage(is);
}
}
@@ -0,0 +1,8 @@
package com.sap.sailing.domain.swisstimingadapter;
import java.io.IOException;
import java.net.UnknownHostException;
public interface SailMasterConnector {
SailMasterMessage sendRequestAndGetResponse(String requestMessage) throws UnknownHostException, IOException;
}
@@ -0,0 +1,14 @@
package com.sap.sailing.domain.swisstimingadapter;
public interface SailMasterMessage {
/**
* @return the entire message with STX and ETX stripped
*/
String getMessage();
/**
* @return the {@link #getMessage()} result split along occurrences of the "|" character ("pipe")
*/
String[] getSections();
}
@@ -0,0 +1,11 @@
package com.sap.sailing.domain.swisstimingadapter;
import com.sap.sailing.domain.swisstimingadapter.impl.SwissTimingFactoryImpl;
public interface SwissTimingFactory {
SwissTimingFactory INSTANCE = new SwissTimingFactoryImpl();
SwissTimingMessageParser createMessageParser();
SailMasterConnector createSailMasterConnector(String host, int port);
}
@@ -1,11 +1,8 @@
package com.sap.sailing.domain.swisstimingadapter;
import com.sap.sailing.domain.swisstimingadapter.impl.SwissTimingMessageParserImpl;
import com.sap.sailing.udpconnector.UDPMessageParser;
public interface SwissTimingMessageParser extends UDPMessageParser<SwissTimingMessage> {
SwissTimingMessageParser INSTANCE = new SwissTimingMessageParserImpl();
SwissTimingMessage parse(byte[] message) throws SwissTimingFormatException;
SwissTimingMessage parse(byte[] message, int offset, int length) throws SwissTimingFormatException;
@@ -5,22 +5,25 @@ import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class SailMasterConnector extends SailMasterTransceiver {
import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector;
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
public class SailMasterConnectorImpl extends SailMasterTransceiver implements SailMasterConnector {
private final String host;
private final int port;
private Socket socket;
public SailMasterConnector(String host, int port) {
public SailMasterConnectorImpl(String host, int port) {
super();
this.host = host;
this.port = port;
}
public String sendRequestAndGetResponse(String requestMessage) throws UnknownHostException, IOException {
public SailMasterMessage sendRequestAndGetResponse(String requestMessage) throws UnknownHostException, IOException {
ensureSocketIsOpen();
OutputStream os = socket.getOutputStream();
sendMessage(requestMessage, os);
return receiveMessage(socket.getInputStream());
return new SailMasterMessageImpl(receiveMessage(socket.getInputStream()));
}
private void ensureSocketIsOpen() throws UnknownHostException, IOException {
@@ -0,0 +1,27 @@
package com.sap.sailing.domain.swisstimingadapter.impl;
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
public class SailMasterMessageImpl implements SailMasterMessage {
private final String message;
public SailMasterMessageImpl(String message) {
super();
this.message = message;
}
@Override
public String getMessage() {
return message;
}
@Override
public String[] getSections() {
return getMessage().split("|");
}
@Override
public String toString() {
return getMessage();
}
}
@@ -0,0 +1,19 @@
package com.sap.sailing.domain.swisstimingadapter.impl;
import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingMessageParser;
public class SwissTimingFactoryImpl implements SwissTimingFactory {
@Override
public SwissTimingMessageParser createMessageParser() {
return new SwissTimingMessageParserImpl();
}
@Override
public SailMasterConnector createSailMasterConnector(String host, int port) {
return new SailMasterConnectorImpl(host, port);
}
}