Commit 4164c0743ecef0bbfeae9e3ed1a61837875d6d52

Authored by Nathanael Jourdane
1 parent b6b4fb3e
Exists in master

Use dedicated exceptions which extends SendQueryException and CantFillTableException.

src/main/java/eu/omp/irap/vespa/epntapclient/controller/EpnTapController.java
... ... @@ -180,9 +180,9 @@ public class EpnTapController implements MainViewListener {
180 180 logger.warning("Event " + event.toString() + " detected but is not implemented.");
181 181 }
182 182 } catch (Exception e) {
183   - mainView.displayError("Error", "An unexpected error occured: " + e.getMessage()
184   - + ".\nPlease report it to the developper team along with the stacktrace.");
185   - logger.log(Level.SEVERE, "Error occured when " + event.toString(), e);
  183 + mainView.displayError("Error", e.getMessage());
  184 + logger.log(Level.WARNING,
  185 + "Exception thrown when " + event.toString() + ": " + e.getMessage());
186 186 }
187 187 }
188 188 }
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableConnection.java
... ... @@ -23,7 +23,6 @@ import java.io.InputStreamReader;
23 23 import java.io.PrintWriter;
24 24 import java.io.UnsupportedEncodingException;
25 25 import java.net.HttpURLConnection;
26   -import java.net.MalformedURLException;
27 26 import java.net.URL;
28 27 import java.net.URLEncoder;
29 28 import java.text.SimpleDateFormat;
... ... @@ -31,7 +30,12 @@ import java.util.Date;
31 30 import java.util.logging.Logger;
32 31  
33 32 import eu.omp.irap.vespa.epntapclient.utils.Const;
34   -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.SendQueryException;
  33 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException;
  34 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.BadResponseCodeException;
  35 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.CantGetErrorStream;
  36 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.CantGetResponseCode;
  37 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.CantOpenConnectionException;
  38 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException.CantPrintRequestResultException;
35 39  
36 40 /**
37 41 * This class provide HTTP connection support to send requests through POST / GET protocols.
... ... @@ -50,15 +54,14 @@ public final class VOTableConnection {
50 54 }
51 55  
52 56 /**
53   - * @param targetURL The url of the registry to communicate (ie. "http://reg.g-vo.org").
  57 + * @param targetURL The URL of the registry to communicate (ie. "http://reg.g-vo.org").
54 58 * @param queryLanguage The language used for the queries (ie. "ADQL").
55 59 * @param query The query to ask to the registry.
56   - * @throws HTTPRequestException Can not send the query.
57   - * @throws BadRequestException The response code is not 200.
58 60 * @return The path of the temporary XML file containing the http response.
  61 + * @throws CantSendQueryException If the query can not be sent.
59 62 */
60 63 public static String sendQuery(String targetURL, String queryLanguage,
61   - String query) throws SendQueryException {
  64 + String query) throws CantSendQueryException {
62 65  
63 66 SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd_hhmmss_SSS");
64 67 String voTablePath = Const.TMP_DIR + "/votable" + ft.format(new Date()) + ".xml";
... ... @@ -70,14 +73,14 @@ public final class VOTableConnection {
70 73 .replace(".", "%2E").replace("-", "%2D").replace("*", "%2A")
71 74 .replace("_", "%5F");
72 75 } catch (UnsupportedEncodingException e) {
73   - throw new SendQueryException("Can not encode URI " + uri, e);
  76 + throw new CantSendQueryException.MalformedURLException(uri, e);
74 77 }
75 78  
76 79 logger.info("request: " + uri + "?" + parameters);
77 80 try {
78 81 printRequestResult(sendGet(uri, parameters), voTablePath);
79 82 } catch (IOException e) {
80   - throw new SendQueryException("Can not print the result in a file.", e);
  83 + throw new CantPrintRequestResultException(voTablePath, e);
81 84 }
82 85  
83 86 return voTablePath;
... ... @@ -86,12 +89,11 @@ public final class VOTableConnection {
86 89 /**
87 90 * @param url The target URL of the request.
88 91 * @param urlParameters The parameters of the request.
89   - * @param resultFileName The name of the file where the request response content is writed.
90   - * @throws HTTPRequestException Can not send the request.
91   - * @throws BadRequestException If the
  92 + * @return A string builder containing the result of the query.
  93 + * @throws CantSendQueryException If the query can not be sent.
92 94 */
93 95 public static StringBuilder sendGet(String url, String urlParameters)
94   - throws SendQueryException {
  96 + throws CantSendQueryException {
95 97 String inputLine;
96 98 StringBuilder response = new StringBuilder();
97 99 URL obj;
... ... @@ -99,8 +101,8 @@ public final class VOTableConnection {
99 101  
100 102 try {
101 103 obj = new URL(uri);
102   - } catch (MalformedURLException e) {
103   - throw new SendQueryException("The URI " + uri + " is not formated correctly.", e);
  104 + } catch (java.net.MalformedURLException e) {
  105 + throw new CantSendQueryException.MalformedURLException(uri, e);
104 106 }
105 107  
106 108 HttpURLConnection con;
... ... @@ -109,7 +111,7 @@ public final class VOTableConnection {
109 111 con = (HttpURLConnection) obj.openConnection();
110 112 con.setRequestMethod("GET");
111 113 } catch (IOException e) {
112   - throw new SendQueryException("Can not open HTTP GET connection with uri " + uri, e);
  114 + throw new CantOpenConnectionException(uri, e);
113 115 }
114 116  
115 117 con.setRequestProperty("User-Agent", USER_AGENT);
... ... @@ -118,11 +120,11 @@ public final class VOTableConnection {
118 120 try {
119 121 code = con.getResponseCode();
120 122 } catch (IOException e) {
121   - throw new SendQueryException("Can not get the HTTP response code", e);
  123 + throw new CantGetResponseCode(uri, e);
122 124 }
123 125  
124 126 if (code != HttpURLConnection.HTTP_OK && code != HttpURLConnection.HTTP_BAD_REQUEST) {
125   - throw new SendQueryException("The server returned a bad response code: " + code);
  127 + throw new BadResponseCodeException(uri, code);
126 128 }
127 129  
128 130 try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
... ... @@ -130,7 +132,7 @@ public final class VOTableConnection {
130 132 response.append(inputLine);
131 133 }
132 134 in.close();
133   - } catch (IOException e1) {
  135 + } catch (@SuppressWarnings("unused") IOException e1) {
134 136 try (BufferedReader in = new BufferedReader(
135 137 new InputStreamReader(con.getErrorStream()))) {
136 138 while ((inputLine = in.readLine()) != null) {
... ... @@ -138,11 +140,7 @@ public final class VOTableConnection {
138 140 }
139 141 in.close();
140 142 } catch (IOException e2) {
141   - throw new SendQueryException("Can not get the error stream.", e2);
142   - }
143   - if (code != HttpURLConnection.HTTP_BAD_REQUEST) {
144   - throw new SendQueryException(
145   - "The server returned a bad response code (not 200 neither 400).", e1);
  143 + throw new CantGetErrorStream(uri, e2);
146 144 }
147 145 }
148 146  
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableController.java
... ... @@ -19,11 +19,12 @@ package eu.omp.irap.vespa.epntapclient.votable.controller;
19 19 import java.io.IOException;
20 20 import java.util.logging.Logger;
21 21  
22   -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.ErrorInVOTableException;
23   -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.VOTableCantFillVoTableException;
24   -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.VOTableParsingException;
25   -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.VOTableSeveralResourcesException;
26   -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.VOTableSeveralTablesException;
  22 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantFillTableException;
  23 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantFillTableException.CantModifyVOTableException;
  24 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantFillTableException.ErrorMessageInVOTableException;
  25 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantFillTableException.SeveralResourcesException;
  26 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantFillTableException.SeveralTablesException;
  27 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantSendQueryException;
27 28 import eu.omp.irap.vespa.epntapclient.votable.model.Table;
28 29 import eu.omp.irap.vespa.epntapclient.votable.model.VOTABLE;
29 30 import eu.omp.irap.vespa.epntapclient.votable.view.VOTableView;
... ... @@ -52,7 +53,7 @@ public class VOTableController {
52 53 * Method constructor
53 54 *
54 55 * @param voTablePath The path of the VOTable XML file.
55   - * @throws VOTableException
  56 + * @throws VOTableException If something went wrong on the VOTable view or when filling table.
56 57 */
57 58 public VOTableController(String voTablePath) throws VOTableException {
58 59 view = new VOTableView();
... ... @@ -62,7 +63,7 @@ public class VOTableController {
62 63 /**
63 64 * Method constructor
64 65 *
65   - * @param targetURL The url of the registry to communicate (ie. "http://reg.g-vo.org").
  66 + * @param targetURL The URL of the registry to communicate (ie. "http://reg.g-vo.org").
66 67 * @param queryLanguage The language used for the queries (ie. "ADQL").
67 68 * @param query The query to ask to the registry.
68 69 */
... ... @@ -77,46 +78,40 @@ public class VOTableController {
77 78 }
78 79  
79 80 /**
80   - * @param targetURL The url of the registry to communicate (ie. "http://reg.g-vo.org").
  81 + * @param targetURL The URL of the registry to communicate (ie. "http://reg.g-vo.org").
81 82 * @param queryLanguage The language used for the queries (ie. "ADQL").
82 83 * @param query The query to ask to the registry.
83   - * @throws VOTableException Can not send the query or VOTable can not be parsed or can not fill
84   - * the JTable.
  84 + * @throws CantSendQueryException If the query can not be sent.
  85 + * @throws CantFillTableException If the table can not be filled. @see CantFillTableException
85 86 */
86 87 public void fillTable(String targetURL, String queryLanguage, String query)
87   - throws VOTableException {
88   - fillTable(VOTableConnection.sendQuery(targetURL, queryLanguage, query));
  88 + throws CantFillTableException, CantSendQueryException {
  89 + String voTablePath = VOTableConnection.sendQuery(targetURL, queryLanguage, query);
  90 + fillTable(voTablePath);
89 91 }
90 92  
91 93 /**
92 94 * @param voTablePath The path of the VOTable file.
93   - * @throws VOTableParsingException
94   - * @throws VOTableSeveralResourcesException
95   - * @throws ErrorInVOTableException
96   - * @throws VOTableSeveralTablesException
97   - * @throws VOTableCantFillVoTableException
98   - * @throws VOTableException Can not fill the VOTable data in the JTable.
  95 + * @throws CantFillTableException If the VOTable can not be filled.
99 96 */
100 97 public void fillTable(String voTablePath)
101   - throws VOTableParsingException, VOTableSeveralResourcesException,
102   - ErrorInVOTableException, VOTableSeveralTablesException,
103   - VOTableCantFillVoTableException {
  98 + throws CantFillTableException {
104 99  
105 100 voTable = VOTableParser.parseVOTable(voTablePath);
106 101  
107 102 // TODO: Handle the case when there are more than 1 resource or table.
108 103 if (voTable.getRESOURCE().size() > 1) {
109   - throw new VOTableSeveralResourcesException(voTablePath);
  104 + throw new SeveralResourcesException(voTablePath);
110 105 }
111 106  
112 107 // TODO: Iterate over all potential ERROR tags
113 108 if ("ERROR".equals(voTable.getRESOURCE().get(0).getINFO().get(0).getValueAttribute())) {
114 109 String errorInfo = voTable.getRESOURCE().get(0).getINFO().get(0).getValue();
115   - throw new ErrorInVOTableException(errorInfo);
  110 + throw new ErrorMessageInVOTableException(errorInfo);
116 111 }
117 112  
118 113 if (voTable.getRESOURCE().get(0).getLINKAndTABLEOrRESOURCE().size() > 1) {
119   - throw new VOTableSeveralTablesException(voTablePath);
  114 + throw new SeveralTablesException(voTablePath);
120 115 }
121 116  
122 117 Table table = (Table) (voTable.getRESOURCE().get(0).getLINKAndTABLEOrRESOURCE().get(0));
... ... @@ -126,7 +121,7 @@ public class VOTableController {
126 121 dataParser = new VOTableDataParser(table);
127 122 view.fillTable(dataParser.getColumnsName(), dataParser.getDataArray());
128 123 } catch (IOException e) {
129   - throw new VOTableCantFillVoTableException(e);
  124 + throw new CantModifyVOTableException(e);
130 125 }
131 126 }
132 127  
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableException.java
... ... @@ -19,60 +19,254 @@ package eu.omp.irap.vespa.epntapclient.votable.controller;
19 19 import java.io.IOException;
20 20  
21 21 /**
22   - * VOTable Exception class.
  22 + * VOTableException is the global exception for all the VOTable application. All other exceptions
  23 + * should extend it.
23 24 *
24 25 * @author N. Jourdane
25 26 */
26   -@SuppressWarnings({ "javadoc", "serial" })
  27 +@SuppressWarnings("serial")
27 28 public abstract class VOTableException extends Exception {
  29 + /** The serial version UID (affected with a random number). */
  30 + private static final long serialVersionUID = -5707662871529583209L;
  31 +
  32 + /**
  33 + * Method constructor
  34 + *
  35 + * @param message The message describing the exception displayed in the error dialog.
  36 + */
28 37 public VOTableException(String message) {
29 38 super(message);
30 39 }
31 40  
  41 + /**
  42 + * Method constructor
  43 + *
  44 + * @param message The message describing the exception displayed in the error dialog.
  45 + * @param e The exception thrown.
  46 + */
32 47 public VOTableException(String message, Exception e) {
33 48 super(message, e);
34 49 }
35 50  
36   - public static class SendQueryException extends VOTableException {
37   - public SendQueryException(String message) {
38   - super("Can not send the query: " + message);
  51 + /**
  52 + * Abstract exception for when the application can not send the query.
  53 + *
  54 + * @author N. Jourdane
  55 + */
  56 + public abstract static class CantSendQueryException extends VOTableException {
  57 +
  58 + /**
  59 + * Method constructor with a message.
  60 + *
  61 + * @param message The message describing the exception displayed in the error dialog.
  62 + */
  63 + public CantSendQueryException(String message) {
  64 + super(message);
39 65 }
40 66  
41   - public SendQueryException(String message, Exception e) {
42   - super("Can not send the query: " + message + " because " + e.getMessage(), e);
  67 + /**
  68 + * Method constructor with a message and and exception.
  69 + *
  70 + * @param message The message describing the exception displayed in the error dialog.
  71 + * @param e The exception thrown.
  72 + */
  73 + public CantSendQueryException(String message, Exception e) {
  74 + super(message, e);
43 75 }
44   - }
45 76  
46   - public static class VOTableParsingException extends VOTableException {
47   - public VOTableParsingException(String message, Exception e) {
48   - super("Can not parse the VOTable: " + message + " because " + e.getMessage(), e);
  77 + /**
  78 + * @author N. Jourdane
  79 + */
  80 + public static class MalformedURLException extends CantSendQueryException {
  81 + /**
  82 + * Method constructor
  83 + *
  84 + * @param uri The URI sent to the server.
  85 + * @param e The exception thrown.
  86 + */
  87 + public MalformedURLException(String uri, Exception e) {
  88 + super("The URL " + uri + " is not correctly formated.", e);
  89 + }
49 90 }
50   - }
51 91  
52   - public static class VOTableSeveralResourcesException extends VOTableException {
53   - public VOTableSeveralResourcesException(String voTablePath) {
54   - super("VOTable with more than one resource are not yet supported. \n"
55   - + "See VOTable file for more informations: " + voTablePath);
  92 + /**
  93 + * @author N. Jourdane
  94 + */
  95 + public static class CantPrintRequestResultException extends CantSendQueryException {
  96 + /**
  97 + * Method constructor
  98 + *
  99 + * @param resultFilePath The path of the file where the query results should be stored.
  100 + * @param e The exception thrown.
  101 + */
  102 + public CantPrintRequestResultException(String resultFilePath, IOException e) {
  103 + super("Can not print the result in the file " + resultFilePath, e);
  104 + }
56 105 }
57   - }
58 106  
59   - public static class VOTableSeveralTablesException extends VOTableException {
60   - public VOTableSeveralTablesException(String voTablePath) {
61   - super("VOTable with more than one resource are not yet supported. \n"
62   - + "See VOTable file for more informations: " + voTablePath);
  107 + /**
  108 + * @author N. Jourdane
  109 + */
  110 + public static class CantOpenConnectionException extends CantSendQueryException {
  111 + /**
  112 + * Method constructor
  113 + *
  114 + * @param uri The URI sent to the server.
  115 + * @param e The exception thrown.
  116 + */
  117 + public CantOpenConnectionException(String uri, IOException e) {
  118 + super("Can not open an HTTP connection to " + uri, e);
  119 + }
  120 + }
  121 +
  122 + /**
  123 + * @author N. Jourdane
  124 + */
  125 + public static class CantGetResponseCode extends CantSendQueryException {
  126 + /**
  127 + * Method constructor
  128 + *
  129 + * @param uri The URI sent to the server.
  130 + * @param e The exception thrown.
  131 + */
  132 + public CantGetResponseCode(String uri, IOException e) {
  133 + super("Can not get the server response code for the request " + uri, e);
  134 + }
  135 + }
  136 +
  137 + /**
  138 + * @author N. Jourdane
  139 + */
  140 + public static class BadResponseCodeException extends CantSendQueryException {
  141 + /**
  142 + * Method constructor
  143 + *
  144 + * @param uri The URI sent to the server.
  145 + * @param responseCode The HTTP GET response code, which is bad.
  146 + */
  147 + public BadResponseCodeException(String uri, int responseCode) {
  148 + super("The server returned the bad response code `" + responseCode
  149 + + "` for the request " + uri);
  150 + }
63 151 }
64   - }
65 152  
66   - public static class VOTableCantFillVoTableException extends VOTableException {
67   - public VOTableCantFillVoTableException(IOException e) {
68   - super("Can not fill the VOTable data in the JTable: " + e.getMessage(), e);
  153 + /**
  154 + * @author N. Jourdane
  155 + */
  156 + public static class CantGetErrorStream extends CantSendQueryException {
  157 + /**
  158 + * Method constructor
  159 + *
  160 + * @param uri The URI sent to the server.
  161 + * @param e The exception thrown.
  162 + */
  163 + public CantGetErrorStream(String uri, IOException e) {
  164 + super("Can not get the input stream of the result, neither the error stream "
  165 + + "for the request " + uri);
  166 + }
69 167 }
  168 +
70 169 }
71 170  
72   - public static class ErrorInVOTableException extends VOTableException {
73   - public ErrorInVOTableException(String errorInfo) {
74   - super("There is an error in the VOTable:\n" + errorInfo
75   - + "\nPlease check your ADQL query.");
  171 + /**
  172 + * @author N. Jourdane
  173 + */
  174 + public abstract static class CantDisplayVOTableException extends VOTableException {
  175 +
  176 + /**
  177 + * Method constructor
  178 + *
  179 + * @param message The message describing the exception displayed in the error dialog.
  180 + * @param e The exception thrown.
  181 + */
  182 + public CantDisplayVOTableException(String message, Exception e) {
  183 + super(message, e);
  184 + }
  185 +
  186 + /**
  187 + * Method constructor
  188 + *
  189 + * @param message The message describing the exception displayed in the error dialog.
  190 + */
  191 + public CantDisplayVOTableException(String message) {
  192 + super(message);
  193 + }
  194 +
  195 + /**
  196 + * @author N. Jourdane
  197 + */
  198 + public static class VOTableIsNotValidException extends CantDisplayVOTableException {
  199 +
  200 + /**
  201 + * Method constructor
  202 + *
  203 + * @param e The exception thrown.
  204 + */
  205 + public VOTableIsNotValidException(String voTablePath, Exception e) {
  206 + super("Can not parse the VOTable because it doesn't match with the VOTable schema."
  207 + + "\n See the VOTable file for more details: " + voTablePath, e);
  208 + }
  209 + }
  210 +
  211 + /**
  212 + * @author N. Jourdane
  213 + */
  214 + public static class SeveralResourcesException extends CantDisplayVOTableException {
  215 +
  216 + /**
  217 + * Method constructor
  218 + *
  219 + * @param voTablePath
  220 + */
  221 + public SeveralResourcesException(String voTablePath) {
  222 + super("VOTable with more than one resource are not yet supported. \n"
  223 + + "See VOTable file for more informations: " + voTablePath);
  224 + }
  225 + }
  226 +
  227 + /**
  228 + * @author N. Jourdane
  229 + */
  230 + public static class SeveralTablesException extends CantDisplayVOTableException {
  231 +
  232 + /**
  233 + * Method constructor
  234 + *
  235 + * @param voTablePath
  236 + */
  237 + public SeveralTablesException(String voTablePath) {
  238 + super("VOTable with more than one resource are not yet supported. \n"
  239 + + "See VOTable file for more informations: " + voTablePath);
  240 + }
  241 + }
  242 +
  243 + /**
  244 + * @author N. Jourdane
  245 + */
  246 + public static class CantModifyVOTableException extends CantDisplayVOTableException {
  247 + /**
  248 + * Method constructor
  249 + *
  250 + * @param e The exception thrown.
  251 + */
  252 + public CantModifyVOTableException(String voTablePath, Exception e) {
  253 + super("Can not change schema location on the VOTable file: " + voTablePath, e);
  254 + }
  255 + }
  256 +
  257 + /**
  258 + * @author N. Jourdane
  259 + */
  260 + public static class ErrorMessageInVOTableException extends CantDisplayVOTableException {
  261 + /**
  262 + * Method constructor
  263 + *
  264 + * @param errorInfo
  265 + */
  266 + public ErrorMessageInVOTableException(String errorInfo) {
  267 + super("There is an error in the VOTable:\n" + errorInfo
  268 + + "\nPlease check your ADQL query.");
  269 + }
76 270 }
77 271 }
78 272  
... ...
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableParser.java
... ... @@ -36,7 +36,7 @@ import org.w3c.dom.Document;
36 36 import org.w3c.dom.NamedNodeMap;
37 37 import org.xml.sax.SAXException;
38 38  
39   -import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.VOTableParsingException;
  39 +import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException.CantFillTableException.VOTableParsingException;
40 40 import eu.omp.irap.vespa.epntapclient.votable.model.VOTABLE;
41 41  
42 42 /**
... ...