From 54b0fab72106672ea1d9ca4d81d782b6bf1c6820 Mon Sep 17 00:00:00 2001 From: Ben Burwell Date: Tue, 15 Nov 2016 23:43:08 -0500 Subject: Implement data table --- .../benburwell/planes/sbs/AggregateDataSource.java | 31 +++++- src/com/benburwell/planes/sbs/DataSource.java | 2 + src/com/benburwell/planes/sbs/SBSPacket.java | 122 +++++++++++++++++---- src/com/benburwell/planes/sbs/TCPDataSource.java | 63 +++++++++-- 4 files changed, 182 insertions(+), 36 deletions(-) (limited to 'src/com/benburwell/planes/sbs') diff --git a/src/com/benburwell/planes/sbs/AggregateDataSource.java b/src/com/benburwell/planes/sbs/AggregateDataSource.java index 08b89ea..2850404 100644 --- a/src/com/benburwell/planes/sbs/AggregateDataSource.java +++ b/src/com/benburwell/planes/sbs/AggregateDataSource.java @@ -2,22 +2,47 @@ package com.benburwell.planes.sbs; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.HashMap; /** * Created by ben on 11/15/16. */ public class AggregateDataSource implements DataSource { private List subscribers = new ArrayList<>(); + private boolean isOpen = false; + private int nextSourceNumber = 1; + private Map sources = new HashMap<>(); - public void addSource(DataSource source) { + public int addSource(DataSource source) { + int thisSourceNumber = this.nextSourceNumber++; + this.sources.put(thisSourceNumber, source); source.subscribe((SBSPacket packet) -> { - for (DataListener listener : subscribers) { - listener.handleMessage(packet); + if (isOpen) { + for (DataListener listener : subscribers) { + listener.handleMessage(packet); + } } }); + return thisSourceNumber; } public void subscribe(DataListener listener) { this.subscribers.add(listener); } + + public void open() { + this.isOpen = true; + } + + public void close() { + this.isOpen = false; + } + + public void closeSource(int sourceNumber) { + if (this.sources.containsKey(sourceNumber)) { + this.sources.get(sourceNumber).close(); + this.sources.remove(sourceNumber); + } + } } diff --git a/src/com/benburwell/planes/sbs/DataSource.java b/src/com/benburwell/planes/sbs/DataSource.java index 959e273..961c6e2 100644 --- a/src/com/benburwell/planes/sbs/DataSource.java +++ b/src/com/benburwell/planes/sbs/DataSource.java @@ -5,4 +5,6 @@ package com.benburwell.planes.sbs; */ public interface DataSource { void subscribe(DataListener listener); + void open(); + void close(); } diff --git a/src/com/benburwell/planes/sbs/SBSPacket.java b/src/com/benburwell/planes/sbs/SBSPacket.java index 0988f3a..5684803 100644 --- a/src/com/benburwell/planes/sbs/SBSPacket.java +++ b/src/com/benburwell/planes/sbs/SBSPacket.java @@ -4,35 +4,31 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import java.util.DoubleSummaryStatistics; /** * Created by ben on 11/15/16. */ public class SBSPacket { private MessageType messageType; - private TransmissionType transmissionType; - private String sessionId; - private String aircraftId; - private String hexIdent; - private String flightId; - private Date dateGenerated; - private Date dateLogged; - private String callsign; - private double altitude; - private double groundSpeed; - private double track; - private double latitude; - private double longitude; - private double verticalRate; - private String squawk; - private boolean alert; - private boolean emergency; - private boolean spi; - private boolean isOnGround; - - public SBSPacket() { - } + private TransmissionType transmissionType = null; + private String sessionId = null; + private String aircraftId = null; + private String hexIdent = null; + private String flightId = null; + private Date dateGenerated = null; + private Date dateLogged = null; + private String callsign = null; + private Double altitude = null; + private Double groundSpeed = null; + private Double track = null; + private Double latitude = null; + private Double longitude = null; + private Double verticalRate = null; + private String squawk = null; + private Boolean alert = null; + private Boolean emergency = null; + private Boolean spi = null; + private Boolean isOnGround = null; public SBSPacket(String packet) throws MalformedPacketException { this.parse(packet); @@ -137,4 +133,84 @@ public class SBSPacket { public String toString() { return this.messageType.name(); } + + public MessageType getMessageType() { + return messageType; + } + + public TransmissionType getTransmissionType() { + return transmissionType; + } + + public String getSessionId() { + return sessionId; + } + + public String getAircraftId() { + return aircraftId; + } + + public String getHexIdent() { + return hexIdent; + } + + public String getFlightId() { + return flightId; + } + + public Date getDateGenerated() { + return dateGenerated; + } + + public Date getDateLogged() { + return dateLogged; + } + + public String getCallsign() { + return callsign; + } + + public Double getAltitude() { + return altitude; + } + + public Double getGroundSpeed() { + return groundSpeed; + } + + public Double getTrack() { + return track; + } + + public Double getLatitude() { + return latitude; + } + + public Double getLongitude() { + return longitude; + } + + public Double getVerticalRate() { + return verticalRate; + } + + public String getSquawk() { + return squawk; + } + + public Boolean isAlert() { + return alert; + } + + public Boolean isEmergency() { + return emergency; + } + + public Boolean isSpi() { + return spi; + } + + public Boolean isOnGround() { + return isOnGround; + } } diff --git a/src/com/benburwell/planes/sbs/TCPDataSource.java b/src/com/benburwell/planes/sbs/TCPDataSource.java index 6c0e51d..2224d36 100644 --- a/src/com/benburwell/planes/sbs/TCPDataSource.java +++ b/src/com/benburwell/planes/sbs/TCPDataSource.java @@ -10,20 +10,67 @@ import java.net.*; */ public class TCPDataSource implements DataSource { private List subscribers = new ArrayList<>(); + private String host; + private int port; + private Thread clientThread = null; + private SocketClient client = null; public TCPDataSource(String host, int port) { - new Thread(() -> { + this.host = host; + this.port = port; + } + + public void subscribe(DataListener listener) { + this.subscribers.add(listener); + } + + public void open() { + this.client = new SocketClient(this.host, this.port); + this.clientThread = new Thread(this.client); + this.clientThread.start(); + } + + public void close() { + if (this.client != null) { + this.client.terminate(); + try { + this.clientThread.join(); + } catch (InterruptedException ignored) {} + } + } + + private class SocketClient implements Runnable { + private String host; + private int port; + private Socket clientSocket = null; + + public SocketClient(String host, int port) { + this.host = host; + this.port = port; + } + + public void terminate() { + if (this.clientSocket != null) { + try { + this.clientSocket.close(); + } catch (IOException e) { + System.out.println("Got exception closing socket: " + e.getMessage()); + } + } + } + + @Override + public void run() { System.out.println("Starting socket client"); - Socket clientSocket; BufferedReader socketReader; try { - clientSocket = new Socket(host, port); + this.clientSocket = new Socket(this.host, this.port); } catch (IOException e) { - System.out.println("Could not connect to " + host + " on port " + port + ": " + e.getMessage()); + System.out.println("Could not connect to " + this.host + " on port " + this.port + ": " + e.getMessage()); return; } try { - socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + socketReader = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); } catch (IOException e) { System.out.println("Could not create socket reader: " + e.getMessage()); return; @@ -47,10 +94,6 @@ public class TCPDataSource implements DataSource { System.out.println(e.getMessage()); } } - }).start(); - } - - public void subscribe(DataListener listener) { - this.subscribers.add(listener); + } } } -- cgit v1.2.3