meerkat-java/polling-station/src/main/java/meerkat/pollingstation/PollingStationMainControlle...

100 lines
3.8 KiB
Java

package meerkat.pollingstation;
import meerkat.pollingstation.controller.PollingStationControllerInterface;
import meerkat.pollingstation.controller.commands.PollingStationCommand;
import meerkat.pollingstation.controller.commands.ReceivedScanCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by Laura on 3/20/2017.
*/
public class PollingStationMainController implements PollingStationControllerInterface {
private final Logger logger = LoggerFactory.getLogger(PollingStationMainController.class);
private LinkedBlockingQueue<PollingStationCommand> queue;
private volatile boolean shutDownHasBeenCalled;
private static ReceiverScanHandler server;
private static final String ADDRESS = "http://localhost";
private static final String SUB_ADDRESS = "";
private static final int PORT = 8080;
public PollingStationMainController() {
queue = new LinkedBlockingQueue<PollingStationCommand>();
shutDownHasBeenCalled = false;
}
@Override
public void init(ReceiverScanHandler server) {
server.setControllerQueue(queue);
}
public void run() {
logger.info("Started controller");
while (! wasShutDownCalled()) {
try {
PollingStationCommand command = queue.take();
handleSingleCommand(command);
}
catch (InterruptedException e) {
System.err.println("Interrupted while reading from command queue " + e);
}
}
}
private boolean wasShutDownCalled () {
return shutDownHasBeenCalled;
}
/**
* this method decides upon a given command if to ignore it (if it has an old serial number) or to handle it
* If we choose to handle it, then it simply calls the matching method which handles this type of command
* @param command a command to handle next (probably from the inner command queue)
*/
private void handleSingleCommand(PollingStationCommand command) {
// check if the command is old and should be ignored
// if (command.getBallotSerialNumber() != state.currentBallotSerialNumber && !(command instanceof RestartVotingCommand)) {
// // probably an old command relating to some old ballot serial number. Simply log it and ignore it.
// String errorMessage = "handleSingleCommand: received a task too old. " +
// command.getBallotSerialNumber() + " " + state.currentBallotSerialNumber;
// logger.debug(errorMessage);
// return;
// }
// decide which method to run according to the command type
if (command instanceof ReceivedScanCommand) {
doProcessScan((ReceivedScanCommand) command);
}
// else if (command instanceof ChannelChoiceCommand) {
// doChooseChannel();
// }
else {
logger.error("handleSingleCommand: unknown type of PollingStationCommand received: " + command.getClass().getName());
// doReportErrorAndForceRestart(systemMessages.get(StorageManager.SOMETHING_WRONG_MESSAGE));
doReportErrorAndForceRestart("error message to define");
}
}
private void doProcessScan(ReceivedScanCommand command) {
logger.info("The Polling Station starts processing the data...");
logger.info("BallotID = "+command.getBallotSerialNumber());
}
/**
* a (overloaded) method to report an error message to the voter
* @param errorMessage message to show the voter
*/
private void doReportErrorAndForceRestart(String errorMessage) {
queue.clear();
}
@Override
// TODO: 4/16/2017 Implemet the shutdown behavior
public void callShutDown() {
}
}