For some reason restful API did not appear in my gradle.build. It is fixed now.
parent
d12ad408c4
commit
4379921445
|
@ -40,6 +40,7 @@ version += "${isSnapshot ? '-SNAPSHOT' : ''}"
|
||||||
dependencies {
|
dependencies {
|
||||||
// Meerkat common
|
// Meerkat common
|
||||||
compile project(':meerkat-common')
|
compile project(':meerkat-common')
|
||||||
|
compile project(':restful-api-common')
|
||||||
|
|
||||||
// Logging
|
// Logging
|
||||||
compile 'org.slf4j:slf4j-api:1.7.7'
|
compile 'org.slf4j:slf4j-api:1.7.7'
|
||||||
|
|
|
@ -3,6 +3,6 @@ package meerkat.voting.controller.callbacks;
|
||||||
/**
|
/**
|
||||||
* Just a simple unique exception to throw when a voter aborts/cancels the voting during the voting process
|
* Just a simple unique exception to throw when a voter aborts/cancels the voting during the voting process
|
||||||
*/
|
*/
|
||||||
public class VoterCancelException extends Exception {
|
public class VoterCancelThrowable extends Throwable {
|
||||||
//
|
//
|
||||||
}
|
}
|
|
@ -0,0 +1,161 @@
|
||||||
|
package meerkat.voting.output;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.FutureCallback;
|
||||||
|
import com.google.protobuf.BoolValue;
|
||||||
|
import meerkat.protobuf.PollingStation.ScannedData;
|
||||||
|
import meerkat.protobuf.Voting.*;
|
||||||
|
import meerkat.rest.*;
|
||||||
|
import meerkat.voting.controller.callbacks.ControllerCallback;
|
||||||
|
import meerkat.voting.output.outputcommands.*;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.ws.rs.client.*;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
|
import static meerkat.pollingstation.PollingStationConstants.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by hai on 27/06/16.
|
||||||
|
*/
|
||||||
|
public class AsyncRunnableOutputDevice implements BallotOutputDevice, Runnable {
|
||||||
|
|
||||||
|
private Logger logger;
|
||||||
|
private LinkedBlockingQueue<OutputCommand> queue;
|
||||||
|
private volatile boolean shutDownHasBeenCalled;
|
||||||
|
|
||||||
|
private SignedEncryptedBallot signedEncryptedBallot;
|
||||||
|
|
||||||
|
private final WebTarget successfulPrintTarget;
|
||||||
|
|
||||||
|
public AsyncRunnableOutputDevice(String address) {
|
||||||
|
logger = LoggerFactory.getLogger(AsyncRunnableOutputDevice.class);
|
||||||
|
logger.info("A NetworkVirtualPrinter is constructed");
|
||||||
|
queue = new LinkedBlockingQueue<>();
|
||||||
|
shutDownHasBeenCalled = false;
|
||||||
|
|
||||||
|
Client client = ClientBuilder.newClient();
|
||||||
|
client.register(ProtobufMessageBodyReader.class);
|
||||||
|
client.register(ProtobufMessageBodyWriter.class);
|
||||||
|
successfulPrintTarget = client.target(address).path(POLLING_STATION_WEB_SCANNER_SCAN_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run () {
|
||||||
|
logger.info("starts running");
|
||||||
|
while (! wasShutDownCalled()) {
|
||||||
|
try {
|
||||||
|
OutputCommand command = queue.take();
|
||||||
|
handleSingleCommand(command);
|
||||||
|
}
|
||||||
|
catch (InterruptedException e) {
|
||||||
|
logger.warn ("Interrupted while reading from command queue " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean wasShutDownCalled () {
|
||||||
|
return shutDownHasBeenCalled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void callShutDown() {
|
||||||
|
logger.info("callShutDown command has been called");
|
||||||
|
shutDownHasBeenCalled = true;
|
||||||
|
queue.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void handleSingleCommand(OutputCommand command) {
|
||||||
|
if (command instanceof CommitOutputCommand) {
|
||||||
|
doCommitToBallot((CommitOutputCommand)command);
|
||||||
|
}
|
||||||
|
else if (command instanceof AuditOutputCommand) {
|
||||||
|
doAudit((AuditOutputCommand)command);
|
||||||
|
}
|
||||||
|
else if (command instanceof CastOutputCommand) {
|
||||||
|
doCastBallot((CastOutputCommand)command);
|
||||||
|
}
|
||||||
|
else if (command instanceof CancelOutputCommand) {
|
||||||
|
doCancel((CancelOutputCommand)command);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String errorMessage = "handleSingleCommand: unknown type of OutputCommand received: " +
|
||||||
|
command.getClass().getName();
|
||||||
|
logger.error(errorMessage);
|
||||||
|
throw new RuntimeException(errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void commitToBallot(PlaintextBallot plaintextBallot,
|
||||||
|
SignedEncryptedBallot signedEncryptedBallot,
|
||||||
|
FutureCallback<Void> callback) {
|
||||||
|
logger.debug("Output interface call to commit to ballot");
|
||||||
|
queue.add(new CommitOutputCommand(plaintextBallot, signedEncryptedBallot, (ControllerCallback)callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void audit(BallotSecrets ballotSecrets, FutureCallback<Void> callback) {
|
||||||
|
logger.debug("an interface call to audit");
|
||||||
|
queue.add(new AuditOutputCommand(ballotSecrets, (ControllerCallback)callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void castBallot(FutureCallback<Void> callback) {
|
||||||
|
logger.debug("an interface call to cast ballot");
|
||||||
|
queue.add(new CastOutputCommand((ControllerCallback)callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cancelBallot(FutureCallback<Void> callback) {
|
||||||
|
logger.debug("an interface call to cancel the output");
|
||||||
|
queue.add(new CancelOutputCommand((ControllerCallback)callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void doCommitToBallot(CommitOutputCommand command) {
|
||||||
|
logger.debug("entered method doCommitToBallot");
|
||||||
|
signedEncryptedBallot = command.getSignedEncryptedBallot();
|
||||||
|
command.getCallback().onSuccess(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void doAudit(AuditOutputCommand command) {
|
||||||
|
logger.debug("entered method doAudit");
|
||||||
|
signedEncryptedBallot = null;
|
||||||
|
command.getCallback().onSuccess(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void doCastBallot(CastOutputCommand command) {
|
||||||
|
logger.debug("entered method doCastBallot");
|
||||||
|
ScannedData scannedData = ScannedData.newBuilder()
|
||||||
|
.setChannel(null) //TODO: fill the details for the channel to be able to send here
|
||||||
|
.setSignedEncryptedBallot(this.signedEncryptedBallot)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Response response = successfulPrintTarget.request(Constants.MEDIATYPE_PROTOBUF).post(Entity.entity(scannedData, Constants.MEDIATYPE_PROTOBUF));
|
||||||
|
BoolValue b = response.readEntity(BoolValue.class);
|
||||||
|
response.close();
|
||||||
|
|
||||||
|
if (b.getValue()) {
|
||||||
|
command.getCallback().onSuccess(null);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
command.getCallback().onFailure(new IOException());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void doCancel(CancelOutputCommand command) {
|
||||||
|
logger.debug("entered method doCancel");
|
||||||
|
signedEncryptedBallot = null;
|
||||||
|
command.getCallback().onSuccess(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package meerkat.voting.output;
|
||||||
|
|
||||||
|
import com.google.protobuf.BoolValue;
|
||||||
|
import meerkat.pollingstation.PollingStationScanner;
|
||||||
|
import meerkat.protobuf.PollingStation.*;
|
||||||
|
import meerkat.rest.*;
|
||||||
|
|
||||||
|
import javax.ws.rs.client.*;
|
||||||
|
|
||||||
|
import static meerkat.pollingstation.PollingStationConstants.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by hai on 27/06/16.
|
||||||
|
*/
|
||||||
|
public class NetworkVirtualPrinter implements PollingStationScanner.Producer {
|
||||||
|
|
||||||
|
WebTarget successfulScanPath;
|
||||||
|
WebTarget errorPath;
|
||||||
|
|
||||||
|
public NetworkVirtualPrinter(String address) {
|
||||||
|
Client client = ClientBuilder.newClient();
|
||||||
|
client.register(ProtobufMessageBodyReader.class);
|
||||||
|
client.register(ProtobufMessageBodyWriter.class);
|
||||||
|
successfulScanPath = client.target(address).path(POLLING_STATION_WEB_SCANNER_SCAN_PATH);
|
||||||
|
errorPath = client.target(address).path(POLLING_STATION_WEB_SCANNER_ERROR_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BoolValue newScan(ScannedData scannedData) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BoolValue reportScanError(ErrorMsg errorMsg) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue