+ JMenu alignmentMenu = new JMenu("Sequence Alignment");
+ slivkaMenu.add(alignmentMenu);
+ JMenu disorderMenu = new JMenu("Protein sequence analysis");
+ slivkaMenu.add(disorderMenu);
+ JMenu conservationMenu = new JMenu("Conservation");
+ slivkaMenu.add(conservationMenu);
+ PreferredServiceRegistry.getRegistry().populateWSMenuEntry(services,
+ changeSupport, slivkaMenu, alignFrame, null);
+
+ }
+
+ volatile boolean ready = false;
+
+ volatile Thread discovererThread = null;
+
+ private class DiscovererThread extends Thread
+ {
+ private Thread oldThread;
+
+ DiscovererThread(Thread oldThread)
+ {
+ super();
+ this.oldThread = oldThread;
+ }
+
+ @Override
+ public void run()
+ {
+ if (oldThread != null)
+ {
+ oldThread.interrupt();
+ try
+ {
+ oldThread.join();
+ } catch (InterruptedException e)
+ {
+ return;
+ } finally
+ {
+ oldThread = null;
+ }
+ }
+ ready = false;
+ reloadServices();
+ ready = !isInterrupted();
+ }
+ }
+
+ Thread discoverer = null;
+
+ @Override
+ public Thread startDiscoverer(PropertyChangeListener changeListener)
+ {
+ changeSupport.addPropertyChangeListener(changeListener);
+ ready = false;
+ (discovererThread = new DiscovererThread(discovererThread)).start();
+ return discovererThread;
+ }
+
+ private void reloadServices()
+ {
+ Cache.log.info("Reloading Slivka services");
+ changeSupport.firePropertyChange("services", services, List.of());
+ ArrayList<ServiceWithParameters> instances = new ArrayList<>();
+
+ for (String url : getServiceUrls())