JAL-3807 - Move new JPred client to the jws2 package.
[jalview.git] / src / jalview / ws / jws2 / JPredClient.java
1 package jalview.ws.jws2;
2
3 import javax.swing.JMenuItem;
4
5 import jalview.analysis.SeqsetUtils;
6 import jalview.bin.Cache;
7 import jalview.datamodel.AlignmentView;
8 import jalview.datamodel.SequenceI;
9 import jalview.gui.AlignFrame;
10 import jalview.ws.WSClient;
11 import jalview.ws.WSMenuEntryProviderI;
12 import jalview.ws.api.JPredMutlipleAlignmentServiceI;
13 import jalview.ws.api.ServiceWithParameters;
14
15 public class JPredClient extends WSClient
16 {
17   JPredMutlipleAlignmentServiceI server;
18
19   public JPredClient(ServiceWithParameters sh, String title,
20       AlignmentView alView, AlignFrame alFrame, boolean viewOnly)
21   {
22     server = (JPredMutlipleAlignmentServiceI) sh.getEndpoint();
23     wsInfo = setWebService(sh, false);
24     startClient(title, alView, alFrame, viewOnly);
25   }
26
27   private void startClient(String title, AlignmentView view,
28       AlignFrame frame, boolean viewOnly)
29   {
30     var msf = view.getSequences();
31     var seq = msf[0].getSeq('-');
32     if (msf.length <= 1)
33       throw new RuntimeException("You need more than one sequence.");
34     var aln = new SequenceI[msf.length];
35     for (int i = 0; i < msf.length; i++)
36     {
37       aln[i] = msf[i].getSeq('-');
38     }
39     int[] delMap = viewOnly ?
40       view.getVisibleContigMapFor(seq.gapMap()) : null;
41     var sequenceInfo = SeqsetUtils.uniquify(aln, true);
42     var thread = new JPredThread(wsInfo, title, server, sequenceInfo, aln,
43         delMap, view, frame, WsURL);
44     wsInfo.setthisService(thread);
45     wsInfo.setVisible(true);
46     thread.start();
47   }
48
49   // sh parameter should be moved to the WSMenuEntryProvider interface
50   public static WSMenuEntryProviderI getMenuEntryProvider(ServiceWithParameters sh)
51   {
52     return (menu, frame) -> {
53       final JMenuItem mi = new JMenuItem(sh.getName());
54       mi.setToolTipText(sh.getHostURL());
55       mi.addActionListener((event) -> {
56         var view = frame.gatherSeqOrMsaForSecStrPrediction();
57         if (view.getSequences().length > 1)
58         {
59           new JPredClient(sh, frame.getTitle(), view, frame, true);
60         }
61         else
62         {
63           Cache.log.error("Single sequence not supported");
64         }
65       });
66       menu.add(mi);
67     };
68   }
69 }