JAL-3070 reinstate the internal test service URL for Slivka-bio
[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   List<ServiceWithParameters> getServiceInstances()
48   {
49     List<ServiceWithParameters> instances = new ArrayList<>();
50     for (SlivkaService service : services)
51     {
52       for (String classifier : service.classifiers)
53       {
54         if (classifier.contains("Multiple sequence alignment"))
55         {
56           instances
57                   .add(new SlivkaMsaServiceInstance(slivkaClient, service));
58         }
59         else if (classifier.contains("Protein sequence analysis"))
60         {
61           instances.add(new SlivkaAnnotationServiceInstance(slivkaClient,
62                   service, false));
63         }
64         else if (classifier
65                 .contains("Sequence alignment analysis (conservation)"))
66         {
67           instances.add(new SlivkaAnnotationServiceInstance(slivkaClient,
68                   service, true));
69         }
70
71       }
72     }
73     return instances;
74   }
75
76   private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
77           this);
78
79   @Override
80   public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
81   {
82     JMenu slivkaMenu = new JMenu("Slivka");
83     wsmenu.add(slivkaMenu);
84
85     JMenu alignmentMenu = new JMenu("Sequence Alignment");
86     slivkaMenu.add(alignmentMenu);
87     JMenu disorderMenu = new JMenu("Protein sequence analysis");
88     slivkaMenu.add(disorderMenu);
89     JMenu conservationMenu = new JMenu("Conservation");
90     slivkaMenu.add(conservationMenu);
91     PreferredServiceRegistry.getRegistry().populateWSMenuEntry(
92             getServiceInstances(),
93               changeSupport, slivkaMenu, alignFrame, null);
94     
95   }
96
97   List<SlivkaService>services=null;
98
99   volatile boolean started = false, finished = false;
100
101   Thread discoverer = null;
102   @Override
103   public void run()
104   {
105     discoverer = Thread.currentThread();
106     started = true;
107     try
108     {
109       services = slivkaClient.getServices();
110     } catch (IOException e)
111     {
112       throw new IOError(e);
113     }
114     finished = true;
115   }
116
117   public static List<ServiceWithParameters> getServices()
118   {
119     SlivkaWSDiscoverer us = getInstance();
120     if (us.services == null)
121     {
122       us.run();
123     }
124     return us.getServiceInstances();
125   }
126
127   public boolean hasServices()
128   {
129     return finished == true && services != null && services.size() > 0;
130   }
131
132   public boolean isRunning()
133   {
134     return discoverer != null && discoverer.isAlive();
135   }
136 }