package net.java.cargotracker.interfaces.tracking.socket;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Singleton;
import javax.enterprise.event.Observes;
import javax.json.Json;
import javax.json.stream.JsonGenerator;
import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import net.java.cargotracker.infrastructure.events.cdi.CargoInspected;
import net.java.cargotracker.domain.model.cargo.Cargo;
/**
* WebSocket service for tracking all cargoes in real time.
*
* @author Vijay Nair
*/
@Singleton
@ServerEndpoint("/tracking")
public class RealtimeCargoTrackingService {
private static final Logger logger = Logger.getLogger(
RealtimeCargoTrackingService.class.getName());
private final Set<Session> sessions = new HashSet<>();
@OnOpen
public void onOpen(final Session session) {
sessions.add(session);
}
@OnClose
public void onClose(final Session session) {
sessions.remove(session);
}
public void onCargoInspected(@Observes @CargoInspected Cargo cargo) {
Writer writer = new StringWriter();
try (JsonGenerator generator = Json.createGenerator(writer)) {
generator
.writeStartObject()
.write("trackingId", cargo.getTrackingId().getIdString())
.write("origin", cargo.getOrigin().getName())
.write("destination", cargo.getRouteSpecification().getDestination().getName())
.write("lastKnownLocation", cargo.getDelivery().getLastKnownLocation().getName())
.write("transportStatus", cargo.getDelivery().getTransportStatus().toString())
.writeEnd();
}
String jsonValue = writer.toString();
for (Session session : sessions) {
try {
session.getBasicRemote().sendText(jsonValue);
} catch (IOException ex) {
logger.log(Level.WARNING, "Unable to publish WebSocket message", ex);
}
}
}
}