- for (SlivkaService service: client.getServices()) {
- msaClassifier: {
- for (String classifier: service.classifiers) {
- if (classifier.contains("Multiple sequence alignment")) {
- break msaClassifier;
- }
- }
- continue;
- }
- SlivkaWSInstance instance = new SlivkaWSInstance(client, service);
- JMenuItem defaultEntry = new JMenuItem(String.format("%s with defaults", service.label));
- defaultEntry.addActionListener((ActionEvent evt) -> {
- AlignmentView msa = alignFrame.gatherSequencesForAlignment();
- if (msa != null) {
- new MsaWSClient(
- instance, alignFrame.getTitle(), msa, false, true,
- alignFrame.getViewport().getAlignment().getDataset(),
- alignFrame
- );
- }
- });
- categoryMenu.add(defaultEntry);
-
- JMenuItem customEntry = new JMenuItem(String.format("%s with custom parameters", service.label));
- customEntry.addActionListener((ActionEvent evt) -> {
- AlignmentView msa = alignFrame.gatherSequencesForAlignment();
- if (msa != null) {
- try
- {
- SlivkaParamSet paramSet = new SlivkaParamSet(service);
- new MsaWSClient(
- instance, paramSet, null, true, alignFrame.getTitle(), msa, false, true,
- alignFrame.getViewport().getAlignment().getDataset(), alignFrame);
- } catch (IOException exc)
+ listener.servicesChanged(this, services);
+ }
+ }
+
+ private final ExecutorService executor = Executors
+ .newSingleThreadExecutor();
+
+ private Vector<Future<?>> discoveryTasks = new Vector<>();
+
+ public CompletableFuture<WSDiscovererI> startDiscoverer()
+ {
+ CompletableFuture<WSDiscovererI> task = CompletableFuture
+ .supplyAsync(() -> {
+ reloadServices();
+ return SlivkaWSDiscoverer.this;
+ }, executor);
+ discoveryTasks.add(task);
+ return task;
+ }
+
+ private List<ServiceWithParameters> reloadServices()
+ {
+ Console.info("Reloading Slivka services");
+ notifyServiceListeners(Collections.emptyList());
+ ArrayList<ServiceWithParameters> instances = new ArrayList<>();
+
+ for (String url : getServiceUrls())
+ {
+ SlivkaClient client = new SlivkaClient(url);
+
+ List<SlivkaService> services;
+ try
+ {
+ services = client.getServices();
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ continue;
+ }
+ for (SlivkaService service : services)
+ {
+ SlivkaWSInstance newInstance = null;
+ for (String classifier : service.classifiers)
+ {
+ String[] path = classifier.split("\\s*::\\s*");
+ if (path.length >= 3 && path[0].toLowerCase().equals("operation")
+ && path[1].toLowerCase().equals("analysis"))
+ {
+ switch (path[path.length - 1].toLowerCase())