Project

General

Profile

1
package eu.dnetlib.data.search.web.api;
2

    
3
import com.google.common.collect.Iterables;
4
import eu.dnetlib.api.data.SearchService;
5
import eu.dnetlib.api.data.SearchServiceException;
6
import eu.dnetlib.data.search.utils.cql.ParameterQueryEnhancer;
7
import eu.dnetlib.data.search.utils.vocabulary.VocabularyManager;
8
import eu.dnetlib.domain.data.FormattedSearchResult;
9
import eu.dnetlib.functionality.cql.CqlTranslatorImpl;
10
import io.micrometer.core.annotation.Timed;
11
import io.micrometer.prometheus.PrometheusMeterRegistry;
12
import org.apache.commons.collections.ListUtils;
13
import org.apache.commons.lang.IncompleteArgumentException;
14
import org.apache.commons.lang.StringEscapeUtils;
15
import org.apache.log4j.Logger;
16
import org.apache.solr.client.solrj.SolrServerException;
17
import org.apache.solr.client.solrj.impl.CloudSolrClient;
18
import org.apache.solr.client.solrj.response.QueryResponse;
19
import org.apache.solr.common.params.SolrParams;
20
import org.apache.solr.common.util.NamedList;
21
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.context.annotation.EnableAspectJAutoProxy;
23
import org.springframework.http.HttpStatus;
24
import org.springframework.http.MediaType;
25
import org.springframework.http.ResponseEntity;
26
import org.springframework.stereotype.Controller;
27
import org.springframework.ui.ModelMap;
28
import org.springframework.web.bind.annotation.ExceptionHandler;
29
import org.springframework.web.bind.annotation.RequestMapping;
30
import org.springframework.web.bind.annotation.RequestMethod;
31
import org.springframework.web.bind.annotation.ResponseBody;
32
import org.z3950.zing.cql.CQLParseException;
33

    
34
import javax.annotation.Resource;
35
import javax.servlet.ServletOutputStream;
36
import javax.servlet.http.HttpServletRequest;
37
import javax.servlet.http.HttpServletResponse;
38
import java.io.IOException;
39
import java.io.PrintWriter;
40
import java.text.SimpleDateFormat;
41
import java.util.*;
42

    
43
@Controller
44
@EnableAspectJAutoProxy
45
@Timed
46
public class SearchRequestController {
47

    
48
    @Autowired
49
    private SearchService searchService = null;
50
    @Autowired
51
    private VocabularyManager vocabularyManager = null;
52

    
53
    @Resource
54
    private String maxResults = null;
55

    
56
    @Resource
57
    private String maxSize = null;
58

    
59
    @Autowired
60
    private PrometheusMeterRegistry registry;
61

    
62
    private static Logger logger = Logger.getLogger(SearchRequestController.class);
63

    
64
    private static final String XML_CONTENT_TYPE = "application/xml;charset=UTF-8";
65
    private static final String JSON_CONTENT_TYPE = "application/json;charset=UTF-8;";
66
    private static final String CSV_CONTENT_TYPE = "text/csv;charset=UTF-8;";
67
    private static final String TSV_CONTENT_TYPE = "text/tab-separated-values;charset=UTF-8;";
68
    private static final String HTML_CONTENT_TYPE = "text/html;charset=UTF-8;";
69

    
70
    private static final String PUBLICATION_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact publication)";
71
    private static final String DATASET_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact dataset)";
72
    private static final String SOFTWARE_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact software)";
73
    private static final String OTHER_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact other)";
74
    private static final String PROJECT_BASIC_QUERY = "(oaftype exact project)";
75

    
76
    private static final List<String> GLOBAL_PARAMETERS = Arrays.asList("page", "size", "format", "sortBy");
77

    
78
    private static final List<String> PUB_N_DATA_COMMON_PARAMETERS = Arrays.asList("author", "doi", "originalId", "community", "FP7ProjectID", "FP7scientificArea",
79
            "fromDateAccepted", "funder", "fundingStream", "hasECFunding", "hasProject", "hasWTFunding", "keywords",
80
            "model", "OA", "openaireProjectID", "openaireProviderID", "projectID", "title", "toDateAccepted", "country");
81

    
82
    private static final List<String> PUB_PARAMETERS = Arrays.asList("openairePublicationID");
83
    private static final List<String> DATA_PARAMETERS = Arrays.asList("openaireDatasetID");
84
    private static final List<String> SOFTWARE_PARAMETERS = Arrays.asList("openaireSoftwareID");
85
    private static final List<String> OTHER_PARAMETERS = Arrays.asList("openaireOtherID");
86

    
87
    private static final List<String> PUB_N_DATASET_MODELS = Arrays.asList("dc", "openaire", "sygma");
88
    private static final List<String> PUB_N_DATASET_FORMATS = Arrays.asList("json", "rss", "xml", "csv", "tsv", "html");
89

    
90
    private static final List<String> PROJECT_PARAMETERS = Arrays.asList("acronym", "callID", "endYear", "FP7scientificArea",
91
            "funder", "fundingStream", "grantID", "hasECFunding", "hasWTFunding", "keywords", "name",
92
            "participantAcronyms", "participantCountries", "startYear", "sc39", "openaireParticipantID", "openaireProjectID");
93
    private static final List<String> PROJECT_FORMATS = Arrays.asList("xml", "json", "csv", "tsv", "html");
94

    
95
    //TODO this is for joomla - to be removed soon
96
    @RequestMapping(value = "/search", method = RequestMethod.GET)
97
    @Timed(value = "search.joomla.requests", longTask = false)
98
    public void search(HttpServletRequest request, HttpServletResponse response) {
99
        PrintWriter writer = null;
100
        FormattedSearchResult formattedSearchResult = null;
101

    
102
        String action = readActionParameter(request);
103
        String query = readQueryParameter(request);
104
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
105
        createResponseMeta(response, format);
106

    
107
        String locale = request.getParameter("locale");
108

    
109
        int page = 0;
110
        int size = 0;
111
        //TODO check paging
112
        if (!action.equals("refine")) {
113
            page = readParameter(request, "page", 1);
114
            size = readParameter(request, "size", 10);
115
        }
116

    
117
        if (size > Integer.parseInt(maxSize)) {
118
            throw new IllegalArgumentException("Size argument have exceeded the maximum allowed number.");
119
        }
120

    
121
        String sTransformer = request.getParameter("sTransformer");
122
        String rTransformer = request.getParameter("rTransformer");
123
        Collection<String> fields = readParameter(request, "fields");
124

    
125
        checkTransformerParameters(action, sTransformer, rTransformer, fields);
126

    
127
        try {
128
            createResponseMeta(response, format);
129
            writer = response.getWriter();
130

    
131
            formattedSearchResult = searchService.searchNrefine(query,
132
                    sTransformer, rTransformer, format, locale, page, size,
133
                    fields);
134

    
135
            writer.append(formattedSearchResult.getFormattedResult());
136

    
137
        } catch (Exception e) {
138
            logger.error("Fail to execute search.", e);
139
            createXmlErrorPage(writer, e);
140

    
141
        } finally {
142
            if (writer != null) {
143
                writer.close();
144
            }
145
        }
146
    }
147

    
148
    private void checkTransformerParameters(String action, String sTransformer, String rTransformer, Collection<String> fields) {
149
        if (action.equals("search")) {
150
            if (sTransformer == null) {
151
                throw new IncompleteArgumentException("Undefined search transformer. Search request");
152
            }
153

    
154
        } else if (action.equals("refine")) {
155
            if (rTransformer == null) {
156
                throw new IncompleteArgumentException(
157
                        "Undefined refine transformer. Refine request");
158
            }
159

    
160
            if (fields == null) {
161
                throw new IncompleteArgumentException(
162
                        "Undefined refine fields. Refine request");
163
            }
164

    
165
        } else if (action.equals("searchNrefine")) {
166

    
167
            if (sTransformer == null) {
168
                throw new IncompleteArgumentException(
169
                        "Undefined search transformer. Search and Refine request");
170
            }
171

    
172
            if (rTransformer == null) {
173
                throw new IncompleteArgumentException(
174
                        "Undefined refine transformer. Search and Refine request");
175
            }
176

    
177
            if (fields == null) {
178
                throw new IncompleteArgumentException(
179
                        "Undefined refine fields. Search and Refine request");
180
            }
181

    
182
        } else {
183
            throw new UnsupportedOperationException("The action " + action
184
                    + " is not supported. Please try one of {search, refine, searchNrefine}.");
185
        }
186
    }
187

    
188
    private String readQueryParameter(HttpServletRequest request) {
189
        String query = request.getParameter("query");
190
        if (query == null) {
191
            throw new IncompleteArgumentException("Undefined query. Search request");
192
        }
193
        return query;
194
    }
195

    
196
    private String readActionParameter(HttpServletRequest request) {
197
        String action = request.getParameter("action");
198
        if (action == null) {
199
            throw new UnsupportedOperationException("Undefined action.");
200
        }
201
        return action;
202
    }
203

    
204

    
205
    @RequestMapping(value="/search/openSearchDescriptor", method = RequestMethod.GET)
206
    public String printOpenSearchDescriptor(ModelMap model) {
207
        return "openSearchDescriptor";
208
    }
209

    
210
    @RequestMapping(value = "/api/publications", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
211
    @Timed(value = "http.server.request.duration", extraTags = {"referer", "api", "uri", "/api/publications"}, longTask = false)
212
    public void searchPublications(HttpServletRequest request, HttpServletResponse response) throws Exception {
213

    
214
        long time = System.currentTimeMillis();
215
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, PUB_PARAMETERS),request.getParameterMap());
216

    
217
        int page = readParameter(request, "page", 1);
218
        int size = readParameter(request, "size", 10);
219
        checkRequestSize(page, size);
220

    
221
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
222
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
223
        createResponseMeta(response, format);
224

    
225
        String locale = request.getParameter("locale");
226

    
227
        String model = request.getParameter("model");
228
        checkModelParameter(PUB_N_DATASET_MODELS, model);
229
        String sTransformer = defineTransformer(model,format);
230

    
231
        Collection<String> referrers = readParameter(request,"referrer");
232
        String newFormat = defineFormatter(model, format, true, referrers);
233

    
234
        StringBuilder queryBuilder = new StringBuilder();
235
        queryBuilder.append(PUBLICATION_BASIC_QUERY);
236

    
237
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
238
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
239
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
240
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
241
        ParameterQueryEnhancer.enhanceQueryWithCommunityParams(queryBuilder, request);
242
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
243
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
244
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
245
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
246
        ParameterQueryEnhancer.enhanceQueryWithOriginalId(queryBuilder, request);
247

    
248

    
249
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
250
        FormattedSearchResult formattedSearchResult = null;
251

    
252
        try {
253
            formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
254

    
255
        } catch (Exception e) {
256
            logger.error("Fail to execute search.", e);
257
            throw new Exception("Fail to execute search", e);
258

    
259
        }
260

    
261
        PrintWriter writer = response.getWriter();
262
        writer.append(formattedSearchResult.getFormattedResult());
263

    
264
        writer.close();
265

    
266
        time = System.currentTimeMillis() - time;
267
        logger.debug("Answer old time " + time);
268
    }
269

    
270

    
271
    @RequestMapping(value = "/api/datasets", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
272
    @Timed(value = "http.server.request.duration", extraTags = {"referer", "api", "uri", "/api/datasets"}, longTask = false)
273
    public void searchData(HttpServletRequest request, HttpServletResponse response) throws Exception {
274

    
275
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, DATA_PARAMETERS),request.getParameterMap());
276

    
277
        int page = readParameter(request, "page", 1);
278
        int size = readParameter(request, "size", 10);
279
        checkRequestSize(page, size);
280

    
281
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
282
        createResponseMeta(response, format);
283

    
284
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
285

    
286
        String model = request.getParameter("model");
287
        checkModelParameter(PUB_N_DATASET_MODELS, model);
288
        String sTransformer = defineTransformer(model,format);
289

    
290
        Collection<String> referrers = readParameter(request,"referrer");
291
        String newFormat = defineFormatter(model, format, false, referrers);
292

    
293
        String locale = request.getParameter("locale");
294

    
295
        StringBuilder queryBuilder = new StringBuilder();
296
        queryBuilder.append(DATASET_BASIC_QUERY);
297

    
298
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
299
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
300
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
301
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
302
        ParameterQueryEnhancer.enhanceQueryWithCommunityParams(queryBuilder, request);
303
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
304
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
305
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
306
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
307
        ParameterQueryEnhancer.enhanceQueryWithOriginalId(queryBuilder, request);
308

    
309
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
310

    
311
        FormattedSearchResult formattedSearchResult =  null;
312
        try {
313
            formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
314

    
315
        } catch (Exception e) {
316
            logger.error("Fail to execute search.", e);
317
            throw new Exception("Fail to execute search.", e);
318
        }
319

    
320
        if (formattedSearchResult == null) {
321
            throw new Exception("Fail to execute search.");
322
        }
323

    
324
        PrintWriter writer = response.getWriter();
325
        writer.append(formattedSearchResult.getFormattedResult());
326
        writer.close();
327

    
328
    }
329

    
330
    @RequestMapping(value = "/api/software", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
331
    @Timed(value = "http.server.request.duration", extraTags = {"referer", "api", "uri", "/api/software"}, longTask = false)
332
    public void searchSoftware(HttpServletRequest request, HttpServletResponse response) throws Exception {
333

    
334
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, SOFTWARE_PARAMETERS),request.getParameterMap());
335

    
336
        int page = readParameter(request, "page", 1);
337
        int size = readParameter(request, "size", 10);
338
        checkRequestSize(page, size);
339

    
340
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
341
        createResponseMeta(response, format);
342

    
343
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
344

    
345
        String model = request.getParameter("model");
346
        checkModelParameter(PUB_N_DATASET_MODELS, model);
347
        String sTransformer = defineTransformer(model,format);
348

    
349
        Collection<String> referrers = readParameter(request,"referrer");
350
        String newFormat = defineFormatter(model, format, false, referrers);
351

    
352
        String locale = request.getParameter("locale");
353

    
354
        StringBuilder queryBuilder = new StringBuilder();
355
        queryBuilder.append(SOFTWARE_BASIC_QUERY);
356

    
357
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
358
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
359
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
360
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
361
        ParameterQueryEnhancer.enhanceQueryWithCommunityParams(queryBuilder, request);
362
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
363
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
364
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
365
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
366
        ParameterQueryEnhancer.enhanceQueryWithOriginalId(queryBuilder, request);
367

    
368
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
369

    
370
        FormattedSearchResult formattedSearchResult = null;
371

    
372
        try {
373
            formattedSearchResult =  searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
374

    
375
        } catch (Exception e) {
376
            logger.error("Fail to execute search.", e);
377
            throw new Exception("Fail to execute search", e);
378
        }
379

    
380
        PrintWriter writer = response.getWriter();
381
        writer.append(formattedSearchResult.getFormattedResult());
382

    
383
    }
384

    
385
    @RequestMapping(value = "/api/other", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
386
    @Timed(value = "http.server.request.duration", extraTags = {"referer", "api", "uri", "/api/other"}, longTask = false)
387
    public void searchOther(HttpServletRequest request, HttpServletResponse response) throws Exception {
388

    
389
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, OTHER_PARAMETERS),request.getParameterMap());
390

    
391
        int page = readParameter(request, "page", 1);
392
        int size = readParameter(request, "size", 10);
393
        checkRequestSize(page, size);
394

    
395
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
396
        createResponseMeta(response, format);
397

    
398
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
399

    
400
        String model = request.getParameter("model");
401
        checkModelParameter(PUB_N_DATASET_MODELS, model);
402
        String sTransformer = defineTransformer(model,format);
403

    
404
        Collection<String> referrers = readParameter(request,"referrer");
405
        String newFormat = defineFormatter(model, format, false, referrers);
406

    
407
        String locale = request.getParameter("locale");
408

    
409
        StringBuilder queryBuilder = new StringBuilder();
410
        queryBuilder.append(OTHER_BASIC_QUERY);
411

    
412
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
413
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
414
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
415
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
416
        ParameterQueryEnhancer.enhanceQueryWithCommunityParams(queryBuilder, request);
417
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
418
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
419
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
420
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
421
        ParameterQueryEnhancer.enhanceQueryWithOriginalId(queryBuilder, request);
422

    
423
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
424

    
425
        FormattedSearchResult formattedSearchResult = null;
426

    
427
        //long start = System.currentTimeMillis();
428
        try {
429
            //Timer.Sample sample = Timer.start(metrics.getRegistry());
430
            formattedSearchResult =  searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
431

    
432
        } catch (Exception e) {
433
            logger.error("Fail to execute search.", e);
434
            throw new Exception("Fail to execute search", e);
435
        }
436

    
437
        PrintWriter writer = response.getWriter();
438
        writer.append(formattedSearchResult.getFormattedResult());
439
    }
440

    
441
    @RequestMapping(value = "/api/projects", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
442
    @Timed(value = "http.server.request.duration", extraTags = {"referer", "api", "uri", "/api/projects"}, longTask = false)
443
    public void searchProjects(HttpServletRequest request, HttpServletResponse response) throws Exception {
444

    
445
        checkParameters(PROJECT_PARAMETERS, request.getParameterMap());
446

    
447
        int page = readParameter(request, "page", 1);
448
        int size = readParameter(request, "size", 10);
449
        checkRequestSize(page, size);
450

    
451
        StringBuilder queryBuilder = new StringBuilder();
452
        queryBuilder.append(PROJECT_BASIC_QUERY);
453
        String locale = request.getParameter("locale");
454

    
455
        String format =  (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
456
        checkFormatParameter(PROJECT_FORMATS, format);
457
        createResponseMeta(response, format);
458

    
459
        format = finalFormat(format);
460

    
461
        String sTransformer = request.getParameter("sTransformer");
462

    
463
        ParameterQueryEnhancer.enhanceProjectQueryWithOpenAIREIds(queryBuilder, request);
464
        ParameterQueryEnhancer.enhanceQueryWithProjectMetadataKeywords(queryBuilder, request);
465
        ParameterQueryEnhancer.enhanceQueryWithProjectFundingParams(queryBuilder, request);
466
        ParameterQueryEnhancer.enhanceProjectQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager);
467
        ParameterQueryEnhancer.enhanceQueryWithParticipantsInfoParams(queryBuilder, request);
468
        ParameterQueryEnhancer.enhanceQueryWithYearParams(queryBuilder, request);
469
        ParameterQueryEnhancer.enhanceQueryWithSC39Params(queryBuilder, request);
470

    
471
        ParameterQueryEnhancer.enhanceQueryWithProjectSortParameters(queryBuilder, request);
472

    
473
        FormattedSearchResult formattedSearchResult = null;
474
        try {
475
            formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, format, locale, page, size);
476

    
477
        } catch (SearchServiceException e) {
478
            throw new Exception("Fail to execute search", e);
479
        }
480

    
481
        PrintWriter writer = response.getWriter();
482
        writer.append(formattedSearchResult.getFormattedResult());
483
        writer.close();
484
    }
485

    
486

    
487
    @ExceptionHandler(IllegalArgumentException.class)
488
    public @ResponseBody ResponseEntity<Error> invalidInput(HttpServletRequest request, HttpServletResponse httpServletResponse, Exception ex) {
489
        Error response = new Error();
490
        response.setStatus("error");
491
        response.setCode("400");
492
        response.setMessage("400 - Illegal argument exception.");
493
        response.setException(ex.getMessage());
494

    
495
        String format = (request.getParameter("format") == null)? "xml": request.getParameter("format").toLowerCase();
496

    
497
        registry.counter("http.status.400", "400", "uri").increment();
498

    
499
        return new ResponseEntity<Error>(response, HttpStatus.BAD_REQUEST);
500
    }
501

    
502
    private String finalFormat(String format) {
503
        if (format.equals("tsv")){
504
            return "project_tsv";
505

    
506
        } else if (format.equals("csv")) {
507
            return "project_csv";
508

    
509
        } else if (format.equals("html")) {
510
            return "project_html";
511
        }
512

    
513
        return format;
514
    }
515

    
516
    private String finalFormat(String format, String referrer) {
517
        if (referrer == null || referrer.isEmpty() || !referrer.equals("joomla")) {
518
            return finalFormat(format);
519
        }
520

    
521
        if (format.equals("tsv")){
522
            return "publication_tsv_notitle";
523

    
524
        } else if (format.equals("csv")) {
525
            return "publication_csv_notitle";
526

    
527
        }
528

    
529
        return format;
530
    }
531

    
532
    /** TODO: check if needed
533
     * Based on the given model the transformer to be used is defined
534
     * @param model
535
     * @return
536

    
537
    private String defineTransformer(String model) {
538
    if (model!=null && !model.trim().isEmpty()) {
539
    if (model.equals("openaire")) {
540
    return null;
541

    
542
    } else if (model.equals("sygma")) {
543
    return "results_openaire";
544
    }
545
    else if (model.equals("dc")) {
546
    return "dc";
547
    }
548

    
549
    throw new IllegalArgumentException("model '" + model + "' is not supported.");
550

    
551
    } else {
552
    return null;
553
    }
554
    }*/
555

    
556
    //TODO: check if needed
557
    private String defineTransformer(String model, String format) {
558
        if (model != null && !model.trim().isEmpty() && format != null && (format.equals("json")||format.equals("xml"))) {
559
            if (model.equals("openaire")) {
560
                return null;
561

    
562
            } else if (model.equals("sygma")) {
563
                return "results_openaire";
564
            }
565
            else if (model.equals("dc")) {
566
                return "dc";
567
            }
568

    
569
            throw new IllegalArgumentException("model '" + model + "' is not supported.");
570

    
571
        } else if (format != null && !format.trim().isEmpty()) {
572
            if (format.equals("rss") || format.equals("csv") || format.equals("tsv") || format.equals("html")) {
573
                return "results_openaire";
574
            }
575
        }
576
        return null;
577

    
578
    }
579

    
580
    private String defineFormatter(String model, String format, boolean isPublications, Collection<String> referrers) {
581
        if( model != null && !model.trim().isEmpty() ) {
582
            if (model.equals("sygma")) {
583

    
584
                if (isPublications) {
585
                    return "sygma_publication";
586
                }
587
                return "sygma_dataset";
588
            }
589
        } else {
590
            if (referrers != null && !referrers.isEmpty() && Iterables.get(referrers, 0) != null && !Iterables.get(referrers, 0).isEmpty()) {
591
                return finalFormat(format, Iterables.get(referrers, 0));
592
            } else {
593
                format = finalFormat(format);
594
            }
595
        }
596

    
597
        return null;
598
    }
599

    
600
    @Deprecated
601
    private void createXmlErrorPage(PrintWriter writer, Exception e) {
602
        writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
603
        writer.append("<error>");
604
        writer.append("<exception>")
605
                .append(StringEscapeUtils.escapeXml(e.getClass().getName()))
606
                .append("</exception>");
607
        if (e.getMessage() != null) {
608
            writer.append("<message>")
609
                    .append(StringEscapeUtils.escapeXml(e.getMessage()))
610
                    .append("</message>");
611
        }
612
        if (e.getCause() != null) {
613
            writer.append("<cause>")
614
                    .append(StringEscapeUtils.escapeXml(e.getCause()
615
                            .toString())).append("</cause>");
616
        }
617

    
618
        StackTraceElement[] trace = e.getStackTrace();
619
        writer.append("<trace>");
620
        for (int i = 0; i < trace.length; i++) {
621
            writer.append(StringEscapeUtils.escapeXml(trace[i].toString()))
622
                    .append("\n");
623
        }
624
        writer.append("</trace>");
625

    
626
        writer.append("</error>");
627
    }
628

    
629
    // Reading parameters from url and adding default values
630
    public int readParameter(HttpServletRequest request, String parameterName, int defaultValue) {
631
        String param = request.getParameter(parameterName);
632
        return (param != null && !param.isEmpty()) ? Integer.parseInt(param) : defaultValue;
633
    }
634

    
635
    private Collection<String> readParameter(HttpServletRequest request, String parameterName) {
636
        Collection<String> fields = null;
637
        String[] paramfields = request.getParameterValues(parameterName);
638
        if (paramfields != null) {
639
            fields = new ArrayList<String>();
640
            for (int i = 0; i < paramfields.length; i++) {
641
                fields.add(paramfields[i]);
642
            }
643
        }
644
        return fields;
645
    }
646

    
647
    /**
648
     * Checks if the requested result size exceeds the maximum allowed numbers of returned results
649
     * @param page the page parameter
650
     * @param size the size parameter
651
     */
652
    private void checkRequestSize(int page, int size) {
653
        int total = page*size;
654
        if (total > Integer.parseInt(maxResults)) {
655
            throw new IllegalArgumentException("Size and page arguments have exceeded the maximum number of returned results.");
656
        }
657
    }
658

    
659
    private String defineContentType(String format) {
660
        if (format != null) {
661
            if (format.equalsIgnoreCase("xml")) {
662
                return XML_CONTENT_TYPE;
663
            } else if (format.equalsIgnoreCase("json")) {
664
                return JSON_CONTENT_TYPE;
665

    
666
            } else if (format.equalsIgnoreCase("csv")) {
667
                return CSV_CONTENT_TYPE;
668

    
669
            } else if (format.equalsIgnoreCase("tsv")) {
670
                return TSV_CONTENT_TYPE;
671

    
672
            } else if (format.equalsIgnoreCase("html")){
673
                return HTML_CONTENT_TYPE;
674
            }
675
        }
676

    
677
        return XML_CONTENT_TYPE;
678
    }
679
    /**
680
     * Checks if the parameters given are allowed. The given parameters are checked against the allowed parameter
681
     * and the GLOBAL_PARAMETERS.
682
     * @param allowedParameters the allowed parameters
683
     * @param currentParameters the given parameters
684
     */
685
    private void checkParameters(List<String> allowedParameters, Map<String, String[]> currentParameters){
686
        if(currentParameters != null) {
687
            for (String parameter : currentParameters.keySet()) {
688
                if (!allowedParameters.contains(parameter) && !GLOBAL_PARAMETERS.contains(parameter) && !parameter.equals("referrer")) {
689
                    throw new IllegalArgumentException("Parameter " + parameter + " is not supported. The supported parameters are: " +
690
                            allowedParameters.toString().replace("[","").replace("]", ", ") + GLOBAL_PARAMETERS.toString().substring(1,GLOBAL_PARAMETERS.toString().length()-1));
691
                }
692
            }
693
        }
694
    }
695

    
696
    private void checkFormatParameter(List<String> allowedFormats, String requestedFormat) {
697
        if (requestedFormat!= null && !allowedFormats.contains(requestedFormat)) {
698
            throw new IllegalArgumentException("The requested format \'"+ requestedFormat +"\' is not supported. The supported formats are: " + allowedFormats);
699
        }
700
    }
701

    
702
    private static void checkModelParameter(List<String> allowedModels, String requestedModel) {
703
        if (requestedModel!= null && !allowedModels.contains(requestedModel)) {
704
            throw new IllegalArgumentException("The requested model \'"+ allowedModels +"\' is not supported. The supported formats are: " + allowedModels);
705
        }
706
    }
707

    
708
    private static boolean isModelSygma(String model) {
709
        if (model == null || model.isEmpty()) { return false; }
710

    
711
        if (!model.isEmpty() && !model.equals("sygma")) {
712
            return  false;
713
        }
714

    
715
        return true;
716
    }
717

    
718
    private void createResponseMeta( HttpServletResponse response, String format) {
719
        response.setContentType(defineContentType(format));
720
        response.setCharacterEncoding("UTF-8");
721

    
722
        if (!format.equals("xml") || !format.equals("json")) {
723

    
724
            SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
725
            String date = sdf.format(new Date());
726

    
727
            if (format.equals("csv")) {
728
                response.setHeader("Content-Disposition", "filename="+date+".csv");
729

    
730
            } else if (format.equals("csv")) {
731
                response.setHeader("Content-Disposition", "filename="+date+".tsv");
732

    
733
            } else if (format.equals("html")) {
734
                response.setHeader("Content-Disposition", "filename="+date+".html");
735
            }
736
        }
737
    }
738

    
739

    
740
    /* TODO: enable if we decide to use ACCEPT Header as a priority to format parameter
741
    private String getFormat(HttpServletRequest request) {
742
        if (request.getParameter("format") == null && request.getHeader("Accept")!=null) {
743
            if (request.getHeader("Accept").equals(MediaType.APPLICATION_XML_VALUE) ||
744
                    request.getHeader("Accept").contains(MediaType.APPLICATION_XML_VALUE)){
745
                return "xml";
746
            }
747

    
748
            if (request.getHeader("Accept").equals(MediaType.APPLICATION_JSON_VALUE)){
749
                return "json";
750
            }
751
        }
752

    
753
        if (request.getParameter("format") == null && (request.getHeader("Accept")== null ||
754
                request.getHeader("Accept").equals(MediaType.ALL_VALUE))) {
755
            return "xml";
756
        }
757

    
758
        return request.getParameter("format");
759
    } */
760

    
761
    /*public static void main() throws IOException, SolrServerException {
762

    
763
        long time = System.currentTimeMillis();
764

    
765
        CloudSolrClient solrClient = new CloudSolrClient.Builder().
766
                withZkHost(Arrays.asList(new String[]{"quorum0.t.hadoop.research-infrastructures.eu:2182",
767
                        "quorum1.t.hadoop.research-infrastructures.eu:2182",
768
                        "quorum2.t.hadoop.research-infrastructures.eu:2182",
769
                        "quorum3.t.hadoop.research-infrastructures.eu:2182",
770
                        "quorum4.t.hadoop.research-infrastructures.eu:2182/solr-dev-openaire"})).build();
771
        solrClient.setDefaultCollection("DMF-index-openaire");
772

    
773
       // response.setContentType("text/html");
774
       // ServletOutputStream out=response.getOutputStream();
775

    
776
        NamedList<String> queryOpts = new NamedList<String>();
777

    
778
        //q=*:*&start=0&rows=10&cursorMark=*&sort=dateofcollection asc
779
        try {
780
            queryOpts.add("q", new CqlTranslatorImpl().getTranslatedQuery("(oaftype exact result) and (resulttypeid exact publication) and (relfundershortname exact \"nhmrc_______::NHMRC||National Health and Medical Research Council (NHMRC)||NHMRC\")").asLucene());
781

    
782
        } catch (CQLParseException e) {
783
            logger.error(e);
784
        }
785
        queryOpts.add("start", "0");
786
        queryOpts.add("rows", "500");
787
        queryOpts.add("fl", "__result");
788
        queryOpts.add("shards.tolerant","true");
789
        queryOpts.add("cursorMark", "*");
790
        queryOpts.add("sort", "__indexrecordidentifier asc");
791

    
792

    
793
        //queryOpts.add("q", new CqlTranslatorImpl().getTranslatedQuery("oaftype exact project").asLucene());
794
        NamedList<String> extraOpts = new NamedList<String>();
795

    
796
        QueryResponse resp = null;
797

    
798
        String cursorMark = "*";
799
        String nextCursorMark = "";
800

    
801
        //QueryResponse resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
802

    
803
        int curs = 0;
804
        while (!cursorMark.equals(nextCursorMark)) {
805
            logger.debug("QUERY OPTS: " + queryOpts.get("cursorMark"));
806
            resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
807
            logger.debug("TOTAL number " + resp.getResults().getNumFound());
808
            logger.debug(resp.getNextCursorMark());
809

    
810
            System.out.println("BEGIN");
811
            System.out.println("cursor " + cursorMark);
812
            System.out.println("next cursor " + nextCursorMark);
813

    
814
            cursorMark = nextCursorMark;
815
            nextCursorMark = resp.getNextCursorMark();
816

    
817
            for (int i = 0; i < resp.getResults().size(); i++) {
818
                String result = ((ArrayList<String>) resp.getResults().get(i).get("__result")).get(0);
819
             //   out.write(result.getBytes());
820
             //   out.flush();
821
            }
822

    
823
            System.out.println("END");
824
            System.out.println("cursor " + cursorMark);
825
            System.out.println("next cursor " + nextCursorMark);
826
            queryOpts.remove("cursorMark");
827
            queryOpts.add("cursorMark", nextCursorMark);
828

    
829
            System.out.println("CURS " + curs);
830
            curs ++;
831

    
832
        }
833

    
834
      //  out.close();
835

    
836
        time = System.currentTimeMillis() - time;
837
        System.out.println("Answer time " + time);
838
    }*/
839

    
840
}
(9-9/11)