Commit 4cc84b6399aaded5f095337d6a3394ca5ab443f5
1 parent
4a03be16
Exists in
master
Add the possibility to send queries to the selected service.
Showing
8 changed files
with
188 additions
and
128 deletions
Show diff stats
src/main/java/eu/omp/irap/vespa/epntapclient/EpnTapMainApp.java
@@ -49,7 +49,7 @@ public class EpnTapMainApp { | @@ -49,7 +49,7 @@ public class EpnTapMainApp { | ||
49 | frame.setContentPane(epnTapControl.getView()); | 49 | frame.setContentPane(epnTapControl.getView()); |
50 | frame.setVisible(true); | 50 | frame.setVisible(true); |
51 | // frame.pack(); | 51 | // frame.pack(); |
52 | - frame.setSize(800, 600); | 52 | + frame.setSize(1000, 600); |
53 | frame.setLocationRelativeTo(null); | 53 | frame.setLocationRelativeTo(null); |
54 | } | 54 | } |
55 | }); | 55 | }); |
src/main/java/eu/omp/irap/vespa/epntapclient/controller/EpnTapController.java
@@ -17,6 +17,7 @@ | @@ -17,6 +17,7 @@ | ||
17 | package eu.omp.irap.vespa.epntapclient.controller; | 17 | package eu.omp.irap.vespa.epntapclient.controller; |
18 | 18 | ||
19 | import eu.omp.irap.vespa.epntapclient.utils.Const; | 19 | import eu.omp.irap.vespa.epntapclient.utils.Const; |
20 | +import eu.omp.irap.vespa.epntapclient.utils.Log; | ||
20 | import eu.omp.irap.vespa.epntapclient.utils.Queries; | 21 | import eu.omp.irap.vespa.epntapclient.utils.Queries; |
21 | import eu.omp.irap.vespa.epntapclient.view.EpnTapMainView; | 22 | import eu.omp.irap.vespa.epntapclient.view.EpnTapMainView; |
22 | import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableController; | 23 | import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableController; |
@@ -29,27 +30,29 @@ public class EpnTapController { | @@ -29,27 +30,29 @@ public class EpnTapController { | ||
29 | /** The view of EPN-TAP application. */ | 30 | /** The view of EPN-TAP application. */ |
30 | EpnTapMainView view; | 31 | EpnTapMainView view; |
31 | 32 | ||
33 | + /** The controller of the VOTable displaying the list of services. */ | ||
34 | + VOTableController servicesController; | ||
35 | + | ||
32 | /** The controller of the VOTable displaying the query results. */ | 36 | /** The controller of the VOTable displaying the query results. */ |
33 | VOTableController resultsController; | 37 | VOTableController resultsController; |
34 | 38 | ||
35 | - /** The controller of the VOTable displaying the list of services. */ | ||
36 | - VOTableController servicesController; | 39 | + /** The URL of the service selected by the user on the services list panel. */ |
40 | + String selectedServiceURL; | ||
37 | 41 | ||
38 | /** | 42 | /** |
39 | * Method constructor | 43 | * Method constructor |
40 | */ | 44 | */ |
41 | public EpnTapController() { | 45 | public EpnTapController() { |
46 | + // TODO: Get only *EPN* TAP services | ||
42 | servicesController = new VOTableController(Const.DEFAULT_REGISTRY_URL, "ADQL", | 47 | servicesController = new VOTableController(Const.DEFAULT_REGISTRY_URL, "ADQL", |
43 | Queries.GET_TAP_SERVICES); | 48 | Queries.GET_TAP_SERVICES); |
44 | 49 | ||
45 | - VOTableView serviceView = servicesController.getView(); | ||
46 | - | ||
47 | - view = new EpnTapMainView(this, serviceView); | 50 | + resultsController = new VOTableController(); |
48 | 51 | ||
49 | - String[] rColumns = { "result name", "result value" }; | ||
50 | - String[][] rValues = { { "r1", "r2" }, { "123", "456" } }; | ||
51 | - | ||
52 | - view.fillResults(rColumns, rValues); | 52 | + VOTableView serviceView = servicesController.getView(); |
53 | + VOTableView resultsView = resultsController.getView(); | ||
54 | + view = new EpnTapMainView(this, serviceView, resultsView); | ||
55 | + setSelectedService(0); | ||
53 | } | 56 | } |
54 | 57 | ||
55 | /** | 58 | /** |
@@ -72,4 +75,24 @@ public class EpnTapController { | @@ -72,4 +75,24 @@ public class EpnTapController { | ||
72 | public VOTableController getServicesController() { | 75 | public VOTableController getServicesController() { |
73 | return servicesController; | 76 | return servicesController; |
74 | } | 77 | } |
78 | + | ||
79 | + /** | ||
80 | + * @param row The row selected by the user on the Jtable. | ||
81 | + */ | ||
82 | + public void setSelectedService(int row) { | ||
83 | + String serviceURL = (String) view.getServices().getValueAt(1, row); | ||
84 | + if (!serviceURL.equals(selectedServiceURL)) { | ||
85 | + selectedServiceURL = serviceURL; | ||
86 | + Log.LOGGER.info("Selected service URL: " + selectedServiceURL); | ||
87 | + } | ||
88 | + } | ||
89 | + | ||
90 | + /** | ||
91 | + * @param query The query to send to the selected service. | ||
92 | + * @throws Exception If the Table can not be filled. | ||
93 | + */ | ||
94 | + public void sendQuery(String query) throws Exception { | ||
95 | + Log.LOGGER.info("Sending query: " + query + " on " + selectedServiceURL); | ||
96 | + resultsController.fillTable(selectedServiceURL, "ADQL", query); | ||
97 | + } | ||
75 | } | 98 | } |
src/main/java/eu/omp/irap/vespa/epntapclient/utils/Queries.java
@@ -49,4 +49,7 @@ public class Queries { | @@ -49,4 +49,7 @@ public class Queries { | ||
49 | /** Minimal query to get TAP all services of the registry, using GloTS. */ | 49 | /** Minimal query to get TAP all services of the registry, using GloTS. */ |
50 | public static final String GET_TAP_SERVICES = "SELECT ivoid, accessurl FROM glots.services"; | 50 | public static final String GET_TAP_SERVICES = "SELECT ivoid, accessurl FROM glots.services"; |
51 | 51 | ||
52 | + /** A sample query for tests. */ | ||
53 | + public static final String SAMPLE_AMDA_QUERY = "SELECT TOP 5 index, resource_type, time_min, time_max FROM amdadb.epn_core"; | ||
54 | + | ||
52 | } | 55 | } |
src/main/java/eu/omp/irap/vespa/epntapclient/view/EpnTapMainView.java
@@ -17,6 +17,12 @@ | @@ -17,6 +17,12 @@ | ||
17 | package eu.omp.irap.vespa.epntapclient.view; | 17 | package eu.omp.irap.vespa.epntapclient.view; |
18 | 18 | ||
19 | import java.awt.BorderLayout; | 19 | import java.awt.BorderLayout; |
20 | +import java.awt.event.KeyAdapter; | ||
21 | +import java.awt.event.KeyEvent; | ||
22 | +import java.awt.event.KeyListener; | ||
23 | +import java.awt.event.MouseAdapter; | ||
24 | +import java.awt.event.MouseEvent; | ||
25 | +import java.awt.event.MouseListener; | ||
20 | 26 | ||
21 | import javax.swing.JOptionPane; | 27 | import javax.swing.JOptionPane; |
22 | import javax.swing.JPanel; | 28 | import javax.swing.JPanel; |
@@ -41,36 +47,48 @@ public class EpnTapMainView extends JPanel { | @@ -41,36 +47,48 @@ public class EpnTapMainView extends JPanel { | ||
41 | /** The JPanel where the user put requests. */ | 47 | /** The JPanel where the user put requests. */ |
42 | private RequestView requestView; | 48 | private RequestView requestView; |
43 | 49 | ||
50 | + /** The main EPN-TAP main controller */ | ||
51 | + private EpnTapController controller; | ||
52 | + | ||
44 | /** | 53 | /** |
45 | * The constructor of the view. | 54 | * The constructor of the view. |
46 | * | 55 | * |
47 | * @param controller The EPN-TAP controller, allowing the EPN-TAP view to send events. | 56 | * @param controller The EPN-TAP controller, allowing the EPN-TAP view to send events. |
48 | * @param servicesView The JPanel representing the table of services. | 57 | * @param servicesView The JPanel representing the table of services. |
58 | + * @param resultsView The JPanel representing the table of results. | ||
49 | */ | 59 | */ |
50 | - public EpnTapMainView(EpnTapController controller, VOTableView servicesView) { | 60 | + public EpnTapMainView(EpnTapController controller, VOTableView servicesView, |
61 | + VOTableView resultsView) { | ||
62 | + this.controller = controller; | ||
51 | this.servicesView = servicesView; | 63 | this.servicesView = servicesView; |
52 | - resultsView = new VOTableView(controller.getResultsController()); | 64 | + this.resultsView = resultsView; |
53 | this.requestView = new RequestView(this); | 65 | this.requestView = new RequestView(this); |
54 | 66 | ||
55 | buildWindow(); | 67 | buildWindow(); |
56 | - } | ||
57 | 68 | ||
58 | - /** | ||
59 | - * @param columns The name of each column to fill the Service table. | ||
60 | - * @param values A 2D array, where the first dimension represents the rows of the Services | ||
61 | - * table. The second one represents each element, in the same order as the `columns`. | ||
62 | - */ | ||
63 | - public void fillServices(String[] columns, Object[][] values) { | ||
64 | - servicesView.buildArray(columns, values); | 69 | + // TODO: support multi-selection |
70 | + KeyListener tableKeyListener = new KeyAdapter() { | ||
71 | + @Override | ||
72 | + public void keyPressed(KeyEvent e) { | ||
73 | + controller.setSelectedService(servicesView.getTable().getSelectedRow()); | ||
74 | + } | ||
75 | + }; | ||
76 | + MouseListener tableMouseListener = new MouseAdapter() { | ||
77 | + @Override | ||
78 | + public void mouseClicked(MouseEvent e) { | ||
79 | + controller.setSelectedService(servicesView.getTable().getSelectedRow()); | ||
80 | + } | ||
81 | + }; | ||
82 | + | ||
83 | + servicesView.getTable().addKeyListener(tableKeyListener); | ||
84 | + servicesView.getTable().addMouseListener(tableMouseListener); | ||
65 | } | 85 | } |
66 | 86 | ||
67 | /** | 87 | /** |
68 | - * @param columns The name of each column to fill the Results table. | ||
69 | - * @param values A 2D array, where the first dimension represents the rows of the Results table. | ||
70 | - * The second one represents each element, in the same order as the `columns`. | 88 | + * @return The main EPNT-TAP controller. |
71 | */ | 89 | */ |
72 | - public void fillResults(String[] columns, Object[][] values) { | ||
73 | - resultsView.buildArray(columns, values); | 90 | + public EpnTapController getController() { |
91 | + return controller; | ||
74 | } | 92 | } |
75 | 93 | ||
76 | /** | 94 | /** |
@@ -107,7 +125,8 @@ public class EpnTapMainView extends JPanel { | @@ -107,7 +125,8 @@ public class EpnTapMainView extends JPanel { | ||
107 | * @param message The message of the error. | 125 | * @param message The message of the error. |
108 | */ | 126 | */ |
109 | public void displayError(String title, String message) { | 127 | public void displayError(String title, String message) { |
110 | - JOptionPane.showMessageDialog(this, message, title, JOptionPane.ERROR_MESSAGE); | 128 | + JOptionPane.showMessageDialog(this, message, title, |
129 | + JOptionPane.ERROR_MESSAGE); | ||
111 | } | 130 | } |
112 | 131 | ||
113 | } | 132 | } |
src/main/java/eu/omp/irap/vespa/epntapclient/view/RequestView.java
@@ -17,15 +17,21 @@ | @@ -17,15 +17,21 @@ | ||
17 | package eu.omp.irap.vespa.epntapclient.view; | 17 | package eu.omp.irap.vespa.epntapclient.view; |
18 | 18 | ||
19 | import java.awt.BorderLayout; | 19 | import java.awt.BorderLayout; |
20 | +import java.awt.event.ActionEvent; | ||
21 | +import java.awt.event.ActionListener; | ||
20 | 22 | ||
23 | +import javax.swing.JButton; | ||
21 | import javax.swing.JLabel; | 24 | import javax.swing.JLabel; |
22 | import javax.swing.JPanel; | 25 | import javax.swing.JPanel; |
23 | import javax.swing.JTextArea; | 26 | import javax.swing.JTextArea; |
24 | 27 | ||
28 | +import eu.omp.irap.vespa.epntapclient.utils.Log; | ||
29 | +import eu.omp.irap.vespa.epntapclient.utils.Queries; | ||
30 | + | ||
25 | /** | 31 | /** |
26 | * @author N. Jourdane | 32 | * @author N. Jourdane |
27 | */ | 33 | */ |
28 | -public class RequestView extends JPanel { | 34 | +public class RequestView extends JPanel implements ActionListener { |
29 | 35 | ||
30 | /** The serial version UID (affected with a random number). */ | 36 | /** The serial version UID (affected with a random number). */ |
31 | private static final long serialVersionUID = 1262856496809315405L; | 37 | private static final long serialVersionUID = 1262856496809315405L; |
@@ -33,11 +39,8 @@ public class RequestView extends JPanel { | @@ -33,11 +39,8 @@ public class RequestView extends JPanel { | ||
33 | /** The EPN-TAP main view. */ | 39 | /** The EPN-TAP main view. */ |
34 | EpnTapMainView mainView; | 40 | EpnTapMainView mainView; |
35 | 41 | ||
36 | - /** The text area where the user put its requests. */ | ||
37 | - private JTextArea queryArea; | ||
38 | - | ||
39 | - /** The text area where the user put its requests. */ | ||
40 | - private JLabel queryTitle; | 42 | + /** The text area where the user put the query. */ |
43 | + JTextArea queryArea; | ||
41 | 44 | ||
42 | /** | 45 | /** |
43 | * Method constructor | 46 | * Method constructor |
@@ -46,12 +49,28 @@ public class RequestView extends JPanel { | @@ -46,12 +49,28 @@ public class RequestView extends JPanel { | ||
46 | */ | 49 | */ |
47 | public RequestView(EpnTapMainView mainView) { | 50 | public RequestView(EpnTapMainView mainView) { |
48 | this.mainView = mainView; | 51 | this.mainView = mainView; |
49 | - queryArea = new JTextArea(""); | ||
50 | - queryTitle = new JLabel("Query for the selected service"); | ||
51 | - | 52 | + JLabel queryTitle = new JLabel("Query for the selected service"); |
53 | + queryArea = new JTextArea(Queries.SAMPLE_AMDA_QUERY); | ||
54 | + JButton button = new JButton("Send query"); | ||
55 | + button.setName("btnSend"); | ||
52 | setLayout(new BorderLayout()); | 56 | setLayout(new BorderLayout()); |
57 | + | ||
53 | this.add(queryTitle, BorderLayout.NORTH); | 58 | this.add(queryTitle, BorderLayout.NORTH); |
54 | this.add(queryArea, BorderLayout.CENTER); | 59 | this.add(queryArea, BorderLayout.CENTER); |
60 | + this.add(button, BorderLayout.SOUTH); | ||
61 | + | ||
62 | + button.addActionListener(this); | ||
63 | + } | ||
64 | + | ||
65 | + @Override | ||
66 | + public void actionPerformed(ActionEvent e) { | ||
67 | + if (((JButton) e.getSource()).getName() == "btnSend") { | ||
68 | + try { | ||
69 | + mainView.getController().sendQuery(queryArea.getText()); | ||
70 | + } catch (Exception e1) { | ||
71 | + Log.LOGGER.severe(e1.getMessage()); | ||
72 | + } | ||
73 | + } | ||
55 | } | 74 | } |
56 | 75 | ||
57 | } | 76 | } |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableConnection.java
@@ -56,13 +56,14 @@ public class VOTableConnection { | @@ -56,13 +56,14 @@ public class VOTableConnection { | ||
56 | int responseCode = -1; | 56 | int responseCode = -1; |
57 | String uri = targetURL + "/sync"; | 57 | String uri = targetURL + "/sync"; |
58 | String parameters = "REQUEST=doQuery&LANG=" + queryLanguage + "&QUERY="; | 58 | String parameters = "REQUEST=doQuery&LANG=" + queryLanguage + "&QUERY="; |
59 | - parameters += URLEncoder.encode(query, Const.CHARACTER_SET); | 59 | + parameters += URLEncoder.encode(query, Const.CHARACTER_SET).replace("+", "%20") |
60 | + .replace(".", "%2E").replace("-", "%2D").replace("*", "%2A").replace("_", "%5F"); | ||
60 | 61 | ||
61 | Log.LOGGER.info("request: " + uri + "?" + parameters); | 62 | Log.LOGGER.info("request: " + uri + "?" + parameters); |
62 | try { | 63 | try { |
63 | responseCode = VOTableConnection.sendGet(uri, parameters, voTablePath); | 64 | responseCode = VOTableConnection.sendGet(uri, parameters, voTablePath); |
64 | } catch (Exception e1) { | 65 | } catch (Exception e1) { |
65 | - throw new Exception("Can not send the specified query: " + uri + "?" + query, e1); | 66 | + throw new Exception("Can not send the request: " + uri + "?" + parameters, e1); |
66 | } | 67 | } |
67 | if (responseCode != 200) { | 68 | if (responseCode != 200) { |
68 | throw new Exception("Bad response code for the query: " + query); | 69 | throw new Exception("Bad response code for the query: " + query); |
@@ -85,6 +86,7 @@ public class VOTableConnection { | @@ -85,6 +86,7 @@ public class VOTableConnection { | ||
85 | URL obj = new URL(url + "?" + urlParameters); | 86 | URL obj = new URL(url + "?" + urlParameters); |
86 | int responseCode = -1; | 87 | int responseCode = -1; |
87 | 88 | ||
89 | + // TODO: Rรฉcupรฉrer le message d'erreur de la VOTable (VOTABLE/RESOURCE/INFO) | ||
88 | try { | 90 | try { |
89 | HttpURLConnection con = (HttpURLConnection) obj.openConnection(); | 91 | HttpURLConnection con = (HttpURLConnection) obj.openConnection(); |
90 | con.setRequestMethod("GET"); | 92 | con.setRequestMethod("GET"); |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableController.java
@@ -16,7 +16,6 @@ | @@ -16,7 +16,6 @@ | ||
16 | 16 | ||
17 | package eu.omp.irap.vespa.epntapclient.votable.controller; | 17 | package eu.omp.irap.vespa.epntapclient.votable.controller; |
18 | 18 | ||
19 | -import eu.omp.irap.vespa.epntapclient.utils.Log; | ||
20 | import eu.omp.irap.vespa.epntapclient.votable.model.Table; | 19 | import eu.omp.irap.vespa.epntapclient.votable.model.Table; |
21 | import eu.omp.irap.vespa.epntapclient.votable.model.VOTABLE; | 20 | import eu.omp.irap.vespa.epntapclient.votable.model.VOTABLE; |
22 | import eu.omp.irap.vespa.epntapclient.votable.view.VOTableView; | 21 | import eu.omp.irap.vespa.epntapclient.votable.view.VOTableView; |
@@ -32,11 +31,12 @@ public class VOTableController { | @@ -32,11 +31,12 @@ public class VOTableController { | ||
32 | /** The VOTable model */ | 31 | /** The VOTable model */ |
33 | VOTABLE voTable; | 32 | VOTABLE voTable; |
34 | 33 | ||
35 | - /** The table column selected by the user. */ | ||
36 | - int selectedColumn; | ||
37 | - | ||
38 | - /** The table row selected by the user. */ | ||
39 | - int selectedRow; | 34 | + /** |
35 | + * Method constructor | ||
36 | + */ | ||
37 | + public VOTableController() { | ||
38 | + view = new VOTableView(); | ||
39 | + } | ||
40 | 40 | ||
41 | /** | 41 | /** |
42 | * Method constructor | 42 | * Method constructor |
@@ -44,13 +44,10 @@ public class VOTableController { | @@ -44,13 +44,10 @@ public class VOTableController { | ||
44 | * @param voTablePath The path of the VOTable XML file. | 44 | * @param voTablePath The path of the VOTable XML file. |
45 | */ | 45 | */ |
46 | public VOTableController(String voTablePath) { | 46 | public VOTableController(String voTablePath) { |
47 | - view = new VOTableView(this); | ||
48 | - selectedColumn = -1; | ||
49 | - selectedRow = -1; | 47 | + view = new VOTableView(); |
50 | 48 | ||
51 | try { | 49 | try { |
52 | - voTable = VOTableParser.parseVOTable(voTablePath); | ||
53 | - fillView(); | 50 | + fillTable(voTablePath); |
54 | } catch (Exception e) { | 51 | } catch (Exception e) { |
55 | view.displayError("VOTable can not be displayed.\nReason:\n", e.getMessage()); | 52 | view.displayError("VOTable can not be displayed.\nReason:\n", e.getMessage()); |
56 | } | 53 | } |
@@ -64,36 +61,51 @@ public class VOTableController { | @@ -64,36 +61,51 @@ public class VOTableController { | ||
64 | * @param query The query to ask to the registry. | 61 | * @param query The query to ask to the registry. |
65 | */ | 62 | */ |
66 | public VOTableController(String targetURL, String queryLanguage, String query) { | 63 | public VOTableController(String targetURL, String queryLanguage, String query) { |
67 | - view = new VOTableView(this); | ||
68 | - String voTablePath; | 64 | + view = new VOTableView(); |
69 | 65 | ||
70 | try { | 66 | try { |
71 | - voTablePath = VOTableConnection.sendQuery(targetURL, queryLanguage, | ||
72 | - query); | ||
73 | - voTable = VOTableParser.parseVOTable(voTablePath); | ||
74 | - fillView(); | 67 | + fillTable(VOTableConnection.sendQuery(targetURL, queryLanguage, query)); |
75 | } catch (Exception e) { | 68 | } catch (Exception e) { |
76 | view.displayError("VOTable can not be displayed.\nReason:\n", e.getMessage()); | 69 | view.displayError("VOTable can not be displayed.\nReason:\n", e.getMessage()); |
77 | } | 70 | } |
78 | } | 71 | } |
79 | 72 | ||
73 | + public void fillTable(String targetURL, String queryLanguage, String query) throws Exception { | ||
74 | + fillTable(VOTableConnection.sendQuery(targetURL, queryLanguage, query)); | ||
75 | + } | ||
76 | + | ||
80 | /** | 77 | /** |
81 | - * Fill the view with the VOTable data. | ||
82 | - * | ||
83 | - * @throws Exception If there are more than 1 resource or table in the VOTable. | 78 | + * @param voTablePath The path of the VOTable file. |
79 | + * @throws Exception If VOTable can not be parsed or there is more than one VOTable. | ||
84 | */ | 80 | */ |
85 | - private void fillView() throws Exception { | 81 | + public void fillTable(String voTablePath) throws Exception { |
82 | + try { | ||
83 | + voTable = VOTableParser.parseVOTable(voTablePath); | ||
84 | + } catch (Exception e) { | ||
85 | + throw new Exception("Can not parse the VOTable.\n" + e.getMessage()); | ||
86 | + } | ||
87 | + | ||
86 | // TODO: Traiter le cas oรน il y a plus d'une ressource et d'une table. | 88 | // TODO: Traiter le cas oรน il y a plus d'une ressource et d'une table. |
87 | - if (voTable.getRESOURCE().size() != 1) { | ||
88 | - throw new Exception("VOTable with more than one resource are not yet supported."); | 89 | + if (voTable.getRESOURCE().size() > 1) { |
90 | + view.displayError("Several resources", | ||
91 | + "VOTable with more than one resource are not yet supported. See VOTable file for debug:\n" | ||
92 | + + voTablePath); | ||
89 | } | 93 | } |
90 | - if (voTable.getRESOURCE().get(0).getLINKAndTABLEOrRESOURCE().size() != 1) { | ||
91 | - throw new Exception("VOTable with more than one table are not yet supported."); | 94 | + // TODO: iterate over all potential errors |
95 | + if (voTable.getRESOURCE().get(0).getINFO().get(0).getValueAttribute().equals("ERROR")) { | ||
96 | + view.displayError("Bad query", "There is an error on the query:\n" | ||
97 | + + voTable.getRESOURCE().get(0).getINFO().get(0).getValue()); | ||
98 | + } | ||
99 | + if (voTable.getRESOURCE().get(0).getLINKAndTABLEOrRESOURCE().size() > 1) { | ||
100 | + view.displayError("Several tables", | ||
101 | + "VOTable with more than one table are not yet supported. See VOTable file for debug:\n" | ||
102 | + + voTablePath); | ||
92 | } | 103 | } |
93 | Table table = (Table) (voTable.getRESOURCE().get(0).getLINKAndTABLEOrRESOURCE().get(0)); | 104 | Table table = (Table) (voTable.getRESOURCE().get(0).getLINKAndTABLEOrRESOURCE().get(0)); |
105 | + System.out.println(table); | ||
94 | 106 | ||
95 | VOTableDataParser dataParser = new VOTableDataParser(table); | 107 | VOTableDataParser dataParser = new VOTableDataParser(table); |
96 | - view.buildArray(dataParser.getColumnsName(), dataParser.getDataArray()); | 108 | + view.fillTable(dataParser.getColumnsName(), dataParser.getDataArray()); |
97 | } | 109 | } |
98 | 110 | ||
99 | /** | 111 | /** |
@@ -102,12 +114,4 @@ public class VOTableController { | @@ -102,12 +114,4 @@ public class VOTableController { | ||
102 | public VOTableView getView() { | 114 | public VOTableView getView() { |
103 | return view; | 115 | return view; |
104 | } | 116 | } |
105 | - | ||
106 | - /** | ||
107 | - * @param selectedColumn The table column selected by the user. | ||
108 | - * @param selectedRow The table row selected by the user. | ||
109 | - */ | ||
110 | - public void updateSelection(int selectedColumn, int selectedRow) { | ||
111 | - Log.LOGGER.info("Selection updated: [" + selectedColumn + " ; " + selectedRow + "]"); | ||
112 | - } | ||
113 | } | 117 | } |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/view/VOTableView.java
@@ -17,12 +17,6 @@ | @@ -17,12 +17,6 @@ | ||
17 | package eu.omp.irap.vespa.epntapclient.votable.view; | 17 | package eu.omp.irap.vespa.epntapclient.votable.view; |
18 | 18 | ||
19 | import java.awt.BorderLayout; | 19 | import java.awt.BorderLayout; |
20 | -import java.awt.event.KeyAdapter; | ||
21 | -import java.awt.event.KeyEvent; | ||
22 | -import java.awt.event.KeyListener; | ||
23 | -import java.awt.event.MouseAdapter; | ||
24 | -import java.awt.event.MouseEvent; | ||
25 | -import java.awt.event.MouseListener; | ||
26 | import java.util.List; | 20 | import java.util.List; |
27 | 21 | ||
28 | import javax.swing.JOptionPane; | 22 | import javax.swing.JOptionPane; |
@@ -30,73 +24,41 @@ import javax.swing.JPanel; | @@ -30,73 +24,41 @@ import javax.swing.JPanel; | ||
30 | import javax.swing.JScrollPane; | 24 | import javax.swing.JScrollPane; |
31 | import javax.swing.JTable; | 25 | import javax.swing.JTable; |
32 | import javax.swing.ScrollPaneConstants; | 26 | import javax.swing.ScrollPaneConstants; |
33 | - | ||
34 | -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableController; | 27 | +import javax.swing.event.TableModelEvent; |
28 | +import javax.swing.event.TableModelListener; | ||
29 | +import javax.swing.table.DefaultTableModel; | ||
35 | 30 | ||
36 | /** | 31 | /** |
37 | * The main class of the View of the application. | 32 | * The main class of the View of the application. |
38 | * | 33 | * |
39 | * @author N. Jourdane | 34 | * @author N. Jourdane |
40 | */ | 35 | */ |
41 | -public class VOTableView extends JPanel { | 36 | +public class VOTableView extends JPanel implements TableModelListener { |
42 | 37 | ||
43 | /** The serial version UID (affected with a random number). */ | 38 | /** The serial version UID (affected with a random number). */ |
44 | private static final long serialVersionUID = -1233290271099283814L; | 39 | private static final long serialVersionUID = -1233290271099283814L; |
45 | 40 | ||
46 | - /** The VOTable controller, allowing the view to send events. */ | ||
47 | - private VOTableController controller; | ||
48 | - | ||
49 | /** The JTable component where the data are displayed. */ | 41 | /** The JTable component where the data are displayed. */ |
50 | private JTable table; | 42 | private JTable table; |
51 | 43 | ||
52 | - /** | ||
53 | - * Method constructor | ||
54 | - * | ||
55 | - * @param controller The VOTable controller, allowing the view to send events. | ||
56 | - */ | ||
57 | - public VOTableView(VOTableController controller) { | ||
58 | - this.controller = controller; | ||
59 | - } | 44 | + /** The DataModel representing the VOTable data in the JTable element. */ |
45 | + DefaultTableModel tableData; | ||
60 | 46 | ||
61 | /** | 47 | /** |
62 | - * Build and fill the GUI. | ||
63 | - * | ||
64 | - * @param keys The name of each column of the VOTable data. | ||
65 | - * @param values A list of arrays, representing the rows of the VOTable data. In each row, | ||
66 | - * elements are in the same order as `keys`. | ||
67 | - */ | ||
68 | - public void buildArray(String[] keys, List<Object[]> values) { | ||
69 | - Object valuesArray[][] = values.toArray(new Object[values.size()][]); | ||
70 | - buildArray(keys, valuesArray); | ||
71 | - } | ||
72 | - | ||
73 | - /** | ||
74 | - * Build and fill the GUI. | ||
75 | - * | ||
76 | - * @param keys The name of each column of the VOTable data. | ||
77 | - * @param values A 2D array, where the first dimension represents the rows of the VOTable data. | ||
78 | - * The second one represents each element, in the same order as `keys`. | 48 | + * Method constructor |
79 | */ | 49 | */ |
80 | - public void buildArray(String[] keys, Object[][] values) { | ||
81 | - table = new JTable(values, keys); | 50 | + public VOTableView() { |
51 | + tableData = new DefaultTableModel() { | ||
52 | + /** The serial version UID (affected with a random number). */ | ||
53 | + private static final long serialVersionUID = 8195913508549662555L; | ||
82 | 54 | ||
83 | - // TODO: support multi-selection | ||
84 | - KeyListener tableKeyListener = new KeyAdapter() { | ||
85 | @Override | 55 | @Override |
86 | - public void keyPressed(KeyEvent e) { | ||
87 | - updateSelection(); | ||
88 | - } | ||
89 | - }; | ||
90 | - MouseListener tableMouseListener = new MouseAdapter() { | ||
91 | - @Override | ||
92 | - public void mouseClicked(MouseEvent e) { | ||
93 | - updateSelection(); | 56 | + public boolean isCellEditable(int row, int column) { |
57 | + return false; | ||
94 | } | 58 | } |
95 | }; | 59 | }; |
96 | 60 | ||
97 | - table.addKeyListener(tableKeyListener); | ||
98 | - table.addMouseListener(tableMouseListener); | ||
99 | - | 61 | + table = new JTable(tableData); |
100 | JScrollPane scrollPane = new JScrollPane(table); | 62 | JScrollPane scrollPane = new JScrollPane(table); |
101 | scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); | 63 | scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); |
102 | scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); | 64 | scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); |
@@ -106,20 +68,48 @@ public class VOTableView extends JPanel { | @@ -106,20 +68,48 @@ public class VOTableView extends JPanel { | ||
106 | } | 68 | } |
107 | 69 | ||
108 | /** | 70 | /** |
109 | - * This method is called on keyPressed and mouseClicked events on the JTable. | 71 | + * Fill the JTable. |
72 | + * | ||
73 | + * @param columns the column names | ||
74 | + * @param data The VoTable data displayed on the JTable | ||
75 | + */ | ||
76 | + public void fillTable(String[] columns, List<Object[]> data) { | ||
77 | + Object values[][] = data.toArray(new Object[data.size()][]); | ||
78 | + tableData.setDataVector(values, columns); | ||
79 | + table.setRowSelectionInterval(0, 0); | ||
80 | + } | ||
81 | + | ||
82 | + /** | ||
83 | + * @return The JTable element. | ||
110 | */ | 84 | */ |
111 | - void updateSelection() { | ||
112 | - controller.updateSelection(table.getSelectedColumn(), table.getSelectedRow()); | 85 | + public JTable getTable() { |
86 | + return table; | ||
87 | + } | ||
88 | + | ||
89 | + /** | ||
90 | + * @param column The column index of the data to get. | ||
91 | + * @param row The row index of the data to get. | ||
92 | + * @return The element, can be a String, a integer or something else, according to the voTable | ||
93 | + * content. | ||
94 | + */ | ||
95 | + public Object getValueAt(int column, int row) { | ||
96 | + return tableData.getValueAt(row, column); | ||
113 | } | 97 | } |
114 | 98 | ||
115 | /** | 99 | /** |
116 | * Display an error. | 100 | * Display an error. |
117 | * | 101 | * |
118 | - * @param title The title of the error. | ||
119 | - * @param message The message of the error. | 102 | + * @param title The title of the window. |
103 | + * @param message The error message to display. | ||
120 | */ | 104 | */ |
121 | public void displayError(String title, String message) { | 105 | public void displayError(String title, String message) { |
122 | JOptionPane.showMessageDialog(this, message, title, JOptionPane.ERROR_MESSAGE); | 106 | JOptionPane.showMessageDialog(this, message, title, JOptionPane.ERROR_MESSAGE); |
123 | } | 107 | } |
124 | 108 | ||
109 | + @Override | ||
110 | + public void tableChanged(TableModelEvent e) { | ||
111 | + if (e.getType() != TableModelEvent.UPDATE) | ||
112 | + return; | ||
113 | + } | ||
114 | + | ||
125 | } | 115 | } |