8ddd28f1903fed436ee43952eadd7ecdc0662274
[jalview.git] / src / jalview / gui / WsPreferences.java
1 package jalview.gui;
2
3 import java.awt.BorderLayout;
4 import java.awt.event.ActionEvent;
5 import java.net.URL;
6 import java.util.Vector;
7
8 import javax.swing.JCheckBox;
9 import javax.swing.JLabel;
10 import javax.swing.JOptionPane;
11 import javax.swing.JPanel;
12 import javax.swing.JTextField;
13
14 import jalview.bin.Cache;
15 import jalview.jbgui.GWsPreferences;
16
17 public class WsPreferences extends GWsPreferences
18 {
19
20   public WsPreferences()
21   {
22     super();
23     initFromPreferences();
24   }
25
26   Vector<String> wsUrls,oldUrls;
27   private boolean needWsMenuUpdate;
28   private boolean oldJws1,oldJws2,oldIndexByHost,oldIndexByType,oldEnfin;
29   private void initFromPreferences()
30   {
31
32     wsUrls = jalview.ws.jws2.Jws2Discoverer.getServiceUrls();
33     if (wsUrls!=null) {
34       oldUrls = new Vector<String>(wsUrls);
35     } else {
36       oldUrls=null;
37       wsUrls=new Vector<String>();
38     }
39     updateList();
40     enableEnfinServices.setSelected(oldEnfin=Cache.getDefault(
41             "SHOW_ENFIN_SERVICES", true));
42     enableJws1Services.setSelected(oldJws1=Cache.getDefault("SHOW_JWS1_SERVICES",
43             true));
44     enableJws2Services.setSelected(oldJws2=Cache.getDefault("SHOW_JWS2_SERVICES",
45             true));
46     indexByHost.setSelected(oldIndexByHost=Cache.getDefault("WSMENU_BYHOST", true));
47     indexByType.setSelected(oldIndexByType=Cache.getDefault("WSMENU_BYTYPE", true));
48   }
49   private void updateList() {
50     wsList.setListData(wsUrls);
51   }
52   private void updateServiceList() {
53     jalview.ws.jws2.Jws2Discoverer.setServiceUrls(wsUrls);
54   }
55   /* (non-Javadoc)
56    * @see jalview.jbgui.GWsPreferences#deleteWsUrl_actionPerformed(java.awt.event.ActionEvent)
57    */
58   @Override
59   protected void deleteWsUrl_actionPerformed(ActionEvent e)
60   {
61     int sel = wsList.getSelectedIndex();
62     if (sel>-1)
63     {
64       wsUrls.removeElementAt(sel);
65       updateList();
66     }
67   }
68
69   /* (non-Javadoc)
70    * @see jalview.jbgui.GWsPreferences#editWsUrl_actionPerformed(java.awt.event.ActionEvent)
71    */
72   @Override
73   protected void editWsUrl_actionPerformed(ActionEvent e)
74   {
75     int sel = wsList.getSelectedIndex();
76     if (sel>-1)
77     {
78       String url=editUrl(wsUrls.elementAt(sel),"Edit JWS2 URL");
79       if (url!=null)
80       {
81         int present = wsUrls.indexOf(url);
82         if (present==-1)
83         {
84           wsUrls.setElementAt(url,sel);
85           updateList();
86         } else {
87           if (present!=sel)
88           {
89             wsUrls.removeElementAt(sel);
90             updateList();
91           }
92         }
93       }
94     }
95   }
96   
97   void updateWsMenuConfig(boolean old) {
98     if (old) {
99       wsUrls = (oldUrls==null) ? null : new Vector(oldUrls);
100     } else {
101       
102     }
103     Cache.setProperty("SHOW_ENFIN_SERVICES", Boolean.valueOf(old ? oldEnfin : enableEnfinServices.isSelected()).toString());
104     Cache.setProperty("SHOW_JWS1_SERVICES", Boolean.valueOf(old ? oldJws1 : enableJws1Services.isSelected()).toString());
105     Cache.setProperty("SHOW_JWS2_SERVICES", Boolean.valueOf(old ? oldJws2 : enableJws2Services.isSelected()).toString());
106     Cache.setProperty("WSMENU_BYHOST", Boolean.valueOf(old ? oldIndexByHost : indexByHost.isSelected()).toString());
107     Cache.setProperty("WSMENU_BYTYPE", Boolean.valueOf(old ? oldIndexByType : indexByType.isSelected()).toString());
108     updateServiceList();
109   }
110   
111   /* (non-Javadoc)
112    * @see jalview.jbgui.GWsPreferences#moveWsUrlDown_actionPerformed(java.awt.event.ActionEvent)
113    */
114   @Override
115   protected void moveWsUrlDown_actionPerformed(ActionEvent e)
116   {
117     int p=wsList.getSelectedIndex();
118     if (p>-1 && p<wsUrls.size()-1)
119     {
120       String t = wsUrls.get(p+1);
121       wsUrls.setElementAt(wsUrls.elementAt(p), p+1);
122       wsUrls.setElementAt(t, p);
123       updateList();
124       wsList.setSelectedIndex(p+1);
125     }
126   }
127
128   /* (non-Javadoc)
129    * @see jalview.jbgui.GWsPreferences#moveWsUrlUp_actionPerformed(java.awt.event.ActionEvent)
130    */
131   @Override
132   protected void moveWsUrlUp_actionPerformed(ActionEvent e)
133   {
134     int p=wsList.getSelectedIndex();
135     if (p>0)
136     {
137       String t = wsUrls.get(p-1);
138       wsUrls.setElementAt(wsUrls.elementAt(p), p-1);
139       wsUrls.setElementAt(t, p);
140       updateList();
141       wsList.setSelectedIndex(p-1);
142     }
143   }
144
145   private String editUrl(String initUrl, String title)
146   {
147     String url=initUrl;
148     URL foo=null;
149     if (url==null)
150     {
151       url = "";
152     }
153     JTextField urltf = new JTextField(url, 40);
154     JPanel panel = new JPanel(new BorderLayout());
155     JPanel pane12 = new JPanel(new BorderLayout());
156     pane12.add(new JLabel("URL: "), BorderLayout.CENTER);
157     pane12.add(urltf, BorderLayout.EAST);
158     panel.add(pane12, BorderLayout.NORTH);
159     boolean valid=false;
160     int resp=JOptionPane.CANCEL_OPTION;
161     while (!valid && (resp=JOptionPane.showInternalConfirmDialog(Desktop.desktop, panel, title, JOptionPane.OK_CANCEL_OPTION))==JOptionPane.OK_OPTION)
162     {
163       try {
164         // TODO: do a better job of checking that the url is a valid discovery URL for web services.
165         foo = new URL(urltf.getText().trim());
166         valid = true;
167       } catch (Exception e)
168       {
169         valid = false;
170         JOptionPane.showInternalMessageDialog(Desktop.desktop, "Invalid URL !");
171       }
172     }
173     if (valid && resp==JOptionPane.OK_OPTION)
174     {
175       int validate = JOptionPane.showInternalConfirmDialog(Desktop.desktop, "Validate JabaWS Server ?\n(Look in console output for results)", "Test Server?", JOptionPane.YES_NO_OPTION);
176       if (validate == JOptionPane.OK_OPTION)
177       {
178         if (jalview.ws.jws2.Jws2Discoverer.testServiceUrl(foo)) 
179         {
180           return foo.toString();
181         } else {
182           JOptionPane.showInternalMessageDialog(Desktop.desktop, "Service did not pass validation.\nCheck the Jalview Console for more details.");
183         }
184       } else {
185         // just return the URL anyway
186         return foo.toString();
187       }
188     }
189     return initUrl; 
190   }
191   /* (non-Javadoc)
192    * @see jalview.jbgui.GWsPreferences#newWsUrl_actionPerformed(java.awt.event.ActionEvent)
193    */
194   @Override
195   protected void newWsUrl_actionPerformed(ActionEvent e)
196   {
197     String url=editUrl(null,"Add new JWS2 URL");
198     if (url!=null)
199     {
200       if (!wsUrls.contains(url))
201       {
202         int selind = wsList.getSelectedIndex();
203         if (selind>-1)
204         {
205           wsUrls.insertElementAt(url, selind);
206         } else {
207           wsUrls.addElement(url);
208         }
209         updateList();
210       }
211     }
212   }
213
214   /* (non-Javadoc)
215    * @see jalview.jbgui.GWsPreferences#refreshWs_actionPerformed(java.awt.event.ActionEvent)
216    */
217   @Override
218   protected void refreshWs_actionPerformed(ActionEvent e)
219   {
220     new Thread(new Runnable() {
221
222       public void run()
223       {
224         updateWsMenuConfig(false);
225         refreshWsMenu(true);
226       }      
227     }).start();
228     
229   }
230   /**
231    * 
232    * @param showProgress show progress in dialog or on desktop
233    */
234   protected void refreshWsMenu(boolean showProgress)
235   {
236     if (showProgress)
237     {
238       new Thread(new Runnable() {
239
240         public void run()
241         {
242           progressBar.setVisible(true);
243           validate();
244           progressBar.setIndeterminate(true);
245           Desktop.instance.startServiceDiscovery(true); // wait around for all threads to complete
246           progressBar.setIndeterminate(false);
247           progressBar.setVisible(false);
248           validate();
249         }      
250       }).start();
251       
252     } else {
253       new Thread(new Runnable() {
254
255         public void run()
256         {
257           long ct = System.currentTimeMillis();
258           Desktop.instance.setProgressBar("Refreshing Web Service Menus", ct);
259           Desktop.instance.startServiceDiscovery(true);
260           Desktop.instance.setProgressBar("Refreshing Web Service Menus", ct);
261         }
262         
263       }).start();
264     }
265   }
266
267   /* (non-Javadoc)
268    * @see jalview.jbgui.GWsPreferences#resetWs_actionPerformed(java.awt.event.ActionEvent)
269    */
270   @Override
271   protected void resetWs_actionPerformed(ActionEvent e)
272   {
273     jalview.ws.jws2.Jws2Discoverer.setServiceUrls(null);
274     wsUrls = jalview.ws.jws2.Jws2Discoverer.getServiceUrls(); 
275     updateList();
276   }
277   protected void ok_ActionPerformed(ActionEvent e) {
278     // update everything regardless.
279     updateAndRefreshWsMenuConfig(false);
280   }
281   public void updateAndRefreshWsMenuConfig(final boolean showProgressInDialog)
282   {
283     new Thread(new Runnable() {
284
285       public void run()
286       {
287         updateWsMenuConfig(false);
288         refreshWsMenu(showProgressInDialog);
289       }      
290     }).start();
291     
292   }
293 }