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.RestServiceDescription;
29 import java.awt.BorderLayout;
30 import java.awt.FlowLayout;
31 import java.awt.event.ActionEvent;
32 import java.awt.event.ActionListener;
33 import java.awt.event.ComponentEvent;
34 import java.awt.event.ComponentListener;
35 import java.awt.event.KeyEvent;
36 import java.awt.event.KeyListener;
37 import java.awt.event.MouseEvent;
38 import java.util.HashMap;
39 import java.util.List;
41 import java.util.Vector;
42 import java.util.regex.Matcher;
43 import java.util.regex.Pattern;
45 import javax.swing.JFrame;
46 import javax.swing.JMenuItem;
47 import javax.swing.JPanel;
48 import javax.swing.JPopupMenu;
49 import javax.swing.event.ChangeEvent;
50 import javax.swing.event.ChangeListener;
52 public class RestServiceEditorPane extends GRestServiceEditorPane
55 * the latest version of the service definition.
57 jalview.ws.rest.RestServiceDescription currentservice = null;
60 * original service passed to editor if we are modifying an existing service
63 jalview.ws.rest.RestServiceDescription oldservice = null;
65 public RestServiceEditorPane()
68 // begin with initial text description box enabled.
69 urldesc.addKeyListener(new KeyListener()
72 public void keyTyped(KeyEvent e)
77 public void keyReleased(KeyEvent e)
79 refreshCutnPaste(true);
83 public void keyPressed(KeyEvent e)
88 panels.addChangeListener(new ChangeListener()
92 * last panel selected - used to decide whether the service or the GUI has
98 public void stateChanged(ChangeEvent e)
100 if (lastComp != paste)
102 updateServiceFromGui();
103 refreshCutnPaste(false);
107 refreshCutnPaste(true);
109 lastComp = panels.getSelectedComponent();
113 currentservice = new RestServiceDescription("Analysis",
114 "service description", "service name", "http://localhost/", "",
115 null, false, false, '-');
116 initGuiWith(currentservice);
117 refreshCutnPaste(false);
121 public RestServiceEditorPane(RestServiceDescription toedit)
125 if (oldservice != null)
127 currentservice = new RestServiceDescription(toedit);
131 currentservice = new RestServiceDescription("Analysis",
132 "service description", "service name", "http://localhost/",
133 "", null, false, false, '-');
135 initGuiWith(currentservice);
136 refreshCutnPaste(false);
141 * refresh the buttons based on model state
143 public void updateButtons()
145 cancelButton.setEnabled(true);
146 okButton.setEnabled(currentservice != null && currentservice.isValid());
150 Vector<String> _iparam = new Vector<>();
152 Vector<String> _rparam = new Vector<>();
155 * generate an editable URL service string and parameter list using the
158 * @param currentservice2
160 private void initGuiWith(RestServiceDescription currentservice)
164 action.removeAllItems();
165 action.addItem("Alignment");
166 action.addItem("Analysis");
167 gapChar.removeAllItems();
168 gapChar.addItem(".");
169 gapChar.addItem(" ");
170 gapChar.addItem("-");
171 if (currentservice == null)
177 action.setSelectedItem("Analysis");
178 gapChar.setSelectedItem("-");
182 name.setText(currentservice.getName());
183 descr.setText(currentservice.getDescription());
184 url.setText(currentservice.getPostUrl());
185 urlsuff.setText(currentservice.getUrlSuffix());
186 for (Map.Entry<String, InputType> inparam : currentservice
187 .getInputParams().entrySet())
189 _iparam.add(inparam.getKey() + " "
190 + inparam.getValue().getURLtokenPrefix() + ":"
191 + inparam.getValue().getURLEncodedParameter().toString());
194 for (JvDataType oparam : currentservice.getResultDataTypes())
196 _rparam.add(oparam.name());
198 iprms.setListData(_iparam);
199 rdata.setListData(_rparam);
201 action.setSelectedItem(currentservice.getAction());
203 gapChar.setSelectedItem("" + currentservice.getGapCharacter());
208 private String getSelectedInputToken()
210 if (iprms.getSelectedIndex() > -1)
212 String toktoedit = (String) iprms.getSelectedValue();
213 toktoedit = toktoedit.substring(0, toktoedit.indexOf(" "));
220 protected void iprmListSelection_doubleClicked()
222 String toktoedit = getSelectedInputToken();
223 if (toktoedit != null)
225 InputType toedit = currentservice.getInputParams().get(toktoedit);
226 String oldParam = toktoedit;
227 RestInputParamEditDialog dialog = new RestInputParamEditDialog(this,
228 currentservice, toedit);
229 if (dialog.wasUpdated())
231 currentservice.getInputParams().remove(oldParam);
232 currentservice.getInputParams().put(dialog.current.token,
234 initGuiWith(currentservice);
241 protected void iprmsAdd_actionPerformed(ActionEvent e)
243 RestInputParamEditDialog dialog = new RestInputParamEditDialog(this,
245 "param" + (1 + currentservice.getInputParams().size()));
246 if (dialog.wasUpdated())
248 currentservice.getInputParams().put(dialog.current.token,
250 initGuiWith(currentservice);
256 protected void iprmsRem_actionPerformed(ActionEvent e)
258 String toktoedit = getSelectedInputToken();
259 if (toktoedit != null)
261 currentservice.getInputParams().remove(toktoedit);
262 initGuiWith(currentservice);
268 protected void rdata_rightClicked(MouseEvent mouse)
270 final int rdatasel = rdata.getSelectedIndex();
273 JPopupMenu popup = new JPopupMenu(
274 MessageManager.getString("label.select_return_type"));
275 for (final JvDataType type : JvDataType.values())
277 popup.add(new JMenuItem(type.name()))
278 .addActionListener(new ActionListener()
282 public void actionPerformed(ActionEvent e)
284 currentservice.getResultDataTypes().set(rdatasel, type);
285 initGuiWith(currentservice);
286 rdata.setSelectedIndex(rdatasel);
290 popup.show(rdata, mouse.getX(), mouse.getY());
295 protected void rdataAdd_actionPerformed(ActionEvent e)
298 if ((p = rdata.getSelectedIndex()) > -1)
300 currentservice.getResultDataTypes().add(p + 1, JvDataType.ANNOTATION);
304 currentservice.addResultDatatype(JvDataType.ANNOTATION);
306 initGuiWith(currentservice);
307 rdata.setSelectedIndex(
308 p == -1 ? currentservice.getResultDataTypes().size() - 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<>();
355 StringBuffer warnings = new StringBuffer();
356 for (String its : _iparam)
358 Matcher mtch = Pattern.compile("(\\S+)\\s(\\S+):\\[(.+)]")
362 if (!RestServiceDescription.parseTypeString(
363 mtch.group(2) + ":" + mtch.group(3), mtch.group(1),
364 mtch.group(2), mtch.group(3), inputTypes, warnings))
367 "IMPLEMENTATION PROBLEM: Cannot parse RestService input parameter string '"
368 + its + "'" + "\n" + warnings);
372 char gc = gapChar.getSelectedItem() == null ? ' '
373 : ((String) gapChar.getSelectedItem()).charAt(0);
374 RestServiceDescription newService = new RestServiceDescription(
375 (String) action.getSelectedItem(), descr.getText().trim(),
376 name.getText().trim(), url.getText().trim(),
377 urlsuff.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 "IMPLEMENTATION PROBLEM: Cannot parse RestService output parameter string '"
394 + its + "'" + "\n" + warnings);
397 currentservice = newService;
403 "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.formatMessage(
437 "label.parsing_failed_syntax_errors_shown_below_param",
439 { rsd.getInvalidMessage() }));
440 parseWarnings.setVisible(true);
442 } catch (Throwable e)
445 parseRes.setText(MessageManager.formatMessage(
446 "label.parsing_failed_unrecoverable_exception_thrown_param",
449 parseWarnings.setVisible(true);
462 public static void main(String[] args)
464 if (args.length == 0)
466 new Thread(new Runnable()
468 boolean visible = true;
473 boolean nulserv = true;
476 final Thread runner = Thread.currentThread();
477 JFrame df = new JFrame();
478 df.getContentPane().setLayout(new BorderLayout());
479 df.getContentPane().add((nulserv = !nulserv)
480 ? new RestServiceEditorPane(jalview.ws.rest.RestClient
481 .makeShmmrRestClient().getRestDescription())
482 : new RestServiceEditorPane(), BorderLayout.CENTER);
483 df.setBounds(100, 100, 600, 400);
484 df.addComponentListener(new ComponentListener()
488 public void componentShown(ComponentEvent e)
494 public void componentResized(ComponentEvent e)
500 public void componentMoved(ComponentEvent e)
506 public void componentHidden(ComponentEvent e)
519 } 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()),
563 okcancel = new JPanel(new FlowLayout());
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()