JAL-3066 hack to instantiate the correct client according to slivka service annotatio...
[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(
31               "gjb-www-1.cluster.lifesci.dundee.ac.uk", 3203);
32     } catch (URISyntaxException e)
33     {
34       throw new RuntimeException(e);
35     }
36   }
37
38   public static SlivkaWSDiscoverer getInstance()
39   {
40     if (instance == null)
41     {
42       instance = new SlivkaWSDiscoverer();
43     }
44     return instance;
45   }
46
47   /**
48    * TODO: tests needed for logic for determining type of each discovered
49    * service. Then reimplement this routine !
50    * 
51    * @return (MSA instances, one AAUI type instance, and the remaining all
52    *         sequence analysis instances taking 1 sequence only)
53    */
54   List<ServiceWithParameters> getServiceInstances()
55   {
56     List<ServiceWithParameters> instances = new ArrayList<>();
57     for (SlivkaService service : services)
58     {
59       ServiceWithParameters newinstance = null;
60       for (String classifier : service.classifiers)
61       {
62         if (classifier.contains("Multiple sequence alignment"))
63         {
64           // MSA services always overwrite
65           newinstance = new SlivkaMsaServiceInstance(slivkaClient, service);
66         }
67         if (classifier.contains("Protein sequence analysis"))
68         {
69           if (newinstance == null)
70             {
71               newinstance = (new SlivkaAnnotationServiceInstance(
72                       slivkaClient,
73
74                       service, false));
75             }
76           }
77
78         if (classifier
79                 .contains("Sequence alignment analysis (conservation)"))
80         {
81           // always overwrite other instances
82           newinstance = new SlivkaAnnotationServiceInstance(slivkaClient,
83                   service, true);
84         }
85       }
86       if (newinstance != null)
87       {
88         instances.add(newinstance);
89       }
90     }
91     return instances;
92   }
93
94   private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
95           this);
96
97   @Override
98   public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
99   {
100     JMenu slivkaMenu = new JMenu("Slivka");
101     wsmenu.add(slivkaMenu);
102
103     JMenu alignmentMenu = new JMenu("Sequence Alignment");
104     slivkaMenu.add(alignmentMenu);
105     JMenu disorderMenu = new JMenu("Protein sequence analysis");
106     slivkaMenu.add(disorderMenu);
107     JMenu conservationMenu = new JMenu("Conservation");
108     slivkaMenu.add(conservationMenu);
109     PreferredServiceRegistry.getRegistry().populateWSMenuEntry(
110             getServiceInstances(),
111               changeSupport, slivkaMenu, alignFrame, null);
112     
113   }
114
115   List<SlivkaService>services=null;
116
117   volatile boolean started = false, finished = false;
118
119   Thread discoverer = null;
120   @Override
121   public void run()
122   {
123     discoverer = Thread.currentThread();
124     started = true;
125     try
126     {
127       services = slivkaClient.getServices();
128     } catch (IOException e)
129     {
130       throw new IOError(e);
131     }
132     finished = true;
133   }
134
135   public static List<ServiceWithParameters> getServices()
136   {
137     SlivkaWSDiscoverer us = getInstance();
138     if (us.services == null)
139     {
140       us.run();
141     }
142     return us.getServiceInstances();
143   }
144
145   public boolean hasServices()
146   {
147     return finished == true && services != null && services.size() > 0;
148   }
149
150   public boolean isRunning()
151   {
152     return discoverer != null && discoverer.isAlive();
153   }
154 }