Changeset 6081 for SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/rest/RestService.java
- Timestamp:
- 03/05/15 18:24:55 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/rest/RestService.java
r6065 r6081 8 8 import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration; 9 9 import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration.Params.WeblichtConfig; 10 import eu.clarin.sru.fcs.aggregator.scan.Corpora; 10 11 import eu.clarin.sru.fcs.aggregator.scan.Corpus; 11 12 import eu.clarin.sru.fcs.aggregator.scan.Statistics; … … 70 71 71 72 @GET 73 @Path("languages") 74 public Response getLanguages() throws IOException { 75 Set<String> codes = Aggregator.getInstance().getCorpora().getLanguages(); 76 log.info("get language codes", codes); 77 Map<String, String> languages = LanguagesISO693.getInstance().getLanguageMap(codes); 78 return Response.ok(toJson(languages)).build(); 79 } 80 81 @GET 82 @Path("init") 83 public Response getInit() throws IOException { 84 log.info("get initial data"); 85 final Corpora corpora = Aggregator.getInstance().getCorpora(); 86 Object j = new HashMap<String, Object>() { 87 { 88 put("corpora", corpora.getCorpora()); 89 put("languages", LanguagesISO693.getInstance().getLanguageMap(corpora.getLanguages())); 90 put("weblichtLanguages", Aggregator.getInstance().getParams().getWeblichtConfig().getAcceptedTcfLanguages()); 91 } 92 }; 93 return Response.ok(toJson(j)).build(); 94 } 95 96 @POST 97 @Path("search") 98 public Response postSearch( 99 @FormParam("query") String query, 100 @FormParam("numberOfResults") Integer numberOfResults, 101 @FormParam("language") String language, 102 @FormParam("useLanguageGuesser") boolean useLanguageGuesser, 103 @FormParam("corporaIds[]") List<String> corporaIds) throws Exception { 104 if (query == null || query.isEmpty()) { 105 return Response.status(400).entity("'query' parameter expected").build(); 106 } 107 // log.info("POST /search corporaIds: " + corporaIds); 108 if (corporaIds == null || corporaIds.isEmpty()) { 109 return Response.status(400).entity("'corporaIds' parameter expected").build(); 110 } 111 List<Corpus> corpora = Aggregator.getInstance().getCorpora().getCorporaByIds(new HashSet<String>(corporaIds)); 112 if (corpora == null || corpora.isEmpty()) { 113 return Response.status(503).entity("No corpora, please wait for the server to finish scanning").build(); 114 } 115 if (numberOfResults == null || numberOfResults < 10) { 116 numberOfResults = 10; 117 } 118 if (numberOfResults > 250) { 119 numberOfResults = 250; 120 } 121 Search search = Aggregator.getInstance().startSearch(SRUVersion.VERSION_1_2, corpora, query, language, numberOfResults); 122 if (search == null) { 123 return Response.status(500).entity("Initiating search failed").build(); 124 } 125 URI uri = URI.create("" + search.getId()); 126 return Response.created(uri).entity(uri).build(); 127 } 128 129 public static class JsonSearch { 130 131 List<Request> requests; 132 List<Result> results; 133 134 public JsonSearch(List<Request> requests, List<Result> results) { 135 this.requests = requests; 136 this.results = results; 137 } 138 139 public List<Request> getRequests() { 140 return requests; 141 } 142 143 public List<Result> getResults() { 144 return results; 145 } 146 } 147 148 @GET 149 @Path("search/{id}") 150 public Response getSearch(@PathParam("id") Long searchId, 151 @QueryParam("corpusId") String corpusId) throws Exception { 152 Search search = Aggregator.getInstance().getSearchById(searchId); 153 if (search == null) { 154 return Response.status(Response.Status.NOT_FOUND).entity("Search job not found").build(); 155 } 156 157 JsonSearch js = new JsonSearch(search.getRequests(), search.getResults(corpusId)); 158 return Response.ok(js).build(); 159 } 160 161 @GET 162 @Path("search/{id}/download") 163 public Response downloadSearchResults(@PathParam("id") Long searchId, 164 @QueryParam("corpusId") String corpusId, 165 @QueryParam("filterLanguage") String filterLanguage, 166 @QueryParam("format") String format) throws Exception { 167 Search search = Aggregator.getInstance().getSearchById(searchId); 168 if (search == null) { 169 return Response.status(Response.Status.NOT_FOUND).entity("Search job not found").build(); 170 } 171 if (filterLanguage == null || filterLanguage.isEmpty()) { 172 filterLanguage = null; 173 } 174 175 if (format == null || format.trim().isEmpty() || format.trim().equals("text")) { 176 String text = Exports.getExportText(search.getResults(corpusId), filterLanguage); 177 return download(text, MediaType.TEXT_PLAIN, search.getQuery() + ".txt"); 178 } else if (format.equals("tcf")) { 179 byte[] bytes = Exports.getExportTCF( 180 search.getResults(corpusId), search.getSearchLanguage(), filterLanguage); 181 return download(bytes, TCF_MEDIA_TYPE, search.getQuery() + ".xml"); 182 } else if (format.equals("excel")) { 183 byte[] bytes = Exports.getExportExcel(search.getResults(corpusId), filterLanguage); 184 return download(bytes, EXCEL_MEDIA_TYPE, search.getQuery() + ".xls"); 185 } else if (format.equals("csv")) { 186 String csv = Exports.getExportCSV(search.getResults(corpusId), filterLanguage, ";"); 187 return download(csv, MediaType.TEXT_PLAIN, search.getQuery() + ".csv"); 188 } 189 190 return Response.status(Response.Status.BAD_REQUEST) 191 .entity("format parameter must be one of: text, tcf, excel, csv") 192 .build(); 193 } 194 195 Response download(Object entity, String mediaType, String filesuffix) { 196 if (entity == null) { 197 return Response.status(Response.Status.INTERNAL_SERVER_ERROR) 198 .entity("error while converting to the export format").build(); 199 } 200 String filename = EXPORT_FILENAME_PREFIX + filesuffix; 201 return Response.ok(entity, mediaType) 202 .header("Content-Disposition", "attachment; filename=\"" + filename + "\"") 203 .build(); 204 } 205 206 @GET 207 @Path("search/{id}/toWeblicht") 208 public Response sendSearchResultsToWeblicht(@PathParam("id") Long searchId, 209 @QueryParam("filterLanguage") String filterLanguage, 210 @QueryParam("corpusId") String corpusId) throws Exception { 211 Search search = Aggregator.getInstance().getSearchById(searchId); 212 if (search == null) { 213 return Response.status(Response.Status.NOT_FOUND).entity("Search job not found").build(); 214 } 215 if (filterLanguage == null || filterLanguage.isEmpty()) { 216 filterLanguage = null; 217 } 218 219 String url = null; 220 byte[] bytes = Exports.getExportTCF( 221 search.getResults(corpusId), search.getSearchLanguage(), filterLanguage); 222 if (bytes != null) { 223 url = DataTransfer.uploadToDropOff(bytes, "text/tcf+xml", ".tcf"); 224 } 225 226 WeblichtConfig weblicht = Aggregator.getInstance().getParams().getWeblichtConfig(); 227 URI weblichtUri = new URI(weblicht.getUrl() + url); 228 return url == null 229 ? Response.status(503).entity("error while exporting to weblicht").build() 230 : Response.seeOther(weblichtUri).entity(weblichtUri).build(); 231 } 232 233 @GET 72 234 @Path("statistics") 73 235 public Response getStatistics() throws IOException { … … 103 265 } 104 266 105 @GET106 @Path("languages")107 public Response getLanguages() throws IOException {108 Map<String, String> languages = new HashMap<String, String>();109 Set<String> codes = Aggregator.getInstance().getCorpora().getLanguages();110 log.info("get language codes", codes);111 for (String code : codes) {112 String name = LanguagesISO693.getInstance().nameForCode(code);113 languages.put(code, name != null ? name : code);114 }115 return Response.ok(toJson(languages)).build();116 }117 118 @POST119 @Path("search")120 public Response postSearch(121 @FormParam("query") String query,122 @FormParam("numberOfResults") Integer numberOfResults,123 @FormParam("language") String language,124 @FormParam("useLanguageGuesser") boolean useLanguageGuesser,125 @FormParam("corporaIds[]") List<String> corporaIds) throws Exception {126 if (query == null || query.isEmpty()) {127 return Response.status(400).entity("'query' parameter expected").build();128 }129 // log.info("POST /search corporaIds: " + corporaIds);130 if (corporaIds == null || corporaIds.isEmpty()) {131 return Response.status(400).entity("'corporaIds' parameter expected").build();132 }133 List<Corpus> corpora = Aggregator.getInstance().getCorpora().getCorporaByIds(new HashSet<String>(corporaIds));134 if (corpora == null || corpora.isEmpty()) {135 return Response.status(503).entity("No corpora, please wait for the server to finish scanning").build();136 }137 if (numberOfResults == null || numberOfResults < 10) {138 numberOfResults = 10;139 }140 if (numberOfResults > 250) {141 numberOfResults = 250;142 }143 Search search = Aggregator.getInstance().startSearch(SRUVersion.VERSION_1_2, corpora, query, language, numberOfResults);144 if (search == null) {145 return Response.status(500).entity("Initiating search failed").build();146 }147 URI uri = URI.create("" + search.getId());148 return Response.created(uri).entity(uri).build();149 }150 151 public static class JsonSearch {152 153 List<Request> requests;154 List<Result> results;155 156 public JsonSearch(List<Request> requests, List<Result> results) {157 this.requests = requests;158 this.results = results;159 }160 161 public List<Request> getRequests() {162 return requests;163 }164 165 public List<Result> getResults() {166 return results;167 }168 }169 170 @GET171 @Path("search/{id}")172 public Response getSearch(@PathParam("id") Long searchId) throws Exception {173 Search search = Aggregator.getInstance().getSearchById(searchId);174 if (search == null) {175 return Response.status(Response.Status.NOT_FOUND).entity("Search job not found").build();176 }177 178 JsonSearch js = new JsonSearch(search.getRequests(), search.getResults());179 return Response.ok(js).build();180 }181 182 @GET183 @Path("search/{id}/download")184 public Response downloadSearchResults(@PathParam("id") Long searchId,185 @QueryParam("format") String format) throws Exception {186 Search search = Aggregator.getInstance().getSearchById(searchId);187 if (search == null) {188 return Response.status(Response.Status.NOT_FOUND).entity("Search job not found").build();189 }190 191 if (format == null || format.trim().isEmpty() || format.trim().equals("text")) {192 String text = Exports.getExportText(search.getResults());193 return download(text, MediaType.TEXT_PLAIN, search.getQuery() + ".txt");194 } else if (format.equals("tcf")) {195 byte[] bytes = Exports.getExportTCF(196 search.getResults(), search.getSearchLanguage());197 return download(bytes, TCF_MEDIA_TYPE, search.getQuery() + ".xml");198 } else if (format.equals("excel")) {199 byte[] bytes = Exports.getExportExcel(search.getResults());200 return download(bytes, EXCEL_MEDIA_TYPE, search.getQuery() + ".xls");201 } else if (format.equals("csv")) {202 String csv = Exports.getExportCSV(search.getResults(), ";");203 return download(csv, MediaType.TEXT_PLAIN, search.getQuery() + ".csv");204 }205 206 return Response.status(Response.Status.BAD_REQUEST)207 .entity("format parameter must be one of: text, tcf, excel, csv")208 .build();209 }210 211 Response download(Object entity, String mediaType, String filesuffix) {212 if (entity == null) {213 return Response.status(Response.Status.INTERNAL_SERVER_ERROR)214 .entity("error while converting to the export format").build();215 }216 String filename = EXPORT_FILENAME_PREFIX + filesuffix;217 return Response.ok(entity, mediaType)218 .header("Content-Disposition", "attachment; filename=\"" + filename + "\"")219 .build();220 }221 222 @GET223 @Path("search/{id}/toWeblicht")224 public Response sendSearchResultsToWeblicht(@PathParam("id") Long searchId,225 @QueryParam("format") String format) throws Exception {226 Search search = Aggregator.getInstance().getSearchById(searchId);227 if (search == null) {228 return Response.status(Response.Status.NOT_FOUND).entity("Search job not found").build();229 }230 231 String url = null;232 if (format == null || format.isEmpty() || format.trim().equals("text")) {233 String text = Exports.getExportText(search.getResults());234 if (text != null) {235 byte[] bytes = text.getBytes(SEARCH_RESULTS_ENCODING);236 url = DataTransfer.uploadToDropOff(bytes, "text/plan", ".txt");237 }238 } else if (format.equals("tcf")) {239 byte[] bytes = Exports.getExportTCF(240 search.getResults(), search.getSearchLanguage());241 if (bytes != null) {242 url = DataTransfer.uploadToDropOff(bytes, "text/tcf+xml", ".tcf");243 }244 } else {245 return Response.status(400).entity("incorrect format parameter").build();246 }247 248 WeblichtConfig weblicht = Aggregator.getInstance().getParams().getWeblichtConfig();249 URI weblichtUri = new URI(weblicht.getUrl() + url);250 return url == null251 ? Response.status(503).entity("error while exporting to weblicht").build()252 : Response.seeOther(weblichtUri).entity(weblichtUri).build();253 }254 267 }
Note: See TracChangeset
for help on using the changeset viewer.