Commit 419a23a795dcc7b2733de724ca4ccfdb6415ed3e

Authored by Nathanael Jourdane
1 parent 5976415a
Exists in master

Add the possibility to query several services.

src/main/java/eu/omp/irap/vespa/epntapclient/RequestCtrl.java
... ... @@ -36,8 +36,12 @@ public class RequestCtrl {
36 36 /** The URL of the resolver used for the `target name` field. */
37 37 private static final String RESOLVER_URL = "http://voparis-registry.obspm.fr/ssodnet/1/autocomplete";
38 38  
  39 + /** The text in the query to replaced by the actual table name. */
  40 + protected static final String TABLE_NAME_KEYWORD = "#tablename#";
  41 +
39 42 /** The query template to get granules. */
40   - private static final String QUERY = "SELECT TOP %s target_name, target_class FROM %s%s";
  43 + private static final String QUERY = "SELECT DISTINCT TOP %s %s FROM " + TABLE_NAME_KEYWORD
  44 + + "%s";
41 45  
42 46 /** The parameters fields for the request. */
43 47 protected Map<String, Object> parameters = new HashMap<>();
... ... @@ -63,10 +67,10 @@ public class RequestCtrl {
63 67 /**
64 68 * Build an ADQL from the table name, the parameter values and the max results.
65 69 *
66   - * @param tableName The name of the table, to put in FROM keyword.
  70 + * @param tableName The names of the tables, to put in the FROM keyword.
67 71 * @return The query.
68 72 */
69   - public String buildQuery(String tableName) {
  73 + public String buildQuery(List<String> columnNames) {
70 74 StringJoiner addJoin = new StringJoiner(" AND ");
71 75 for (Map.Entry<String, Object> param : parameters.entrySet()) {
72 76 if (param.getValue() instanceof ArrayList) {
... ... @@ -84,8 +88,7 @@ public class RequestCtrl {
84 88 }
85 89 }
86 90 String where = addJoin.isEmpty() ? "" : " WHERE " + addJoin;
87   -
88   - return String.format(QUERY, nbMaxResult, tableName, where);
  91 + return String.format(QUERY, nbMaxResult, StringJoiner.join(columnNames), where);
89 92 }
90 93  
91 94 /**
... ... @@ -132,7 +135,7 @@ public class RequestCtrl {
132 135  
133 136 /**
134 137 * Get the parameters.
135   - *
  138 + *
136 139 * @return A map of couple <parameter name, parameter value>.
137 140 */
138 141 public Map<String, Object> getParameters() {
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/mainpanel/MainPanelCtrl.java
... ... @@ -16,6 +16,7 @@
16 16  
17 17 package eu.omp.irap.vespa.epntapclient.gui.mainpanel;
18 18  
  19 +import java.util.List;
19 20 import java.util.logging.Level;
20 21 import java.util.logging.Logger;
21 22  
... ... @@ -26,11 +27,12 @@ import eu.omp.irap.vespa.epntapclient.gui.requestpanel.RequestPanelCtrl;
26 27 import eu.omp.irap.vespa.epntapclient.gui.resultpanel.ResultPanelCtrl;
27 28 import eu.omp.irap.vespa.epntapclient.gui.servicespanel.ServicesPanelCtrl;
28 29 import eu.omp.irap.vespa.votable.controller.VOTableException;
  30 +import eu.omp.irap.vespa.votable.utils.StringJoiner;
29 31  
30 32 /**
31 33 * @author N. Jourdane
32 34 */
33   -public class MainPanelCtrl extends EpnTapController {
  35 +public class MainPanelCtrl extends EpnTapController implements MainPanelListener {
34 36  
35 37 /** The logger for the class GUIController. */
36 38 private static final Logger LOGGER = Logger.getLogger(MainPanelCtrl.class.getName());
... ... @@ -53,7 +55,7 @@ public class MainPanelCtrl extends EpnTapController {
53 55 */
54 56 public MainPanelCtrl() {
55 57 servicesPanelCtrl = new ServicesPanelCtrl(this);
56   - resultPanelCtrl = new ResultPanelCtrl(this);
  58 + resultPanelCtrl = new ResultPanelCtrl();
57 59 requestPanelCtrl = new RequestPanelCtrl(this);
58 60 view = new MainPanelView(this);
59 61 }
... ... @@ -74,10 +76,10 @@ public class MainPanelCtrl extends EpnTapController {
74 76 * @param query The query to send.
75 77 */
76 78 public void sendQuery(String query) {
77   - String serviceURL = servicesPanelCtrl.getSelectedServiceURL();
78   - LOGGER.info("Sending query: " + query + " on " + serviceURL);
  79 + List<String> selectedServicesUrls = servicesPanelCtrl.getSelectedServicesUrls();
  80 + LOGGER.info("Sending query: " + query + " on " + StringJoiner.join(selectedServicesUrls));
79 81 try {
80   - resultPanelCtrl.updateVOTable(serviceURL, query);
  82 + resultPanelCtrl.updateVOTable(StringJoiner.join(selectedServicesUrls), query);
81 83 view.getResultsPanel().fillTable(resultPanelCtrl.getVOTableData());
82 84 } catch (VOTableException e) {
83 85 displayError("Can not send the query.", e);
... ... @@ -118,4 +120,29 @@ public class MainPanelCtrl extends EpnTapController {
118 120 LOGGER.log(Level.SEVERE, message, e);
119 121 JOptionPane.showMessageDialog(view, e.getMessage(), message, JOptionPane.ERROR_MESSAGE);
120 122 }
  123 +
  124 + @Override
  125 + public void updateQuery() {
  126 + requestPanelCtrl.updateQueryArea();
  127 + }
  128 +
  129 + @Override
  130 + public void sendQuery() {
  131 + List<String> servicesUrls = servicesPanelCtrl.getSelectedServicesUrls();
  132 + List<String> tableNames = servicesPanelCtrl.getSelectedTablesNames();
  133 + try {
  134 + for (int i = 0; i < servicesUrls.size(); i++) {
  135 + String query = requestPanelCtrl.getQuery(tableNames.get(i));
  136 + resultPanelCtrl.updateVOTable(servicesUrls.get(i), query);
  137 + }
  138 + } catch (VOTableException e) {
  139 + displayError("Can not update the VOTable.", e);
  140 + }
  141 + resultPanelCtrl.getView().fillTable(resultPanelCtrl.getVOTableData());
  142 + }
  143 +
  144 + @Override
  145 + public List<String> getTableNames() {
  146 + return servicesPanelCtrl.getSelectedTablesNames();
  147 + }
121 148 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/mainpanel/MainPanelListener.java 0 โ†’ 100644
... ... @@ -0,0 +1,31 @@
  1 +/*
  2 + * This file is a part of EpnTAPClient.
  3 + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer.
  4 + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861
  5 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planรฉtologie.
  6 + *
  7 + * This program is free software: you can
  8 + * redistribute it and/or modify it under the terms of the GNU General Public License as published
  9 + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later
  10 + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY
  11 + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  12 + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of
  13 + * the GNU General Public License along with this program. If not, see
  14 + * <http://www.gnu.org/licenses/>.
  15 + */
  16 +
  17 +package eu.omp.irap.vespa.epntapclient.gui.mainpanel;
  18 +
  19 +import java.util.List;
  20 +
  21 +/**
  22 + * @author N. Jourdane
  23 + */
  24 +public interface MainPanelListener {
  25 +
  26 + void updateQuery();
  27 +
  28 + void sendQuery();
  29 +
  30 + List<String> getTableNames();
  31 +}
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelCtrl.java
... ... @@ -16,10 +16,15 @@
16 16  
17 17 package eu.omp.irap.vespa.epntapclient.gui.requestpanel;
18 18  
  19 +import java.util.ArrayList;
  20 +import java.util.List;
  21 +import java.util.logging.Level;
19 22 import java.util.logging.Logger;
20 23  
  24 +import javax.swing.JOptionPane;
  25 +
21 26 import eu.omp.irap.vespa.epntapclient.RequestCtrl;
22   -import eu.omp.irap.vespa.epntapclient.gui.mainpanel.MainPanelCtrl;
  27 +import eu.omp.irap.vespa.epntapclient.gui.mainpanel.MainPanelListener;
23 28  
24 29 /**
25 30 * @author N. Jourdane
... ... @@ -30,7 +35,7 @@ public class RequestPanelCtrl extends RequestCtrl implements RequestPanelListene
30 35 private static final Logger LOGGER = Logger.getLogger(RequestPanelCtrl.class.getName());
31 36  
32 37 /** The controller of the main panel. */
33   - private MainPanelCtrl mainPanelCtrl;
  38 + private MainPanelListener listener;
34 39  
35 40 /** The view of the request panel. */
36 41 private RequestPanelView view;
... ... @@ -39,10 +44,10 @@ public class RequestPanelCtrl extends RequestCtrl implements RequestPanelListene
39 44 /**
40 45 * Constructor of RequestPanelCtrl
41 46 *
42   - * @param mainPanelCtrl The controller of the main panel.
  47 + * @param listener The listener of the main view.
43 48 */
44   - public RequestPanelCtrl(MainPanelCtrl mainPanelCtrl) {
45   - this.mainPanelCtrl = mainPanelCtrl;
  49 + public RequestPanelCtrl(MainPanelListener listener) {
  50 + this.listener = listener;
46 51 view = new RequestPanelView(this);
47 52 }
48 53  
... ... @@ -53,16 +58,28 @@ public class RequestPanelCtrl extends RequestCtrl implements RequestPanelListene
53 58 return view;
54 59 }
55 60  
  61 + /**
  62 + * @return The text contained in the query area.
  63 + */
  64 + public String getQuery(String tableName) {
  65 + return view.getQueryArea().getText().replace(TABLE_NAME_KEYWORD, tableName);
  66 + }
  67 +
56 68 @Override
57   - public void onSendButtonClicked(String query) {
58   - mainPanelCtrl.sendQuery(query);
  69 + public void onSendButtonClicked() {
  70 + listener.sendQuery();
59 71 }
60 72  
61 73 /**
62 74 * Update the query area with a working ADQL query, based on the parameters list.
63 75 */
64 76 public void updateQueryArea() {
65   - String query = buildQuery(mainPanelCtrl.getServicePanelCtrl().getSelectedTableName());
  77 + // TODO: several services
  78 + // TODO: Add panel to enter column names.
  79 + List<String> columnNames = new ArrayList<>();
  80 + columnNames.add("target_name");
  81 + columnNames.add("target_class");
  82 + String query = buildQuery(columnNames);
66 83 view.updateQueryArea(query);
67 84 }
68 85  
... ... @@ -79,4 +96,10 @@ public class RequestPanelCtrl extends RequestCtrl implements RequestPanelListene
79 96 updateQueryArea();
80 97 LOGGER.info("uploaded " + paramName + ": " + paramValue);
81 98 }
  99 +
  100 + @Override
  101 + public void onError(Exception e) {
  102 + LOGGER.log(Level.SEVERE, e.getMessage(), e);
  103 + JOptionPane.showMessageDialog(view, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
  104 + }
82 105 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelListener.java
... ... @@ -23,10 +23,8 @@ public interface RequestPanelListener {
23 23  
24 24 /**
25 25 * Method called when the used click on the 'Send query' button.
26   - *
27   - * @param query The query
28 26 */
29   - void onSendButtonClicked(String query);
  27 + void onSendButtonClicked();
30 28  
31 29 /**
32 30 * Method called when the user remove a parameter with a parameter field.
... ... @@ -43,4 +41,11 @@ public interface RequestPanelListener {
43 41 */
44 42 void onParameterChanged(String paramName, Object paramValue);
45 43  
  44 + /**
  45 + * Display an error to the user.
  46 + *
  47 + * @param e The error to display to the user.
  48 + */
  49 + public void onError(Exception e);
  50 +
46 51 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelView.java
... ... @@ -52,7 +52,7 @@ public class RequestPanelView extends JPanel {
52 52 RequestPanelListener listener;
53 53  
54 54 /** The text area where the user write the query. */
55   - protected JTextArea queryArea;
  55 + private JTextArea queryArea;
56 56  
57 57 /** The parameters fields for the request. */
58 58 private List<ParamField> paramFields;
... ... @@ -122,7 +122,7 @@ public class RequestPanelView extends JPanel {
122 122  
123 123 @Override
124 124 public void actionPerformed(ActionEvent e) {
125   - listener.onSendButtonClicked(queryArea.getText());
  125 + listener.onSendButtonClicked();
126 126 }
127 127 });
128 128 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetNameField.java
... ... @@ -83,7 +83,7 @@ public class TargetNameField extends ParamField implements TextFieldListener {
83 83 this(new RequestPanelListener() {
84 84  
85 85 @Override
86   - public void onSendButtonClicked(String query) {
  86 + public void onSendButtonClicked() {
87 87 /** No SendButtonClicked event, we just want the field itself. */
88 88 }
89 89  
... ... @@ -96,6 +96,11 @@ public class TargetNameField extends ParamField implements TextFieldListener {
96 96 public void onParameterChanged(String paramName, Object paramValue) {
97 97 /** No ParameterChanged event, we just want the field itself. */
98 98 }
  99 +
  100 + @Override
  101 + public void onError(Exception e) {
  102 + /** No Error event, we just want the field itself. */
  103 + }
99 104 }, paraName);
100 105 }
101 106  
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/resultpanel/ResultPanelCtrl.java
... ... @@ -20,10 +20,15 @@ import java.io.File;
20 20 import java.io.IOException;
21 21 import java.nio.file.Files;
22 22 import java.nio.file.Paths;
  23 +import java.util.List;
  24 +import java.util.logging.Level;
23 25 import java.util.logging.Logger;
24 26  
25   -import eu.omp.irap.vespa.epntapclient.gui.mainpanel.MainPanelCtrl;
  27 +import javax.swing.JOptionPane;
  28 +
26 29 import eu.omp.irap.vespa.votable.controller.VOTableController;
  30 +import eu.omp.irap.vespa.votable.controller.VOTableException.CantSaveVOTableException;
  31 +import eu.omp.irap.vespa.votable.utils.StringJoiner;
27 32  
28 33 /**
29 34 * @author N. Jourdane
... ... @@ -33,29 +38,23 @@ public class ResultPanelCtrl extends VOTableController implements ResultPanelLis
33 38 /** The logger for the class ResultPanelCtrl. */
34 39 private static final Logger LOGGER = Logger.getLogger(ResultPanelCtrl.class.getName());
35 40  
36   - /** The controller of the main panel. */
37   - private MainPanelCtrl mainPanelCtrl;
38   -
39 41 /** The result panel view. */
40 42 private ResultPanelView view;
41 43  
42 44  
43 45 /**
44 46 * Constructor of ResultPanelCtrl.
45   - *
46   - * @param mainPanelCtrl The controller of the main panel.
47 47 */
48   - public ResultPanelCtrl(MainPanelCtrl mainPanelCtrl) {
49   - this.mainPanelCtrl = mainPanelCtrl;
  48 + public ResultPanelCtrl() {
50 49 view = new ResultPanelView(this);
51 50 }
52 51  
53 52 @Override
54   - public void onDownloadButtonClicked(File file) {
  53 + public void onDownloadButtonClicked(File file) throws CantSaveVOTableException {
55 54 try {
56 55 Files.copy(Paths.get(voTablePath), Paths.get(file.getAbsolutePath()));
57 56 } catch (IOException e) {
58   - mainPanelCtrl.displayError("Can not save the file.", e);
  57 + throw new CantSaveVOTableException(file.getAbsolutePath(), e);
59 58 }
60 59 }
61 60  
... ... @@ -67,7 +66,13 @@ public class ResultPanelCtrl extends VOTableController implements ResultPanelLis
67 66 }
68 67  
69 68 @Override
70   - public void onRowSelected(int selectedRow) {
71   - LOGGER.info("Selected row: " + selectedRow);
  69 + public void onRowsSelected(List<Integer> selectedRows) {
  70 + LOGGER.info("Selected row: " + StringJoiner.join(selectedRows));
  71 + }
  72 +
  73 + @Override
  74 + public void onError(Exception e) {
  75 + LOGGER.log(Level.SEVERE, e.getMessage(), e);
  76 + JOptionPane.showMessageDialog(view, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
72 77 }
73 78 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/resultpanel/ResultPanelListener.java
... ... @@ -18,6 +18,7 @@ package eu.omp.irap.vespa.epntapclient.gui.resultpanel;
18 18  
19 19 import java.io.File;
20 20  
  21 +import eu.omp.irap.vespa.votable.controller.VOTableException.CantSaveVOTableException;
21 22 import eu.omp.irap.vespa.votable.view.VOTableViewListener;
22 23  
23 24 /**
... ... @@ -26,10 +27,18 @@ import eu.omp.irap.vespa.votable.view.VOTableViewListener;
26 27 public interface ResultPanelListener extends VOTableViewListener {
27 28  
28 29 /**
29   - * Copy the VOTable to a specified location.
  30 + * This method is called when the user clicks on the download button.
30 31 *
31 32 * @param file The file selected by the user in the FileChooser pop-up, corresponding to the
32 33 * place where save the VOTable.
  34 + * @throws CantSaveVOTableException The VOTable can not be saved at the specified location.
33 35 */
34   - public void onDownloadButtonClicked(File file);
  36 + public void onDownloadButtonClicked(File file) throws CantSaveVOTableException;
  37 +
  38 + /**
  39 + * Display an error to the user.
  40 + *
  41 + * @param e The error to display to the user.
  42 + */
  43 + public void onError(Exception e);
35 44 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/resultpanel/ResultPanelView.java
... ... @@ -25,6 +25,7 @@ import javax.swing.JFileChooser;
25 25 import javax.swing.JLabel;
26 26 import javax.swing.JPanel;
27 27  
  28 +import eu.omp.irap.vespa.votable.controller.VOTableException.CantSaveVOTableException;
28 29 import eu.omp.irap.vespa.votable.view.VOTableView;
29 30  
30 31 /**
... ... @@ -96,10 +97,14 @@ public class ResultPanelView extends VOTableView {
96 97 fileButton.addActionListener(new ActionListener() {
97 98  
98 99 @Override
99   - public void actionPerformed(ActionEvent e) {
  100 + public void actionPerformed(ActionEvent evt) {
100 101 final JFileChooser fc = new JFileChooser();
101 102 fc.showOpenDialog(ResultPanelView.this);
102   - listener.onDownloadButtonClicked(fc.getSelectedFile());
  103 + try {
  104 + listener.onDownloadButtonClicked(fc.getSelectedFile());
  105 + } catch (CantSaveVOTableException e) {
  106 + listener.onError(e);
  107 + }
103 108 }
104 109 });
105 110 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/servicespanel/ServicesPanelCtrl.java
... ... @@ -16,13 +16,16 @@
16 16  
17 17 package eu.omp.irap.vespa.epntapclient.gui.servicespanel;
18 18  
  19 +import java.util.ArrayList;
  20 +import java.util.List;
19 21 import java.util.logging.Logger;
20 22  
21   -import eu.omp.irap.vespa.epntapclient.gui.mainpanel.MainPanelCtrl;
  23 +import eu.omp.irap.vespa.epntapclient.gui.mainpanel.MainPanelListener;
22 24 import eu.omp.irap.vespa.epntapclient.service.Queries;
23 25 import eu.omp.irap.vespa.epntapclient.service.ServiceCore;
24 26 import eu.omp.irap.vespa.votable.Consts;
25 27 import eu.omp.irap.vespa.votable.controller.VOTableController;
  28 +import eu.omp.irap.vespa.votable.utils.StringJoiner;
26 29  
27 30 /**
28 31 * @author N. Jourdane
... ... @@ -32,26 +35,32 @@ public class ServicesPanelCtrl extends VOTableController implements ServicesPane
32 35 /** The logger for the class ServicesPanelCtrl. */
33 36 private static final Logger LOGGER = Logger.getLogger(ServicesPanelCtrl.class.getName());
34 37  
35   - /** The controller of the main panel. */
36   - private MainPanelCtrl mainPanelCtrl;
  38 + /** The position of the column displaying the table names in the service table. */
  39 + private static final int TABLE_NAME_COLUMN_POSITION = 4;
  40 +
  41 + /** The position of the column displaying the services target URLs in the service table. */
  42 + private static final int SERVICE_URL_COLUMN_POSITION = 1;
37 43  
38 44 /** The view of the services panel. */
39 45 private ServicesPanelView view;
40 46  
41   - /** The name of the table selected by the user on the table list panel. */
42   - private String selectedTableName;
  47 + /** The list of services table names selected by the user on the service panel. */
  48 + private List<String> selectedTablesNames;
  49 +
  50 + /** The list of services target Urls selected by the user on the service panel. */
  51 + private List<String> selectedServicesUrls;
43 52  
44   - /** The URL of the service corresponding to the selected table. */
45   - private String selectedServiceURL;
  53 + /** The listener of the main panel. */
  54 + private MainPanelListener listener;
46 55  
47 56  
48 57 /**
49 58 * Constructor of ServicesPanelCtrl
50 59 *
51   - * @param mainPanelCtrl The controller of the main panel.
  60 + * @param listener The listener of the main panel.
52 61 */
53   - public ServicesPanelCtrl(MainPanelCtrl mainPanelCtrl) {
54   - this.mainPanelCtrl = mainPanelCtrl;
  62 + public ServicesPanelCtrl(MainPanelListener listener) {
  63 + this.listener = listener;
55 64 targetURL = Consts.DEFAULT_REGISTRY_URL;
56 65 query = String.format(Queries.SELECT_ALL_TAP_SERVICES_WHERE_CORE, ServiceCore.EPNCORE);
57 66 view = new ServicesPanelView(this);
... ... @@ -65,30 +74,41 @@ public class ServicesPanelCtrl extends VOTableController implements ServicesPane
65 74 }
66 75  
67 76 /**
68   - * @return The table name of the service selected by the user on the services table list.
  77 + * @return The list of services table names selected by the user on the service panel.
69 78 */
70   - public String getSelectedTableName() {
71   - return selectedTableName;
  79 + public List<String> getSelectedTablesNames() {
  80 + return selectedTablesNames;
72 81 }
73 82  
74 83 /**
75   - * @return The access URL of the service selected by the user on the services table list.
  84 + * @return The list of services target Urls selected by the user on the service panel.
76 85 */
77   - public String getSelectedServiceURL() {
78   - return selectedServiceURL;
  86 + public List<String> getSelectedServicesUrls() {
  87 + return selectedServicesUrls;
79 88 }
80 89  
81 90 @Override
82   - public void onRowSelected(int selectedServiceRow) {
83   - String serviceURL = view.getServiceURL(selectedServiceRow);
84   - String tableName = view.getTableName(selectedServiceRow);
85   - if (!tableName.equals(selectedTableName)) {
86   - selectedServiceURL = serviceURL;
87   - selectedTableName = tableName;
88   - mainPanelCtrl.getRequestPanelCtrl().updateQueryArea();
89   - LOGGER.info(
90   - "Selected table: " + selectedTableName + " - service: " + selectedServiceURL);
  91 + public void onRowsSelected(List<Integer> selectedRows) {
  92 + List<String> servicesUrls = new ArrayList<>();
  93 + List<String> tableNames = new ArrayList<>();
  94 + String customServiceUrl = view.getServiceUrlTextField().getText();
  95 + String customTableName = view.getTableNameTextField().getText();
  96 +
  97 + for (int row : selectedRows) {
  98 + servicesUrls.add((String) view.getValueAt(SERVICE_URL_COLUMN_POSITION, row));
  99 + tableNames.add((String) view.getValueAt(TABLE_NAME_COLUMN_POSITION, row));
  100 + }
  101 + if (!customServiceUrl.isEmpty() && !customTableName.isEmpty()) {
  102 + servicesUrls.add(customServiceUrl);
  103 + tableNames.add(customTableName);
91 104 }
  105 +
  106 + selectedServicesUrls = servicesUrls;
  107 + selectedTablesNames = tableNames;
  108 + LOGGER.info("Selected services URLs: " + StringJoiner.join(selectedServicesUrls));
  109 + LOGGER.info("Selected tables names: " + StringJoiner.join(selectedTablesNames));
  110 +
  111 + listener.updateQuery();
92 112 }
93 113  
94 114 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/servicespanel/ServicesPanelListener.java
... ... @@ -22,5 +22,5 @@ import eu.omp.irap.vespa.votable.view.VOTableViewListener;
22 22 * @author N. Jourdane
23 23 */
24 24 public interface ServicesPanelListener extends VOTableViewListener {
25   - /* Nothing to listen yet except service selection, listened by VOTableViewListener. */
  25 +
26 26 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/gui/servicespanel/ServicesPanelView.java
... ... @@ -32,12 +32,6 @@ import eu.omp.irap.vespa.votable.view.VOTableView;
32 32 */
33 33 public class ServicesPanelView extends VOTableView {
34 34  
35   - /** */
36   - private static final int TABLE_NAME_COLUMN_POSITION = 4;
37   -
38   - /** */
39   - private static final int SERVICE_URL_COLUMN_POSITION = 1;
40   -
41 35 /** The serial version UID. */
42 36 private static final long serialVersionUID = 1L;
43 37  
... ... @@ -86,7 +80,7 @@ public class ServicesPanelView extends VOTableView {
86 80 *
87 81 * @return The table name JTextField.
88 82 */
89   - private JTextField getTableNameTextField() {
  83 + public JTextField getTableNameTextField() {
90 84 return tableNameTextField == null ? new JTextField(10) : tableNameTextField;
91 85 }
92 86  
... ... @@ -95,7 +89,7 @@ public class ServicesPanelView extends VOTableView {
95 89 *
96 90 * @return The service URL JTextField.
97 91 */
98   - private JTextField getServiceUrlTextField() {
  92 + public JTextField getServiceUrlTextField() {
99 93 return serviceUrlTextField == null ? new JTextField(10) : serviceUrlTextField;
100 94 }
101 95  
... ... @@ -113,32 +107,11 @@ public class ServicesPanelView extends VOTableView {
113 107  
114 108 @Override
115 109 public void actionPerformed(ActionEvent e) {
116   - listener.onRowSelected(-1);
  110 + listener.onRowsSelected(null);
117 111 }
118 112 });
119 113 }
120 114 return serviceButton;
121 115 }
122 116  
123   - /**
124   - * @param row The row index in the JTable element.
125   - * @return The URL of the service corresponding to the row.
126   - */
127   - public String getServiceURL(int row) {
128   - if (row == -1) {
129   - return serviceUrlTextField.getText();
130   - }
131   - return (String) getValueAt(SERVICE_URL_COLUMN_POSITION, row);
132   - }
133   -
134   - /**
135   - * @param row The row index in the JTable element.
136   - * @return The table name of the service corresponding to the row.
137   - */
138   - public String getTableName(int row) {
139   - if (row == -1) {
140   - return tableNameTextField.getText();
141   - }
142   - return (String) getValueAt(TABLE_NAME_COLUMN_POSITION, row);
143   - }
144 117 }
... ...