debug dialog
[jalview.git] / src / jalview / gui / RestServiceEditorPane.java
1 package jalview.gui;
2
3 import jalview.bin.Cache;
4 import jalview.io.packed.DataProvider.JvDataType;
5 import jalview.jbgui.*;
6 import jalview.ws.rest.InputType;
7 import jalview.ws.rest.RestServiceDescription;
8
9 import java.awt.*;
10 import java.awt.event.ComponentEvent;
11 import java.awt.event.ComponentListener;
12 import java.awt.event.ContainerEvent;
13 import java.awt.event.ContainerListener;
14 import java.awt.event.KeyEvent;
15 import java.awt.event.KeyListener;
16 import java.awt.event.WindowEvent;
17 import java.awt.event.WindowListener;
18 import java.awt.event.WindowStateListener;
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.Map;
22 import java.util.Vector;
23 import java.util.regex.Matcher;
24 import java.util.regex.Pattern;
25
26 import javax.swing.*;
27 import javax.swing.event.CaretEvent;
28 import javax.swing.event.ChangeEvent;
29 import javax.swing.event.ChangeListener;
30 import javax.swing.event.DocumentEvent;
31 import javax.swing.event.DocumentListener;
32 import javax.swing.text.GapContent;
33
34 import org.apache.log4j.lf5.LogLevel;
35
36 public class RestServiceEditorPane extends GRestServiceEditorPane
37 {
38   /**
39    * the latest version of the service definition.
40    */
41   jalview.ws.rest.RestServiceDescription currentservice = null;
42
43   /**
44    * original service passed to editor if we are modifying an existing service
45    * definition
46    */
47   jalview.ws.rest.RestServiceDescription oldservice = null;
48
49   public RestServiceEditorPane()
50   {
51     super();
52     // begin with initial text description box enabled.
53     urldesc.addKeyListener(new KeyListener()
54     {
55       long lastWait;
56       boolean doUpdate;
57       Thread updater=null;
58       @Override
59       public void keyTyped(KeyEvent e)
60       {
61       }
62       
63       @Override
64       public void keyReleased(KeyEvent e)
65       {
66         refreshCutnPaste(true);        
67       }
68       
69       @Override
70       public void keyPressed(KeyEvent e)
71       {
72         // TODO Auto-generated method stub
73         
74       }
75     });
76     panels.addChangeListener(new ChangeListener()
77     {
78       Object lastComp;
79       @Override
80       public void stateChanged(ChangeEvent e)
81       {
82         if (lastComp!=paste) {
83           updateServiceFromGui();
84           refreshCutnPaste(false);
85         } else {
86           refreshCutnPaste(true);
87         }
88         lastComp = panels.getSelectedComponent();
89         
90       }
91       });
92   }
93
94   public RestServiceEditorPane(RestServiceDescription toedit)
95   {
96     this();
97     oldservice = toedit;
98     currentservice = new RestServiceDescription(toedit);
99     initGuiWith(currentservice);
100     refreshCutnPaste(false);
101     updateButtons();
102   }
103
104   /**
105    * refresh the buttons based on model state
106    */
107   public void updateButtons()
108   {
109     cancelButton.setEnabled(oldservice != null);
110     okButton.setEnabled(currentservice != null && currentservice.isValid());
111
112   }
113
114   Vector<String> _iparam = new Vector<String>();
115
116   Vector<String> _rparam = new Vector<String>();
117
118   /**
119    * generate an editable URL service string and parameter list using the
120    * service
121    * 
122    * @param currentservice2
123    */
124   private void initGuiWith(RestServiceDescription currentservice)
125   {
126     name.setText(currentservice.getName());
127     descr.setText(currentservice.getDescription());
128     url.setText(currentservice.getPostUrl());
129     urlsuff.setText(currentservice.getUrlSuffix());
130     _iparam.clear();
131     _rparam.clear();
132     for (Map.Entry<String, InputType> inparam : currentservice
133             .getInputParams().entrySet())
134     {
135       _iparam.add(inparam.getKey() + " "
136               + inparam.getValue().getURLtokenPrefix() + ":"
137               + inparam.getValue().getURLEncodedParameter().toString());
138     }
139     for (JvDataType oparam : currentservice.getResultDataTypes())
140     {
141       _rparam.add((oparam.name()));
142     }
143     iprms.setListData(_iparam);
144     rdata.setListData(_rparam);
145
146     action.removeAllItems();
147     action.addItem("Alignment");
148     action.addItem("Analysis");
149     // action.addItem("Analysis");
150     action.setSelectedItem(currentservice.getAction());
151     revalidate();
152   }
153
154   private boolean updateServiceFromGui() {
155     boolean valid=true;
156     Map<String,InputType>inputTypes = new HashMap<String, InputType>();
157     StringBuffer warnings=new StringBuffer();
158     for (String its:_iparam)
159     {
160       Matcher mtch = Pattern.compile("(\\S+)\\s(\\S+):\\[(.+)]").matcher(its);
161       if (mtch.find()) {
162         if (!RestServiceDescription.parseTypeString(mtch.group(2)+":"+mtch.group(3), mtch.group(1), mtch.group(2),mtch.group(3), inputTypes, warnings))
163         {
164           System.err.println("IMPLEMENTATION PROBLEM: Cannot parse RestService input parameter string '"+its+"'"+"\n"+warnings);
165         }        
166       }
167     }
168     char gc = gapChar.getSelectedItem()==null ? ' ' : ((String)gapChar.getSelectedItem()).charAt(0);
169     RestServiceDescription newService = new RestServiceDescription((String) action.getSelectedItem(),
170           descr.getText().trim(), name.getText().trim(), url.getText().trim(), urlsuff.getText().trim(), inputTypes, hSeparable.isSelected(), vSeparable.isSelected(), gc);
171             
172     if (newService.isValid())
173     {
174       for (String its:_rparam)
175       {
176         JvDataType dtype;
177         try {
178           dtype = JvDataType.valueOf(its);
179           newService.addResultDatatype(dtype);
180         }
181         catch (Throwable x)
182         {
183
184           System.err.println("IMPLEMENTATION PROBLEM: Cannot parse RestService output parameter string '"+its+"'"+"\n"+warnings);
185         }
186       }
187       currentservice = newService;
188       return true;
189     } else {
190       System.err.println("IMPLEMENTATION PROBLEM: Restservice generated from GUI is invalid\n"+warnings);
191
192     }
193     return false;
194   }
195   protected void refreshCutnPaste(boolean reparse)
196   {
197     if (!reparse && currentservice.isValid())
198     {
199       urldesc.setText(currentservice.toString());
200       parseWarnings.setVisible(false);
201     }
202     else
203     {
204       if (reparse)
205       {
206         String txt = urldesc.getText().trim();
207         if (txt.length() > 0)
208         {
209           RestServiceDescription rsd = null;
210           try
211           {
212             rsd = new RestServiceDescription(txt);
213             if (rsd.isValid())
214             {
215               parseWarnings.setVisible(false);
216               parseRes.setText("");
217               initGuiWith(currentservice=rsd);
218             }
219             else
220             {
221               parseRes.setText("Parsing failed. Syntax errors shown below\n"
222                       + rsd.getInvalidMessage());
223               parseWarnings.setVisible(true);
224             }
225           } catch (Throwable e)
226           {
227             e.printStackTrace();
228             parseRes.setText("\nParsing failed. An unrecoverable exception was thrown:\n"
229                     + e.toString());
230             parseWarnings.setVisible(true);
231           }
232         }
233         paste.revalidate();
234       }
235     }
236     
237   }
238
239   public static void main(String[] args)
240   {
241     if (args.length == 0)
242     {
243       new Thread(new Runnable()
244       {
245         boolean visible = true;
246
247         public void run()
248         {
249           while (visible)
250           {
251             final Thread runner = Thread.currentThread();
252             JFrame df = new JFrame();
253             df.getContentPane().setLayout(new BorderLayout());
254             df.getContentPane().add(
255                     new RestServiceEditorPane(jalview.ws.rest.RestClient
256                             .makeShmmrRestClient().getRestDescription()),
257                     BorderLayout.CENTER);
258             df.setBounds(100, 100, 400, 600);
259             df.addComponentListener(new ComponentListener()
260             {
261
262               @Override
263               public void componentShown(ComponentEvent e)
264               {
265                 // TODO Auto-generated method stub
266
267               }
268
269               @Override
270               public void componentResized(ComponentEvent e)
271               {
272                 // TODO Auto-generated method stub
273
274               }
275
276               @Override
277               public void componentMoved(ComponentEvent e)
278               {
279                 // TODO Auto-generated method stub
280
281               }
282
283               @Override
284               public void componentHidden(ComponentEvent e)
285               {
286                 visible = false;
287                 runner.interrupt();
288
289               }
290             });
291             df.setVisible(true);
292             while (visible)
293             {
294               try
295               {
296                 Thread.sleep(10000);
297               } catch (Exception x)
298               {
299               }
300               ;
301             }
302             visible = true;
303           }
304         }
305       }).start();
306
307     }
308   }
309 }