JAL-3878 Implement prot. seq. an. discovery for slivka.
[jalview.git] / src / jalview / ws2 / client / api / AbstractWebServiceDiscoverer.java
index a526e72..6a81410 100644 (file)
@@ -133,6 +133,7 @@ public abstract class AbstractWebServiceDiscoverer implements WebServiceDiscover
   @Override
   public synchronized final CompletableFuture<List<WebService<?>>> startDiscoverer()
   {
+    Cache.log.debug("Requesting service discovery");
     while (true)
     {
       if (state.get() == AGAIN)
@@ -141,18 +142,19 @@ public abstract class AbstractWebServiceDiscoverer implements WebServiceDiscover
       }
       if (state.compareAndSet(END, BEGIN) || state.compareAndSet(BEGIN, AGAIN))
       {
+        Cache.log.debug("State changed to " + state.get());
         final var oldTask = discoveryTask;
         CompletableFuture<List<WebService<?>>> task = oldTask
             .handleAsync((_r, _e) -> {
               Cache.log.info("Reloading services for " + this);
-              fireServicesChanged(Collections.emptyList());
+              fireServicesChanged(services = Collections.emptyList());
               var allServices = new ArrayList<WebService<?>>();
               for (var url : getUrls())
               {
                 Cache.log.info("Fetching list of services from " + url);
                 try
                 {
-                  allServices.addAll(getServices(url));
+                  allServices.addAll(fetchServices(url));
                 }
                 catch (IOException e)
                 {
@@ -161,24 +163,29 @@ public abstract class AbstractWebServiceDiscoverer implements WebServiceDiscover
               }
               return services = allServices;
             });
-        task.thenAccept(services -> {
+        task.<Void>handle((services, exception) -> {
           while (true)
           {
             if (state.get() == END)
               // should never happen, throw exception to break the loop just in case
               throw new AssertionError();
             if (state.compareAndSet(BEGIN, END) || state.compareAndSet(AGAIN, BEGIN))
+              Cache.log.debug("Discovery ended, state is " + state.get());
               break;
           }
-          fireServicesChanged(services);
+          if (services != null)
+            fireServicesChanged(services);
+          return null;
         });
+        Cache.log.debug("Spawned task " + task);
+        Cache.log.debug("Killing task " + oldTask);
         oldTask.cancel(false);
         return discoveryTask = task;
       }
     }
   }
   
-  protected abstract List<WebService<?>> getServices(URL url) throws IOException;
+  protected abstract List<WebService<?>> fetchServices(URL url) throws IOException;
   
   private List<ServicesChangeListener> listeners = new ArrayList<>();