2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.io.packed.DataProvider.JvDataType;
24 import jalview.jbgui.GRestServiceEditorPane;
25 import jalview.util.MessageManager;
26 import jalview.ws.rest.InputType;
27 import jalview.ws.rest.RestClient;
28 import jalview.ws.rest.RestServiceDescription;
30 import java.awt.BorderLayout;
31 import java.awt.FlowLayout;
32 import java.awt.event.ActionEvent;
33 import java.awt.event.ActionListener;
34 import java.awt.event.ComponentEvent;
35 import java.awt.event.ComponentListener;
36 import java.awt.event.KeyEvent;
37 import java.awt.event.KeyListener;
38 import java.awt.event.MouseEvent;
39 import java.util.HashMap;
40 import java.util.List;
42 import java.util.Vector;
43 import java.util.regex.Matcher;
44 import java.util.regex.Pattern;
46 import javax.swing.JFrame;
47 import javax.swing.JMenuItem;
48 import javax.swing.JPanel;
49 import javax.swing.JPopupMenu;
50 import javax.swing.event.ChangeEvent;
51 import javax.swing.event.ChangeListener;
53 public class RestServiceEditorPane extends GRestServiceEditorPane
56 * the latest version of the service definition.
58 RestServiceDescription currentservice = null;
61 * original service passed to editor if we are modifying an existing service
64 RestServiceDescription oldservice = null;
66 public RestServiceEditorPane()
69 // begin with initial text description box enabled.
70 urldesc.addKeyListener(new KeyListener()
73 public void keyTyped(KeyEvent e)
78 public void keyReleased(KeyEvent e)
80 refreshCutnPaste(true);
84 public void keyPressed(KeyEvent e)
89 panels.addChangeListener(new ChangeListener()
93 * last panel selected - used to decide whether the service or the GUI has
99 public void stateChanged(ChangeEvent e)
101 if (lastComp != paste)
103 updateServiceFromGui();
104 refreshCutnPaste(false);
108 refreshCutnPaste(true);
110 lastComp = panels.getSelectedComponent();
114 currentservice = new RestServiceDescription("Analysis",
115 "service description", "service name", "http://localhost/", "",
116 null, false, false, '-');
117 initGuiWith(currentservice);
118 refreshCutnPaste(false);
122 public RestServiceEditorPane(RestServiceDescription toedit)
126 if (oldservice != null)
128 currentservice = new RestServiceDescription(toedit);
132 currentservice = new RestServiceDescription("Analysis",
133 "service description", "service name", "http://localhost/",
134 "", null, false, false, '-');
136 initGuiWith(currentservice);
137 refreshCutnPaste(false);
142 * refresh the buttons based on model state
144 public void updateButtons()
146 cancelButton.setEnabled(true);
147 okButton.setEnabled(currentservice != null && currentservice.isValid());
151 Vector<String> _iparam = new Vector<String>();
153 Vector<String> _rparam = new Vector<String>();
156 * generate an editable URL service string and parameter list using the
159 * @param currentservice2
161 private void initGuiWith(RestServiceDescription currentservice)
165 action.removeAllItems();
166 action.addItem("Alignment");
167 action.addItem("Analysis");
168 gapChar.removeAllItems();
169 gapChar.addItem(".");
170 gapChar.addItem(" ");
171 gapChar.addItem("-");
172 if (currentservice == null)
178 action.setSelectedItem("Analysis");
179 gapChar.setSelectedItem("-");
183 name.setText(currentservice.getName());
184 descr.setText(currentservice.getDescription());
185 url.setText(currentservice.getPostUrl());
186 urlsuff.setText(currentservice.getUrlSuffix());
187 for (Map.Entry<String, InputType> inparam : currentservice
188 .getInputParams().entrySet())
190 _iparam.add(inparam.getKey() + " "
191 + inparam.getValue().getURLtokenPrefix() + ":"
192 + inparam.getValue().getURLEncodedParameter().toString());
195 for (JvDataType oparam : currentservice.getResultDataTypes())
197 _rparam.add(oparam.name());
199 iprms.setListData(_iparam);
200 rdata.setListData(_rparam);
202 action.setSelectedItem(currentservice.getAction());
204 gapChar.setSelectedItem("" + currentservice.getGapCharacter());
209 private String getSelectedInputToken()
211 if (iprms.getSelectedIndex() > -1)
213 String toktoedit = (String) iprms.getSelectedValue();
214 toktoedit = toktoedit.substring(0, toktoedit.indexOf(" "));
221 protected void iprmListSelection_doubleClicked()
223 String toktoedit = getSelectedInputToken();
224 if (toktoedit != null)
226 InputType toedit = currentservice.getInputParams().get(toktoedit);
227 String oldParam = toktoedit;
228 RestInputParamEditDialog dialog = new RestInputParamEditDialog(this,
229 currentservice, toedit);
230 if (dialog.wasUpdated())
232 currentservice.getInputParams().remove(oldParam);
233 currentservice.getInputParams().put(dialog.current.token,
235 initGuiWith(currentservice);
242 protected void iprmsAdd_actionPerformed(ActionEvent e)
244 RestInputParamEditDialog dialog = new RestInputParamEditDialog(this,
245 currentservice, "param"
246 + (1 + currentservice.getInputParams().size()));
247 if (dialog.wasUpdated())
249 currentservice.getInputParams().put(dialog.current.token,
251 initGuiWith(currentservice);
257 protected void iprmsRem_actionPerformed(ActionEvent e)
259 String toktoedit = getSelectedInputToken();
260 if (toktoedit != null)
262 currentservice.getInputParams().remove(toktoedit);
263 initGuiWith(currentservice);
269 protected void rdata_rightClicked(MouseEvent mouse)
271 final int rdatasel = rdata.getSelectedIndex();
274 JPopupMenu popup = new JPopupMenu(
275 MessageManager.getString("label.select_return_type"));
276 for (final JvDataType type : JvDataType.values())
278 popup.add(new JMenuItem(type.name())).addActionListener(
283 public void actionPerformed(ActionEvent e)
285 currentservice.getResultDataTypes().set(rdatasel, type);
286 initGuiWith(currentservice);
287 rdata.setSelectedIndex(rdatasel);
291 popup.show(rdata, mouse.getX(), mouse.getY());
296 protected void rdataAdd_actionPerformed(ActionEvent e)
299 if ((p = rdata.getSelectedIndex()) > -1)
301 currentservice.getResultDataTypes().add(p + 1, JvDataType.ANNOTATION);
305 currentservice.addResultDatatype(JvDataType.ANNOTATION);
307 initGuiWith(currentservice);
308 rdata.setSelectedIndex(p == -1 ? currentservice.getResultDataTypes()
309 .size() - 1 : p + 1);
313 protected void rdataNdown_actionPerformed(ActionEvent e)
316 if ((p = rdata.getSelectedIndex()) > -1 && p < _rparam.size() - 1)
318 List<JvDataType> rtypes = currentservice.getResultDataTypes();
319 JvDataType below = rtypes.get(p + 1);
320 rtypes.set(p + 1, rtypes.get(p));
321 rtypes.set(p, below);
322 initGuiWith(currentservice);
323 rdata.setSelectedIndex(p + 1);
328 protected void rdataNup_actionPerformed(ActionEvent e)
331 if ((p = rdata.getSelectedIndex()) > 0)
333 List<JvDataType> rtypes = currentservice.getResultDataTypes();
334 JvDataType above = rtypes.get(p - 1);
335 rtypes.set(p - 1, rtypes.get(p));
336 rtypes.set(p, above);
337 initGuiWith(currentservice);
338 rdata.setSelectedIndex(p - 1);
343 protected void rdataRem_actionPerformed(ActionEvent e)
345 if (rdata.getSelectedIndex() > -1)
347 currentservice.getResultDataTypes().remove(rdata.getSelectedIndex());
348 initGuiWith(currentservice);
352 private boolean updateServiceFromGui()
354 Map<String, InputType> inputTypes = new HashMap<String, InputType>();
355 StringBuffer warnings = new StringBuffer();
356 for (String its : _iparam)
358 Matcher mtch = Pattern.compile("(\\S+)\\s(\\S+):\\[(.+)]").matcher(
362 if (!RestServiceDescription.parseTypeString(mtch.group(2) + ":"
363 + mtch.group(3), mtch.group(1), mtch.group(2),
364 mtch.group(3), inputTypes, warnings))
367 .println("IMPLEMENTATION PROBLEM: Cannot parse RestService input parameter string '"
368 + its + "'" + "\n" + warnings);
372 char gc = gapChar.getSelectedItem() == null ? ' ' : ((String) gapChar
373 .getSelectedItem()).charAt(0);
374 RestServiceDescription newService = new RestServiceDescription(
375 (String) action.getSelectedItem(), descr.getText().trim(), name
376 .getText().trim(), url.getText().trim(), urlsuff
377 .getText().trim(), inputTypes, hSeparable.isSelected(),
378 vSeparable.isSelected(), gc);
380 if (newService.isValid())
382 for (String its : _rparam)
387 dtype = JvDataType.valueOf(its);
388 newService.addResultDatatype(dtype);
389 } catch (Throwable x)
393 .println("IMPLEMENTATION PROBLEM: Cannot parse RestService output parameter string '"
394 + its + "'" + "\n" + warnings);
397 currentservice = newService;
403 .println("IMPLEMENTATION PROBLEM: Restservice generated from GUI is invalid\n"
410 protected void refreshCutnPaste(boolean reparse)
412 if (!reparse && currentservice.isValid())
414 urldesc.setText(currentservice.toString());
415 parseWarnings.setVisible(false);
421 String txt = urldesc.getText().trim();
422 if (txt.length() > 0)
424 RestServiceDescription rsd = null;
427 rsd = new RestServiceDescription(txt);
430 parseWarnings.setVisible(false);
431 parseRes.setText("");
432 initGuiWith(currentservice = rsd);
436 parseRes.setText(MessageManager
438 "label.parsing_failed_syntax_errors_shown_below_param",
440 { rsd.getInvalidMessage() }));
441 parseWarnings.setVisible(true);
443 } catch (Throwable e)
446 parseRes.setText(MessageManager
448 "label.parsing_failed_unrecoverable_exception_thrown_param",
451 parseWarnings.setVisible(true);
460 public static void main(String[] args)
462 if (args.length == 0)
464 new Thread(new Runnable()
466 boolean visible = true;
470 boolean nulserv = true;
473 final Thread runner = Thread.currentThread();
474 JFrame df = new JFrame();
475 df.getContentPane().setLayout(new BorderLayout());
476 df.getContentPane().add(
477 (nulserv = !nulserv) ? new RestServiceEditorPane(
478 RestClient.makeShmmrRestClient()
479 .getRestDescription())
480 : new RestServiceEditorPane(),
481 BorderLayout.CENTER);
482 df.setBounds(100, 100, 600, 400);
483 df.addComponentListener(new ComponentListener()
487 public void componentShown(ComponentEvent e)
493 public void componentResized(ComponentEvent e)
499 public void componentMoved(ComponentEvent e)
505 public void componentHidden(ComponentEvent e)
518 } catch (Exception x)
531 String finalService = null;
533 public void showDialog(String title)
535 if (oldservice != null)
537 finalService = oldservice.toString();
539 JalviewDialog jvd = new JalviewDialog()
543 protected void raiseClosed()
545 // TODO Auto-generated method stub
550 protected void okPressed()
552 updateServiceFromGui();
553 finalService = currentservice.toString();
557 protected void cancelPressed()
562 JPanel pane = new JPanel(new BorderLayout()), okcancel = new JPanel(
564 pane.add(this, BorderLayout.CENTER);
565 okcancel.add(jvd.ok);
566 okcancel.add(jvd.cancel);
567 pane.add(okcancel, BorderLayout.SOUTH);
568 jvd.initDialogFrame(pane, true, true, title, 600, 350);
572 public String getEditedRestService()