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.enhanceQueryWithRelProjectParams(queryBuilder, request);
303
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
304
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
305
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
306
        ParameterQueryEnhancer.enhanceQueryWithOriginalId(queryBuilder, request);
307

    
308
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
309

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

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

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

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

    
327
    }
328

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

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

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

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

    
342
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
343

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

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

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

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

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

    
367
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
368

    
369
        FormattedSearchResult formattedSearchResult = null;
370

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

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

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

    
382
    }
383

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

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

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

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

    
397
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
398

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

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

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

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

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

    
422
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
423

    
424
        FormattedSearchResult formattedSearchResult = null;
425

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

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

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

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

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

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

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

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

    
458
        format = finalFormat(format);
459

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

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

    
470
        ParameterQueryEnhancer.enhanceQueryWithProjectSortParameters(queryBuilder, request);
471

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

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

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

    
485

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

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

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

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

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

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

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

    
512
        return format;
513
    }
514

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

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

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

    
526
        }
527

    
528
        return format;
529
    }
530

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

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

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

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

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

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

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

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

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

    
577
    }
578

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

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

    
596
        return null;
597
    }
598

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
714
        return true;
715
    }
716

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

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

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

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

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

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

    
738

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

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

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

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

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

    
762
        long time = System.currentTimeMillis();
763

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

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

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

    
777
        //q=*:*&start=0&rows=10&cursorMark=*&sort=dateofcollection asc
778
        try {
779
            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());
780

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

    
791

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

    
795
        QueryResponse resp = null;
796

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

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

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

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

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

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

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

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

    
831
        }
832

    
833
      //  out.close();
834

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

    
839
}
(9-9/11)