/*
* To change this template, choose Tools | Templates and open the template in
* the editor.
*/
package com.wordpress.salaboy.services;
import com.wordpress.salaboy.model.Ambulance;
import com.wordpress.salaboy.model.FireTruck;
import com.wordpress.salaboy.model.Vehicle;
import com.wordpress.salaboy.model.events.EmergencyVehicleEvent;
import com.wordpress.salaboy.model.persistence.PersistenceService;
import com.wordpress.salaboy.model.persistence.PersistenceServiceProvider;
import java.util.HashMap;
import java.util.Map;
/**
* Facade for VehicleMonitorService instances. It contains a VehicleMonitorService
* for each dispatched vehicle.
*
* @author esteban
*/
public class VehiclesMGMTService {
private static VehiclesMGMTService instance;
private PersistenceService persistenceService;
/**
* A Map to store each service of a vehicle. The key is the vehicle id
*/
private final Map<String,VehicleMonitorService> vehicleServices = new HashMap<String, VehicleMonitorService>();
private VehiclesMGMTService(){
persistenceService = PersistenceServiceProvider.getPersistenceService();
}
public synchronized static VehiclesMGMTService getInstance() {
if (instance == null) {
instance = new VehiclesMGMTService();
}
return instance;
}
public void newVehicleDispatched(final String emergencyId, final String vehicleId) {
synchronized(vehicleServices){
if (vehicleServices.containsKey(vehicleId)){
throw new IllegalStateException("A monitor service is already configured for this vehicle: "+vehicleId);
}
//get the vehicle from the persistent store
Vehicle vehicle = persistenceService.loadVehicle(vehicleId);
if (vehicle == null){
throw new IllegalArgumentException("Unknown Vehicle "+vehicleId);
}
//instanciates a new VehicleMonitorService according to the type of vehicle
VehicleMonitorService service = null;
if (vehicle instanceof Ambulance){
service = new AmbulanceMonitorService();
}else if (vehicle instanceof FireTruck){
service = new FireTruckMonitorService(vehicleId);
}else{
throw new IllegalArgumentException("Don't know how to handle a "+vehicle);
}
//initialize the service
service.newVehicleDispatched(emergencyId, vehicleId);
//store the service
this.vehicleServices.put(vehicleId, service);
}
}
public void processEvent(EmergencyVehicleEvent event){
synchronized(vehicleServices){
String vehicleId = event.getVehicleId();
if (!vehicleServices.containsKey(vehicleId)){
throw new IllegalStateException("No Monitor configured for this vehicle("+vehicleId+"). Did you forget to despatch it?");
}
VehicleMonitorService service = vehicleServices.get(event.getVehicleId());
service.processEvent(event);
}
}
public void vehicleRemoved(String vehicleId){
synchronized(vehicleServices){
if (!vehicleServices.containsKey(vehicleId)){
throw new IllegalStateException("No Monitor configured for this vehicle("+vehicleId+"). Did you forget to despatch it?");
}
VehicleMonitorService service = vehicleServices.remove(vehicleId);
service.vehicleRemoved();
}
}
}