Created Polling Station Scanner interface

Implemented Web App for the scanner
Not tested
PollingStation-ScannerWebApp
arbel.peled 2016-05-05 16:55:10 +03:00
parent 1f8df95895
commit b934894bc5
7 changed files with 171 additions and 0 deletions

View File

@ -0,0 +1,15 @@
package meerkat.pollingstation;
/**
* Created by Arbel Deutsch Peled on 21-Dec-15.
*/
public interface PollingStationConstants {
// Relative addresses for Scanner operations
public static final String POLLING_STATION_WEB_SCANNER_PATH = "/scanner";
public static final String POLLING_STATION_WEB_SCANNER_SCAN_PATH = "/scan";
public static final String POLLING_STATION_WEB_SCANNER_ERROR_PATH = "/error";
}

View File

@ -0,0 +1,29 @@
package meerkat.pollingstation;
import com.google.common.util.concurrent.FutureCallback;
import meerkat.protobuf.PollingStation.*;
/**
* Created by Arbel on 05/05/2016.
* An interface for the scanner used by the Polling Station Committee
*/
public interface PollingStationScanner {
/**
* Subscribes to new scans
* @param scanCallback is the handler for scanned data
*/
public void subscribe(FutureCallback<ScannedData> scanCallback);
/**
* Sends a scan to all subscribers
* @param scannedData contains the scanned data
*/
public void newScan(ScannedData scannedData);
/**
* Notifies subscribers about an error that occurred during scan
* @param errorMsg is the error that occurred
*/
public void reportScanError(ErrorMsg errorMsg);
}

View File

@ -0,0 +1,15 @@
syntax = "proto3";
package meerkat;
option java_package = "meerkat.protobuf";
// Container for scanned data
message ScannedData {
bytes data = 1;
}
// Container for error messages
message ErrorMsg {
string msg = 1;
}

View File

@ -2,8 +2,10 @@
plugins {
id "us.kirchmeier.capsule" version "1.0.1"
id 'com.google.protobuf' version '0.7.0'
id 'org.akhikhl.gretty' version "1.2.4"
}
apply plugin: 'org.akhikhl.gretty'
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
@ -41,6 +43,13 @@ version += "${isSnapshot ? '-SNAPSHOT' : ''}"
dependencies {
// Meerkat common
compile project(':meerkat-common')
compile project(':restful-api-common')
// Jersey for RESTful API
compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.22.+'
// Servlets
compile 'javax.servlet:javax.servlet-api:3.0.+'
// Logging
compile 'org.slf4j:slf4j-api:1.7.7'

View File

@ -0,0 +1,71 @@
package meerkat.pollingstation;
import com.google.common.util.concurrent.FutureCallback;
import meerkat.protobuf.PollingStation;
import static meerkat.rest.Constants.*;
import javax.ws.rs.*;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import static meerkat.pollingstation.PollingStationConstants.*;
import meerkat.protobuf.PollingStation.*;
/**
* Created by Arbel on 05/05/2016.
*/
@Path(POLLING_STATION_WEB_SCANNER_PATH)
public class PollingStationWebScanner implements PollingStationScanner{
private final List<FutureCallback<ScannedData>> callbacks;
public PollingStationWebScanner() {
callbacks = new LinkedList<>();
}
@Override
public void subscribe(FutureCallback<ScannedData> scanCallback) {
callbacks.add(scanCallback);
}
@Path(POLLING_STATION_WEB_SCANNER_SCAN_PATH)
@POST
@Consumes(MEDIATYPE_PROTOBUF)
@Produces(MEDIATYPE_PROTOBUF)
@Override
public void newScan(ScannedData scannedData) {
if (callbacks.size() <= 0)
throw new RuntimeException("No subscribers to forward scan to!");
for (FutureCallback<ScannedData> callback : callbacks){
callback.onSuccess(scannedData);
}
}
@Path(POLLING_STATION_WEB_SCANNER_ERROR_PATH)
@POST
@Consumes(MEDIATYPE_PROTOBUF)
@Produces(MEDIATYPE_PROTOBUF)
@Override
public void reportScanError(PollingStation.ErrorMsg errorMsg) {
if (callbacks.size() <= 0)
throw new RuntimeException("No subscribers to forward error to!");
for (FutureCallback<ScannedData> callback : callbacks){
callback.onFailure(new IOException(errorMsg.getMsg()));
}
}
@Path("/test")
@GET
public String test(){
return "test";
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>
<Arg>none</Arg>
</Call>
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
<Arg>none</Arg>
</Call>
</Configure>

View File

@ -0,0 +1,20 @@
<web-app>
<servlet>
<servlet-name>Jersey Hello World</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>meerkat</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Hello World</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>meerkat.pollingstation.PollingStationWebScanner</listener-class>
</listener>
</web-app>