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