Ignore:
Timestamp:
03/05/15 18:24:55 (9 years ago)
Author:
emanuel.dima@uni-tuebingen.de
Message:
  1. alpha 26: zoom in result, other UI changes
File:
1 edited

Legend:

Unmodified
Added
Removed
  • SRUAggregator/trunk/src/main/java/eu/clarin/sru/fcs/aggregator/rest/RestService.java

    r6065 r6081  
    88import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration;
    99import eu.clarin.sru.fcs.aggregator.app.AggregatorConfiguration.Params.WeblichtConfig;
     10import eu.clarin.sru.fcs.aggregator.scan.Corpora;
    1011import eu.clarin.sru.fcs.aggregator.scan.Corpus;
    1112import eu.clarin.sru.fcs.aggregator.scan.Statistics;
     
    7071
    7172        @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
    72234        @Path("statistics")
    73235        public Response getStatistics() throws IOException {
     
    103265        }
    104266
    105         @GET
    106         @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         @POST
    119         @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         @GET
    171         @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         @GET
    183         @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         @GET
    223         @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 == null
    251                                 ? Response.status(503).entity("error while exporting to weblicht").build()
    252                                 : Response.seeOther(weblichtUri).entity(weblichtUri).build();
    253         }
    254267}
Note: See TracChangeset for help on using the changeset viewer.