JAL-3070 slivka service discovery as a background thread - still need to unify Jabaws...
[jalview.git] / src / jalview / ws / slivkaws / SlivkaWSDiscoverer.java
1 package jalview.ws.slivkaws;
2
3 import jalview.gui.AlignFrame;
4 import jalview.ws.WSMenuEntryProviderI;
5 import jalview.ws.api.ServiceWithParameters;
6 import jalview.ws.jws2.PreferredServiceRegistry;
7
8 import java.beans.PropertyChangeSupport;
9 import java.io.IOError;
10 import java.io.IOException;
11 import java.net.URISyntaxException;
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import javax.swing.JMenu;
16
17 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
18 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
19
20 public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI
21 {
22   private static SlivkaWSDiscoverer instance = null;
23
24   private SlivkaClient slivkaClient;
25
26   private SlivkaWSDiscoverer()
27   {
28     try
29     {
30       slivkaClient = new SlivkaClient("localhost", 4954);
31     } catch (URISyntaxException e)
32     {
33       throw new RuntimeException(e);
34     }
35   }
36
37   public static SlivkaWSDiscoverer getInstance()
38   {
39     if (instance == null)
40     {
41       instance = new SlivkaWSDiscoverer();
42     }
43     return instance;
44   }
45
46   List<ServiceWithParameters> getServiceInstances()
47   {
48     List<ServiceWithParameters> instances = new ArrayList<>();
49     for (SlivkaService service : services)
50     {
51       for (String classifier : service.classifiers)
52       {
53         if (classifier.contains("Multiple sequence alignment"))
54         {
55           instances
56                   .add(new SlivkaMsaServiceInstance(slivkaClient, service));
57         }
58         else if (classifier.contains("Protein sequence analysis"))
59         {
60           instances.add(new SlivkaAnnotationServiceInstance(slivkaClient,
61                   service, false));
62         }
63         else if (classifier
64                 .contains("Sequence alignment analysis (conservation)"))
65         {
66           instances.add(new SlivkaAnnotationServiceInstance(slivkaClient,
67                   service, true));
68         }
69
70       }
71     }
72     return instances;
73   }
74
75   private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
76           this);
77
78   @Override
79   public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
80   {
81     JMenu slivkaMenu = new JMenu("Slivka");
82     wsmenu.add(slivkaMenu);
83
84     JMenu alignmentMenu = new JMenu("Sequence Alignment");
85     slivkaMenu.add(alignmentMenu);
86     JMenu disorderMenu = new JMenu("Protein sequence analysis");
87     slivkaMenu.add(disorderMenu);
88     JMenu conservationMenu = new JMenu("Conservation");
89     slivkaMenu.add(conservationMenu);
90     PreferredServiceRegistry.getRegistry().populateWSMenuEntry(
91             getServiceInstances(),
92               changeSupport, slivkaMenu, alignFrame, null);
93     
94   }
95
96   List<SlivkaService>services=null;
97
98   volatile boolean started = false, finished = false;
99
100   Thread discoverer = null;
101   @Override
102   public void run()
103   {
104     discoverer = Thread.currentThread();
105     started = true;
106     try
107     {
108       services = slivkaClient.getServices();
109     } catch (IOException e)
110     {
111       throw new IOError(e);
112     }
113     finished = true;
114   }
115
116   public static List<ServiceWithParameters> getServices()
117   {
118     SlivkaWSDiscoverer us = getInstance();
119     if (us.services == null)
120     {
121       us.run();
122     }
123     return us.getServiceInstances();
124   }
125
126   public boolean hasServices()
127   {
128     return finished == true && services != null && services.size() > 0;
129   }
130
131   public boolean isRunning()
132   {
133     return discoverer != null && discoverer.isAlive();
134   }
135 }