3 import jalview.io.packed.DataProvider.JvDataType;
4 import jalview.jbgui.GRestServiceEditorPane;
5 import jalview.ws.rest.InputType;
6 import jalview.ws.rest.RestServiceDescription;
8 import java.awt.BorderLayout;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.ActionListener;
11 import java.awt.event.ComponentEvent;
12 import java.awt.event.ComponentListener;
13 import java.awt.event.KeyEvent;
14 import java.awt.event.KeyListener;
15 import java.awt.event.MouseEvent;
16 import java.util.HashMap;
17 import java.util.List;
19 import java.util.Vector;
20 import java.util.regex.Matcher;
21 import java.util.regex.Pattern;
23 import javax.swing.JFrame;
24 import javax.swing.JMenuItem;
25 import javax.swing.JPopupMenu;
26 import javax.swing.event.ChangeEvent;
27 import javax.swing.event.ChangeListener;
29 public class RestServiceEditorPane extends GRestServiceEditorPane
32 * the latest version of the service definition.
34 jalview.ws.rest.RestServiceDescription currentservice = null;
37 * original service passed to editor if we are modifying an existing service
40 jalview.ws.rest.RestServiceDescription oldservice = null;
42 public RestServiceEditorPane()
45 // begin with initial text description box enabled.
46 urldesc.addKeyListener(new KeyListener()
49 public void keyTyped(KeyEvent e)
54 public void keyReleased(KeyEvent e)
56 refreshCutnPaste(true);
60 public void keyPressed(KeyEvent e)
65 panels.addChangeListener(new ChangeListener()
69 public void stateChanged(ChangeEvent e)
71 if (lastComp!=paste) {
72 updateServiceFromGui();
73 refreshCutnPaste(false);
75 refreshCutnPaste(true);
77 lastComp = panels.getSelectedComponent();
81 currentservice = new RestServiceDescription("Analysis", "service description", "service name", "http://localhost/", "", null, false, false, '-');
82 initGuiWith(currentservice);
83 refreshCutnPaste(false);
87 public RestServiceEditorPane(RestServiceDescription toedit)
92 { currentservice = new RestServiceDescription(toedit);
94 currentservice = new RestServiceDescription("Analysis", "service description", "service name", "http://localhost/", "", null, false, false, '-');
96 initGuiWith(currentservice);
97 refreshCutnPaste(false);
102 * refresh the buttons based on model state
104 public void updateButtons()
106 cancelButton.setEnabled(true);
107 okButton.setEnabled(currentservice != null && currentservice.isValid());
111 Vector<String> _iparam = new Vector<String>();
113 Vector<String> _rparam = new Vector<String>();
116 * generate an editable URL service string and parameter list using the
119 * @param currentservice2
121 private void initGuiWith(RestServiceDescription currentservice)
125 action.removeAllItems();
126 action.addItem("Alignment");
127 action.addItem("Analysis");
128 gapChar.removeAllItems();
129 gapChar.addItem(".");
130 gapChar.addItem(" ");
131 gapChar.addItem("-");
132 if (currentservice==null)
138 action.setSelectedItem("Analysis");
139 gapChar.setSelectedItem("-");
141 name.setText(currentservice.getName());
142 descr.setText(currentservice.getDescription());
143 url.setText(currentservice.getPostUrl());
144 urlsuff.setText(currentservice.getUrlSuffix());
145 for (Map.Entry<String, InputType> inparam : currentservice
146 .getInputParams().entrySet())
148 _iparam.add(inparam.getKey() + " "
149 + inparam.getValue().getURLtokenPrefix() + ":"
150 + inparam.getValue().getURLEncodedParameter().toString());
153 for (JvDataType oparam : currentservice.getResultDataTypes())
155 _rparam.add(oparam.name());
157 iprms.setListData(_iparam);
158 rdata.setListData(_rparam);
160 action.setSelectedItem(currentservice.getAction());
162 gapChar.setSelectedItem(""+currentservice.getGapCharacter());
166 private String getSelectedInputToken()
168 if (iprms.getSelectedIndex()>-1)
170 String toktoedit = (String) iprms.getSelectedValue();
171 toktoedit=toktoedit.substring(0, toktoedit.indexOf(" "));
177 protected void iprmListSelection_doubleClicked()
179 String toktoedit = getSelectedInputToken();
182 InputType toedit = currentservice.getInputParams().get(toktoedit);
183 String oldParam=toktoedit;
184 RestInputParamEditDialog dialog=new RestInputParamEditDialog(this, currentservice, toedit);
185 if (dialog.wasUpdated()) {
186 currentservice.getInputParams().remove(oldParam);
187 currentservice.getInputParams().put(dialog.current.token, dialog.current);
188 initGuiWith(currentservice);
194 protected void iprmsAdd_actionPerformed(ActionEvent e)
196 RestInputParamEditDialog dialog=new RestInputParamEditDialog(this, currentservice, "param"+(1+currentservice.getInputParams().size()));
197 if (dialog.wasUpdated()) {
198 currentservice.getInputParams().put(dialog.current.token, dialog.current);
199 initGuiWith(currentservice);
204 protected void iprmsRem_actionPerformed(ActionEvent e)
206 String toktoedit = getSelectedInputToken();
209 currentservice.getInputParams().remove(toktoedit);
210 initGuiWith(currentservice);
215 protected void rdata_rightClicked(MouseEvent mouse)
217 final int rdatasel = rdata.getSelectedIndex();
220 JPopupMenu popup = new JPopupMenu("Select return type");
221 for (final JvDataType type:JvDataType.values()) {
222 popup.add(new JMenuItem(type.name())).addActionListener(new ActionListener()
226 public void actionPerformed(ActionEvent e)
228 currentservice.getResultDataTypes().set(rdatasel, type);
229 initGuiWith(currentservice);
230 rdata.setSelectedIndex(rdatasel);
234 popup.show(rdata, mouse.getX(), mouse.getY());
238 protected void rdataAdd_actionPerformed(ActionEvent e)
241 if ((p=rdata.getSelectedIndex())>-1)
243 currentservice.getResultDataTypes().add(p+1, JvDataType.ANNOTATION);
245 currentservice.addResultDatatype(JvDataType.ANNOTATION);
247 initGuiWith(currentservice);
248 rdata.setSelectedIndex(p==-1 ? currentservice.getResultDataTypes().size()-1 : p+1);
251 protected void rdataNdown_actionPerformed(ActionEvent e)
254 if ((p=rdata.getSelectedIndex())>-1 && p<_rparam.size()-1)
256 List<JvDataType> rtypes = currentservice.getResultDataTypes();
257 JvDataType below = rtypes.get(p+1);
258 rtypes.set(p+1, rtypes.get(p));
259 rtypes.set(p, below);
260 initGuiWith(currentservice);
261 rdata.setSelectedIndex(p+1);
265 protected void rdataNup_actionPerformed(ActionEvent e)
268 if ((p=rdata.getSelectedIndex())>0)
270 List<JvDataType> rtypes = currentservice.getResultDataTypes();
271 JvDataType above = rtypes.get(p-1);
272 rtypes.set(p-1, rtypes.get(p));
273 rtypes.set(p, above);
274 initGuiWith(currentservice);
275 rdata.setSelectedIndex(p-1);
279 protected void rdataRem_actionPerformed(ActionEvent e)
281 if (rdata.getSelectedIndex()>-1)
283 currentservice.getResultDataTypes().remove(rdata.getSelectedIndex());
284 initGuiWith(currentservice);
288 private boolean updateServiceFromGui() {
289 Map<String,InputType>inputTypes = new HashMap<String, InputType>();
290 StringBuffer warnings=new StringBuffer();
291 for (String its:_iparam)
293 Matcher mtch = Pattern.compile("(\\S+)\\s(\\S+):\\[(.+)]").matcher(its);
295 if (!RestServiceDescription.parseTypeString(mtch.group(2)+":"+mtch.group(3), mtch.group(1), mtch.group(2),mtch.group(3), inputTypes, warnings))
297 System.err.println("IMPLEMENTATION PROBLEM: Cannot parse RestService input parameter string '"+its+"'"+"\n"+warnings);
301 char gc = gapChar.getSelectedItem()==null ? ' ' : ((String)gapChar.getSelectedItem()).charAt(0);
302 RestServiceDescription newService = new RestServiceDescription((String) action.getSelectedItem(),
303 descr.getText().trim(), name.getText().trim(), url.getText().trim(), urlsuff.getText().trim(), inputTypes, hSeparable.isSelected(), vSeparable.isSelected(), gc);
305 if (newService.isValid())
307 for (String its:_rparam)
311 dtype = JvDataType.valueOf(its);
312 newService.addResultDatatype(dtype);
317 System.err.println("IMPLEMENTATION PROBLEM: Cannot parse RestService output parameter string '"+its+"'"+"\n"+warnings);
320 currentservice = newService;
323 System.err.println("IMPLEMENTATION PROBLEM: Restservice generated from GUI is invalid\n"+warnings);
328 protected void refreshCutnPaste(boolean reparse)
330 if (!reparse && currentservice.isValid())
332 urldesc.setText(currentservice.toString());
333 parseWarnings.setVisible(false);
339 String txt = urldesc.getText().trim();
340 if (txt.length() > 0)
342 RestServiceDescription rsd = null;
345 rsd = new RestServiceDescription(txt);
348 parseWarnings.setVisible(false);
349 parseRes.setText("");
350 initGuiWith(currentservice=rsd);
354 parseRes.setText("Parsing failed. Syntax errors shown below\n"
355 + rsd.getInvalidMessage());
356 parseWarnings.setVisible(true);
358 } catch (Throwable e)
361 parseRes.setText("\nParsing failed. An unrecoverable exception was thrown:\n"
363 parseWarnings.setVisible(true);
372 public static void main(String[] args)
374 if (args.length == 0)
376 new Thread(new Runnable()
378 boolean visible = true;
382 boolean nulserv=true;
385 final Thread runner = Thread.currentThread();
386 JFrame df = new JFrame();
387 df.getContentPane().setLayout(new BorderLayout());
388 df.getContentPane().add(
389 (nulserv=!nulserv) ? new RestServiceEditorPane(jalview.ws.rest.RestClient
390 .makeShmmrRestClient().getRestDescription()) : new RestServiceEditorPane(),
391 BorderLayout.CENTER);
392 df.setBounds(100, 100, 600, 400);
393 df.addComponentListener(new ComponentListener()
397 public void componentShown(ComponentEvent e)
403 public void componentResized(ComponentEvent e)
409 public void componentMoved(ComponentEvent e)
415 public void componentHidden(ComponentEvent e)
428 } catch (Exception x)