public class WebLibraryServer extends WebLibraryServerHtml {
class WLoginResult extends LoginResult {
- private boolean rw;
- private boolean wl;
- private boolean bl;
-
public WLoginResult(boolean badLogin, boolean badCookie) {
super(badLogin, badCookie);
}
boolean wl, boolean bl) {
super(who, key, subkey, (rw ? "|rw" : "") + (wl ? "|wl" : "")
+ (bl ? "|bl" : "") + "|");
- this.rw = rw;
- this.wl = wl;
- this.bl = bl;
}
public WLoginResult(String cookie, String who, String key,
private Map<String, Progress> imprts = new HashMap<String, Progress>();
+ private boolean exiting;
+
public WebLibraryServer(boolean secure) throws IOException {
super(secure);
new Thread(this).start();
}
+ @Override
+ protected Response stop(WLoginResult login) {
+ if (!login.isRw()) {
+ return NanoHTTPD.newFixedLengthResponse(Status.FORBIDDEN,
+ NanoHTTPD.MIME_PLAINTEXT, "Exit not allowed");
+ }
+
+ if (exiting) {
+ return NanoHTTPD.newFixedLengthResponse(Status.SERVICE_UNAVAILABLE,
+ NanoHTTPD.MIME_PLAINTEXT, "Server is already exiting...");
+ }
+
+ exiting = true;
+ Instance.getInstance().getTraceHandler().trace("Exiting");
+
+ boolean ok;
+ do {
+ synchronized (imprts) {
+ ok = imprts.isEmpty();
+ }
+ if (!ok) {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ Instance.getInstance().getTraceHandler()
+ .trace("Waiting to exit...");
+ }
+ }
+ } while (!ok);
+
+ doStop();
+
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(1500);
+ } catch (InterruptedException e) {
+ }
+
+ Instance.getInstance().getTraceHandler()
+ .trace("Exit timeout: force-quit");
+ System.exit(0);
+ }
+ }, "Exit program after timeout of 1500 ms").start();
+
+ return NanoHTTPD.newFixedLengthResponse(Status.OK,
+ NanoHTTPD.MIME_PLAINTEXT, "Exited");
+ }
+
@Override
protected WLoginResult login(boolean badLogin, boolean badCookie) {
return new WLoginResult(false, false);
NanoHTTPD.MIME_PLAINTEXT, "Invalid story part request");
}
+ if (!login.isRw()) {
+ return NanoHTTPD.newFixedLengthResponse(Status.FORBIDDEN,
+ NanoHTTPD.MIME_PLAINTEXT, "SET story part not allowed");
+ }
+
+ if (exiting) {
+ return NanoHTTPD.newFixedLengthResponse(Status.SERVICE_UNAVAILABLE,
+ NanoHTTPD.MIME_PLAINTEXT, "Server is exiting...");
+ }
+
String luid = uriParts[off + 0];
String type = uriParts[off + 1];
NanoHTTPD.MIME_PLAINTEXT, "Invalid cover request");
}
+ if (!login.isRw()) {
+ return NanoHTTPD.newFixedLengthResponse(Status.FORBIDDEN,
+ NanoHTTPD.MIME_PLAINTEXT, "Cover request not allowed");
+ }
+
+ if (exiting) {
+ return NanoHTTPD.newFixedLengthResponse(Status.SERVICE_UNAVAILABLE,
+ NanoHTTPD.MIME_PLAINTEXT, "Server is exiting...");
+ }
+
String type = uriParts[off + 0];
String id = uriParts[off + 1];
throws IOException {
final BasicLibrary lib = Instance.getInstance().getLibrary();
+ if (!login.isRw()) {
+ return NanoHTTPD.newFixedLengthResponse(Status.FORBIDDEN,
+ NanoHTTPD.MIME_PLAINTEXT, "Import not allowed");
+ }
+
+ if (exiting) {
+ return NanoHTTPD.newFixedLengthResponse(Status.SERVICE_UNAVAILABLE,
+ NanoHTTPD.MIME_PLAINTEXT, "Server is exiting...");
+ }
+
final URL url = new URL(urlStr);
final Progress pg = new Progress();
final String luid = lib.getNextId();
@Override
public void run() {
try {
- lib.imprt(url, pg);
+ lib.imprt(url, luid, pg);
} catch (IOException e) {
Instance.getInstance().getTraceHandler().error(e);
} finally {
}
}, "Import story: " + urlStr).start();
- lib.imprt(url, pg);
-
return NanoHTTPD.newFixedLengthResponse(Status.OK,
NanoHTTPD.MIME_PLAINTEXT, luid);
}
return newInputStreamResponse(NanoHTTPD.MIME_PLAINTEXT, null);
}
+ @Override
+ protected Response delete(String uri, WLoginResult login)
+ throws IOException {
+ String[] uriParts = uri.split("/");
+ int off = 2; // "" and "delete"
+
+ if (uriParts.length < off + 1) {
+ return NanoHTTPD.newFixedLengthResponse(Status.BAD_REQUEST,
+ NanoHTTPD.MIME_PLAINTEXT, "Invalid delete request");
+ }
+
+ if (!login.isRw()) {
+ return NanoHTTPD.newFixedLengthResponse(Status.FORBIDDEN,
+ NanoHTTPD.MIME_PLAINTEXT, "Delete not allowed");
+ }
+
+ if (exiting) {
+ return NanoHTTPD.newFixedLengthResponse(Status.SERVICE_UNAVAILABLE,
+ NanoHTTPD.MIME_PLAINTEXT, "Server is exiting...");
+ }
+
+ String luid = uriParts[off + 0];
+
+ BasicLibrary lib = Instance.getInstance().getLibrary();
+ lib.delete(luid);
+
+ return newInputStreamResponse(NanoHTTPD.MIME_PLAINTEXT, null);
+ }
+
@Override
protected List<MetaData> metas(WLoginResult login) throws IOException {
BasicLibrary lib = Instance.getInstance().getLibrary();