Commit d03dc8a73dc0df7ef432c397051c6110f7829686
1 parent
041cc394
Exists in
master
Make VOTableConnection more generic (just a class to send any kind of queries) a…
…nd move it in utils package.
Showing
6 changed files
with
86 additions
and
48 deletions
Show diff stats
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableController.java
... | ... | @@ -17,7 +17,11 @@ |
17 | 17 | package eu.omp.irap.vespa.epntapclient.votable.controller; |
18 | 18 | |
19 | 19 | import java.io.IOException; |
20 | +import java.text.SimpleDateFormat; | |
21 | +import java.util.Date; | |
22 | +import java.util.HashMap; | |
20 | 23 | import java.util.List; |
24 | +import java.util.Map; | |
21 | 25 | import java.util.logging.Logger; |
22 | 26 | |
23 | 27 | import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantDisplayVOTableException; |
... | ... | @@ -28,6 +32,8 @@ import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantDi |
28 | 32 | import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException; |
29 | 33 | import eu.omp.irap.vespa.epntapclient.votable.model.Table; |
30 | 34 | import eu.omp.irap.vespa.epntapclient.votable.model.VOTABLE; |
35 | +import eu.omp.irap.vespa.epntapclient.votable.utils.Consts; | |
36 | +import eu.omp.irap.vespa.epntapclient.votable.utils.Network; | |
31 | 37 | import eu.omp.irap.vespa.epntapclient.votable.view.VOTableViewListener; |
32 | 38 | |
33 | 39 | /** |
... | ... | @@ -90,7 +96,7 @@ public class VOTableController implements VOTableViewListener { |
90 | 96 | public void readTable() throws CantDisplayVOTableException, CantSendQueryException { |
91 | 97 | |
92 | 98 | if (voTablePath == null) { |
93 | - voTablePath = VOTableConnection.sendQuery(targetURL, queryLanguage, query); | |
99 | + voTablePath = VOTableController.getVOTable(targetURL, query); | |
94 | 100 | } |
95 | 101 | voTable = VOTableParser.parseVOTable(voTablePath); |
96 | 102 | |
... | ... | @@ -119,6 +125,21 @@ public class VOTableController implements VOTableViewListener { |
119 | 125 | } |
120 | 126 | } |
121 | 127 | |
128 | + public static String getVOTable(String targetURL, String query) throws CantSendQueryException { | |
129 | + String dateStr = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss_SSS").format(new Date()); | |
130 | + String voTablePath = Consts.TMP_DIR + "/votable" + dateStr + ".xml"; | |
131 | + | |
132 | + String url = targetURL + "/sync"; | |
133 | + | |
134 | + Map<String, String> parameters = new HashMap<>(); | |
135 | + parameters.put("REQUEST", Consts.QUERY_REQUEST); | |
136 | + parameters.put("LANG", Consts.QUERY_LANG); | |
137 | + parameters.put("FORMAT", query); | |
138 | + | |
139 | + Network.sendQuery(url, parameters, voTablePath); | |
140 | + return voTablePath; | |
141 | + } | |
142 | + | |
122 | 143 | public String[] getColumns() { |
123 | 144 | return voTableColumns; |
124 | 145 | } | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableDataParser.java
... | ... | @@ -33,7 +33,7 @@ import eu.omp.irap.vespa.epntapclient.votable.model.Field; |
33 | 33 | import eu.omp.irap.vespa.epntapclient.votable.model.Stream; |
34 | 34 | import eu.omp.irap.vespa.epntapclient.votable.model.Table; |
35 | 35 | import eu.omp.irap.vespa.epntapclient.votable.model.TableData; |
36 | -import eu.omp.irap.vespa.epntapclient.votable.utils.Utils; | |
36 | +import eu.omp.irap.vespa.epntapclient.votable.utils.Debug; | |
37 | 37 | |
38 | 38 | /** |
39 | 39 | * @author N. Jourdane |
... | ... | @@ -94,7 +94,7 @@ public class VOTableDataParser { |
94 | 94 | VOTableDataParser.parseFITSStream(table.getDATA().getFITS().getSTREAM(), fields); |
95 | 95 | } |
96 | 96 | |
97 | - Utils.printObject("voTableData", data); | |
97 | + Debug.printObject("voTableData", data); | |
98 | 98 | } |
99 | 99 | |
100 | 100 | /** | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableException.java
... | ... | @@ -85,6 +85,23 @@ public abstract class VOTableException extends Exception { |
85 | 85 | } |
86 | 86 | } |
87 | 87 | |
88 | + /** The URL is not correctly formated. */ | |
89 | + public static class UnsupportedParameterEncodingException extends CantSendQueryException { | |
90 | + | |
91 | + /** */ | |
92 | + private static final long serialVersionUID = 1L; | |
93 | + | |
94 | + | |
95 | + /** | |
96 | + * @param uri The URI sent to the server. | |
97 | + * @param e The exception thrown. | |
98 | + */ | |
99 | + public UnsupportedParameterEncodingException(String key, String value, Exception e) { | |
100 | + super("The URL parameter " + key + " with value '" + value | |
101 | + + "' is not correctly encoded.", e); | |
102 | + } | |
103 | + } | |
104 | + | |
88 | 105 | /** Can not print the result in the file. */ |
89 | 106 | public static class CantPrintRequestResultException extends CantSendQueryException { |
90 | 107 | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/utils/Consts.java
... | ... | @@ -36,6 +36,10 @@ public class Consts { |
36 | 36 | // http://gavo.aip.de/tap |
37 | 37 | // http://voparis-cdpp.obspm.fr/tap |
38 | 38 | |
39 | + public static final String QUERY_LANG = "ADQL"; | |
40 | + | |
41 | + public static final String QUERY_REQUEST = "doQuery"; | |
42 | + | |
39 | 43 | |
40 | 44 | /** Constructor to hide the implicit public one. */ |
41 | 45 | private Consts() { | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableConnection.java renamed to src/main/java/eu/omp/irap/vespa/epntapclient/votable/utils/Network.java
... | ... | @@ -14,7 +14,7 @@ |
14 | 14 | * <http://www.gnu.org/licenses/>. |
15 | 15 | */ |
16 | 16 | |
17 | -package eu.omp.irap.vespa.epntapclient.votable.controller; | |
17 | +package eu.omp.irap.vespa.epntapclient.votable.utils; | |
18 | 18 | |
19 | 19 | import java.io.BufferedReader; |
20 | 20 | import java.io.FileNotFoundException; |
... | ... | @@ -25,8 +25,7 @@ import java.io.UnsupportedEncodingException; |
25 | 25 | import java.net.HttpURLConnection; |
26 | 26 | import java.net.URL; |
27 | 27 | import java.net.URLEncoder; |
28 | -import java.text.SimpleDateFormat; | |
29 | -import java.util.Date; | |
28 | +import java.util.Map; | |
30 | 29 | import java.util.logging.Level; |
31 | 30 | import java.util.logging.Logger; |
32 | 31 | |
... | ... | @@ -36,24 +35,23 @@ import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSe |
36 | 35 | import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.CantGetResponseCode; |
37 | 36 | import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.CantOpenConnectionException; |
38 | 37 | import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.CantPrintRequestResultException; |
39 | -import eu.omp.irap.vespa.epntapclient.votable.utils.Const; | |
38 | +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.UnsupportedParameterEncodingException; | |
39 | +import eu.omp.irap.vespa.epntapclient.votable.utils.Strings.StringJoiner; | |
40 | 40 | |
41 | 41 | /** |
42 | - * This class provide HTTP connection support to send requests through POST / GET protocols. | |
43 | - * | |
44 | 42 | * @author N. Jourdane |
45 | 43 | */ |
46 | -public final class VOTableConnection { | |
44 | +public class Network { | |
47 | 45 | |
48 | - /** The logger for the class VOTableConnection. */ | |
49 | - private static final Logger logger = Logger.getLogger(VOTableConnection.class.getName()); | |
46 | + /** The logger for the class Network. */ | |
47 | + private static final Logger logger = Logger.getLogger(Network.class.getName()); | |
50 | 48 | |
51 | 49 | /** The user agent used for the requests. */ |
52 | 50 | private static final String USER_AGENT = "Mozilla/5.0"; |
53 | 51 | |
54 | 52 | |
55 | - /** Constructor to hide the implicit public one. */ | |
56 | - private VOTableConnection() { | |
53 | + /** Private constructor to hide the implicit public one. */ | |
54 | + private Network() { | |
57 | 55 | } |
58 | 56 | |
59 | 57 | /** |
... | ... | @@ -63,31 +61,30 @@ public final class VOTableConnection { |
63 | 61 | * @return The path of the temporary XML file containing the http response. |
64 | 62 | * @throws CantSendQueryException If the query can not be sent. |
65 | 63 | */ |
66 | - public static String sendQuery(String targetURL, String queryLanguage, | |
67 | - String query) throws CantSendQueryException { | |
64 | + public static void sendQuery(String url, Map<String, String> parameters, String outputPath) | |
65 | + throws CantSendQueryException { | |
68 | 66 | |
69 | - SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd_hhmmss_SSS"); | |
70 | - String voTablePath = Const.TMP_DIR + "/votable" + ft.format(new Date()) + ".xml"; | |
67 | + StringJoiner paramJoiner = new StringJoiner("&"); | |
68 | + for (Map.Entry<String, String> param : parameters.entrySet()) { | |
69 | + try { | |
70 | + String value = URLEncoder.encode(param.getValue(), Consts.ENCODING) | |
71 | + .replace("+", "%20") | |
72 | + .replace(".", "%2E").replace("-", "%2D").replace("*", "%2A") | |
73 | + .replace("_", "%5F"); | |
74 | + paramJoiner.add(param.getKey() + "=" + value); | |
75 | + | |
76 | + } catch (UnsupportedEncodingException e) { | |
77 | + throw new UnsupportedParameterEncodingException(param.getKey(), param.getValue(), | |
78 | + e); | |
79 | + } | |
71 | 80 | |
72 | - String uri = targetURL + "/sync"; | |
73 | - String parameters = "REQUEST=doQuery&LANG=" + queryLanguage + "&FORMAT=votable&QUERY="; | |
74 | - try { | |
75 | - parameters += URLEncoder.encode(query, Const.ENCODING).replace("+", "%20") | |
76 | - .replace(".", "%2E").replace("-", "%2D").replace("*", "%2A") | |
77 | - .replace("_", "%5F"); | |
78 | - } catch (UnsupportedEncodingException e) { | |
79 | - throw new CantSendQueryException.MalformedURLException(uri, e); | |
80 | 81 | } |
81 | 82 | |
82 | - VOTableConnection.logger.info("request: " + uri + "?" + parameters); | |
83 | 83 | try { |
84 | - VOTableConnection.printRequestResult(VOTableConnection.sendGet(uri, parameters), | |
85 | - voTablePath); | |
84 | + Network.printRequestResult(Network.sendGet(url + paramJoiner), outputPath); | |
86 | 85 | } catch (IOException e) { |
87 | - throw new CantPrintRequestResultException(voTablePath, e); | |
86 | + throw new CantPrintRequestResultException(outputPath, e); | |
88 | 87 | } |
89 | - | |
90 | - return voTablePath; | |
91 | 88 | } |
92 | 89 | |
93 | 90 | /** |
... | ... | @@ -96,17 +93,16 @@ public final class VOTableConnection { |
96 | 93 | * @return A string builder containing the result of the query. |
97 | 94 | * @throws CantSendQueryException If the query can not be sent. |
98 | 95 | */ |
99 | - public static StringBuilder sendGet(String url, String urlParameters) | |
96 | + private static StringBuilder sendGet(String url) | |
100 | 97 | throws CantSendQueryException { |
101 | 98 | String inputLine; |
102 | 99 | StringBuilder response = new StringBuilder(); |
103 | 100 | URL obj; |
104 | - String uri = url + "?" + urlParameters; | |
105 | 101 | |
106 | 102 | try { |
107 | - obj = new URL(uri); | |
103 | + obj = new URL(url); | |
108 | 104 | } catch (java.net.MalformedURLException e) { |
109 | - throw new CantSendQueryException.MalformedURLException(uri, e); | |
105 | + throw new CantSendQueryException.MalformedURLException(url, e); | |
110 | 106 | } |
111 | 107 | |
112 | 108 | HttpURLConnection con; |
... | ... | @@ -115,20 +111,20 @@ public final class VOTableConnection { |
115 | 111 | con = (HttpURLConnection) obj.openConnection(); |
116 | 112 | con.setRequestMethod("GET"); |
117 | 113 | } catch (IOException e) { |
118 | - throw new CantOpenConnectionException(uri, e); | |
114 | + throw new CantOpenConnectionException(url, e); | |
119 | 115 | } |
120 | 116 | |
121 | - con.setRequestProperty("User-Agent", VOTableConnection.USER_AGENT); | |
117 | + con.setRequestProperty("User-Agent", Network.USER_AGENT); | |
122 | 118 | int code = -1; |
123 | 119 | |
124 | 120 | try { |
125 | 121 | code = con.getResponseCode(); |
126 | 122 | } catch (IOException e) { |
127 | - throw new CantGetResponseCode(uri, e); | |
123 | + throw new CantGetResponseCode(url, e); | |
128 | 124 | } |
129 | 125 | |
130 | 126 | if (code != HttpURLConnection.HTTP_OK && code != HttpURLConnection.HTTP_BAD_REQUEST) { |
131 | - throw new BadResponseCodeException(uri, code); | |
127 | + throw new BadResponseCodeException(url, code); | |
132 | 128 | } |
133 | 129 | |
134 | 130 | try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) { |
... | ... | @@ -136,14 +132,14 @@ public final class VOTableConnection { |
136 | 132 | response.append(inputLine); |
137 | 133 | } |
138 | 134 | } catch (IOException e1) { |
139 | - VOTableConnection.logger.log(Level.WARNING, "Can not get input stream", e1); | |
135 | + Network.logger.log(Level.WARNING, "Can not get input stream", e1); | |
140 | 136 | try (BufferedReader in = new BufferedReader( |
141 | 137 | new InputStreamReader(con.getErrorStream()))) { |
142 | 138 | while ((inputLine = in.readLine()) != null) { |
143 | 139 | response.append(inputLine); |
144 | 140 | } |
145 | 141 | } catch (IOException e2) { |
146 | - throw new CantGetErrorStream(uri, e2); | |
142 | + throw new CantGetErrorStream(url, e2); | |
147 | 143 | } |
148 | 144 | } |
149 | 145 | |
... | ... | @@ -160,12 +156,12 @@ public final class VOTableConnection { |
160 | 156 | private static void printRequestResult(StringBuilder response, String resultFileName) |
161 | 157 | throws IOException { |
162 | 158 | |
163 | - try (PrintWriter writer = new PrintWriter(resultFileName, Const.ENCODING)) { | |
159 | + try (PrintWriter writer = new PrintWriter(resultFileName, Consts.ENCODING)) { | |
164 | 160 | writer.println(response); |
165 | 161 | } catch (FileNotFoundException e1) { |
166 | 162 | throw new IOException("The file " + resultFileName + " is not found.", e1); |
167 | 163 | } catch (UnsupportedEncodingException e2) { |
168 | - throw new IOException("Bad encoding with " + Const.ENCODING, e2); | |
164 | + throw new IOException("Bad encoding with " + Consts.ENCODING, e2); | |
169 | 165 | } |
170 | 166 | } |
171 | -} | |
172 | 167 | \ No newline at end of file |
168 | +} | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/votable/view/VOTableView.java
... | ... | @@ -29,7 +29,7 @@ import javax.swing.table.DefaultTableModel; |
29 | 29 | import javax.swing.table.TableModel; |
30 | 30 | import javax.swing.table.TableRowSorter; |
31 | 31 | |
32 | -import eu.omp.irap.vespa.epntapclient.votable.utils.Utils; | |
32 | +import eu.omp.irap.vespa.epntapclient.votable.utils.Debug; | |
33 | 33 | |
34 | 34 | /** |
35 | 35 | * The main class of the View of the application. |
... | ... | @@ -87,8 +87,8 @@ public class VOTableView extends JPanel implements TableModelListener { |
87 | 87 | */ |
88 | 88 | public void fillTable(String[] columns, List<Object[]> data) { |
89 | 89 | Object[][] values = data.toArray(new Object[data.size()][]); |
90 | - Utils.printObject("tableColumns", columns); | |
91 | - Utils.printObject("tableData", values); | |
90 | + Debug.printObject("tableColumns", columns); | |
91 | + Debug.printObject("tableData", values); | |
92 | 92 | tableData.setDataVector(values, columns); |
93 | 93 | if (values.length != 0) { |
94 | 94 | table.setRowSelectionInterval(0, 0); | ... | ... |