fix STOP server
[fanfix.git] / src / be / nikiroo / fanfix / library / WebLibraryServer.java
index 9073b8cad58895f02ccbd88d2a8d2a9deebf6397..22f36e91f5729a7bfef72fe9c98d2a7fa157a6ec 100644 (file)
@@ -70,6 +70,8 @@ public class WebLibraryServer extends WebLibraryServerHtml {
 
        private Map<String, Progress> imprts = new HashMap<String, Progress>();
 
+       private boolean exiting;
+
        public WebLibraryServer(boolean secure) throws IOException {
                super(secure);
 
@@ -97,6 +99,56 @@ public class WebLibraryServer extends WebLibraryServerHtml {
                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);
@@ -304,6 +356,11 @@ public class WebLibraryServer extends WebLibraryServerHtml {
                                        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];
 
@@ -384,6 +441,11 @@ public class WebLibraryServer extends WebLibraryServerHtml {
                                        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];
 
@@ -410,6 +472,11 @@ public class WebLibraryServer extends WebLibraryServerHtml {
                                        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();
@@ -477,6 +544,11 @@ public class WebLibraryServer extends WebLibraryServerHtml {
                                        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();