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.SearchServiceException;
5
import eu.dnetlib.data.search.app.SearchServiceImpl;
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 org.apache.commons.collections.ListUtils;
10
import org.apache.commons.io.IOUtils;
11
import org.apache.commons.lang.IncompleteArgumentException;
12
import org.apache.commons.lang.StringEscapeUtils;
13
import org.apache.log4j.Logger;
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.http.*;
16
import org.springframework.stereotype.Controller;
17
import org.springframework.ui.ModelMap;
18
import org.springframework.web.bind.annotation.ExceptionHandler;
19
import org.springframework.web.bind.annotation.RequestMapping;
20
import org.springframework.web.bind.annotation.RequestMethod;
21
import org.springframework.web.bind.annotation.ResponseBody;
22

    
23
import javax.annotation.Resource;
24
import javax.servlet.http.HttpServletRequest;
25
import javax.servlet.http.HttpServletResponse;
26
import java.io.IOException;
27
import java.io.PrintWriter;
28
import java.text.SimpleDateFormat;
29
import java.util.*;
30

    
31
@Controller
32
public class SearchRequestController {
33

    
34
	@Autowired
35
	private SearchServiceImpl searchService = null;
36
	@Autowired
37
	private VocabularyManager vocabularyManager = null;
38

    
39
	@Resource
40
	private String maxResults = null;
41

    
42
	@Resource
43
	private String maxSize = null;
44

    
45
	private static Logger logger = Logger.getLogger(SearchRequestController.class);
46

    
47
	private static final String XML_CONTENT_TYPE = "application/xml;charset=UTF-8";
48
	private static final String JSON_CONTENT_TYPE = "application/json;charset=UTF-8;";
49
    private static final String CSV_CONTENT_TYPE = "text/csv;charset=UTF-8;";
50
    private static final String TSV_CONTENT_TYPE = "text/tab-separated-values;charset=UTF-8;";
51
    private static final String HTML_CONTENT_TYPE = "text/html;charset=UTF-8;";
52

    
53
    private static final String PUBLICATION_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact publication)";
54
    private static final String DATASET_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact dataset)";
55
    private static final String SOFTWARE_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact software)";
56
    private static final String OTHER_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact other)";
57
    private static final String PROJECT_BASIC_QUERY = "(oaftype exact project)";
58

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

    
61
    private static final List<String> PUB_N_DATA_COMMON_PARAMETERS = Arrays.asList("author", "doi", "community", "FP7ProjectID", "FP7scientificArea",
62
            "fromDateAccepted", "funder", "fundingStream", "hasECFunding", "hasProject", "hasWTFunding", "keywords",
63
            "model", "OA", "openaireProjectID", "openaireProviderID", "projectID", "title", "toDateAccepted");
64

    
65
    private static final List<String> PUB_PARAMETERS = Arrays.asList("openairePublicationID");
66
    private static final List<String> DATA_PARAMETERS = Arrays.asList("openaireDatasetID");
67
    private static final List<String> SOFTWARE_PARAMETERS = Arrays.asList("openaireSoftwareID");
68
    private static final List<String> OTHER_PARAMETERS = Arrays.asList("openaireOtherID");
69

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

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

    
78
    //TODO this is for joomla - to be removed soon
79
	@RequestMapping(value = "/search", method = RequestMethod.GET)
80
	public void search(HttpServletRequest request, HttpServletResponse response) {
81
		PrintWriter writer = null;
82
		FormattedSearchResult formattedSearchResult = null;
83

    
84
        String action = readActionParameter(request);
85
        String query = readQueryParameter(request);
86
		String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
87
        createResponseMeta(response, format);
88

    
89
		String locale = request.getParameter("locale");
90

    
91
        int page= 0;
92
        int size =-1;
93
        //TODO check paging
94
        if (!action.equals("refine")) {
95
            page = readParameter(request, "page", 1);
96
            size = readParameter(request, "size", 10);
97
        }
98
        
99
		if (size > Integer.parseInt(maxSize)) {
100
			throw new IllegalArgumentException("Size argument have exceeded the maximum allowed number.");
101
		}
102

    
103
		String sTransformer = request.getParameter("sTransformer");
104
		String rTransformer = request.getParameter("rTransformer");
105
		Collection<String> fields = readParameter(request, "fields");
106

    
107
        checkTransformerParameters(action, sTransformer, rTransformer, fields);
108

    
109
        try {
110
            createResponseMeta(response, format);
111
            writer = response.getWriter();
112

    
113
            formattedSearchResult = searchService.searchNrefine(query,
114
                    sTransformer, rTransformer, format, locale, page, size,
115
                    fields);
116

    
117
			writer.append(formattedSearchResult.getFormattedResult());
118

    
119
		} catch (Exception e) {
120
			logger.error("Fail to execute search.", e);
121
			createXmlErrorPage(writer, e);
122

    
123
		} finally {
124
            if (writer != null) {
125
                writer.close();
126
            }
127
		}
128
	}
129

    
130
    private void checkTransformerParameters(String action, String sTransformer, String rTransformer, Collection<String> fields) {
131
        if (action.equals("search")) {
132
            if (sTransformer == null) {
133
                throw new IncompleteArgumentException("Undefined search transformer. Search request");
134
            }
135

    
136
        } else if (action.equals("refine")) {
137
            if (rTransformer == null) {
138
                throw new IncompleteArgumentException(
139
                        "Undefined refine transformer. Refine request");
140
            }
141

    
142
            if (fields == null) {
143
                throw new IncompleteArgumentException(
144
                        "Undefined refine fields. Refine request");
145
            }
146

    
147
        } else if (action.equals("searchNrefine")) {
148

    
149
            if (sTransformer == null) {
150
                throw new IncompleteArgumentException(
151
                        "Undefined search transformer. Search and Refine request");
152
            }
153

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

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

    
164
        } else {
165
            throw new UnsupportedOperationException("The action " + action
166
                    + " is not supported. Please try one of {search, refine, searchNrefine}.");
167
        }
168
    }
169

    
170
    private String readQueryParameter(HttpServletRequest request) {
171
        String query = request.getParameter("query");
172
        if (query == null) {
173
            throw new IncompleteArgumentException("Undefined query. Search request");
174
        }
175
        return query;
176
    }
177

    
178
    private String readActionParameter(HttpServletRequest request) {
179
        String action = request.getParameter("action");
180
        if (action == null) {
181
            throw new UnsupportedOperationException("Undefined action.");
182
        }
183
        return action;
184
    }
185

    
186

    
187
    @RequestMapping(value="/search/openSearchDescriptor", method = RequestMethod.GET)
188
    public String printOpenSearchDescriptor(ModelMap model) {
189
        return "openSearchDescriptor";
190
    }
191

    
192
	@RequestMapping(value = "/api/publications", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
193
	public void searchPublications(HttpServletRequest request, HttpServletResponse response) throws Exception {
194

    
195
	    long time = System.currentTimeMillis();
196
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, PUB_PARAMETERS),request.getParameterMap());
197

    
198
        int page = readParameter(request, "page", 1);
199
        int size = readParameter(request, "size", 10);
200
        checkRequestSize(page, size);
201

    
202
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
203
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
204
        createResponseMeta(response, format);
205

    
206
        String locale = request.getParameter("locale");
207

    
208
        String model = request.getParameter("model");
209
        checkModelParameter(PUB_N_DATASET_MODELS, model);
210
        String sTransformer = defineTransformer(model,format);
211

    
212
        Collection<String> referrers = readParameter(request,"referrer");
213
        String newFormat = defineFormatter(model, format, true, referrers);
214

    
215
        StringBuilder queryBuilder = new StringBuilder();
216
        queryBuilder.append(PUBLICATION_BASIC_QUERY);
217

    
218
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
219
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
220
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
221
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
222
        ParameterQueryEnhancer.enhanceQueryWithCommunityParams(queryBuilder, request);
223
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
224
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
225
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
226
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
227

    
228
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
229
        FormattedSearchResult formattedSearchResult = null;
230

    
231
        try {
232
            formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
233

    
234
		} catch (Exception e) {
235
			logger.error("Fail to execute search.", e);
236
			throw new Exception("Fail to execute search", e);
237

    
238
		}
239

    
240
        PrintWriter writer = response.getWriter();
241
        writer.append(formattedSearchResult.getFormattedResult());
242
        writer.close();
243

    
244
        time = System.currentTimeMillis() - time;
245
        logger.debug("Answer old time " + time);
246
	}
247

    
248
	@RequestMapping(value = "/api/datasets", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
249
	public void searchData(HttpServletRequest request, HttpServletResponse response) throws Exception {
250

    
251
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, DATA_PARAMETERS),request.getParameterMap());
252

    
253
        int page = readParameter(request, "page", 1);
254
        int size = readParameter(request, "size", 10);
255
        checkRequestSize(page, size);
256

    
257
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
258
        createResponseMeta(response, format);
259

    
260
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
261

    
262
        String model = request.getParameter("model");
263
        checkModelParameter(PUB_N_DATASET_MODELS, model);
264
        String sTransformer = defineTransformer(model,format);
265

    
266
        Collection<String> referrers = readParameter(request,"referrer");
267
        String newFormat = defineFormatter(model, format, false, referrers);
268

    
269
        String locale = request.getParameter("locale");
270

    
271
        StringBuilder queryBuilder = new StringBuilder();
272
        queryBuilder.append(DATASET_BASIC_QUERY);
273

    
274
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
275
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
276
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
277
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
278
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
279
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
280
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
281
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
282

    
283
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
284

    
285
        FormattedSearchResult formattedSearchResult =  null;
286
        try {
287
            formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
288

    
289
		} catch (Exception e) {
290
            logger.error("Fail to execute search.", e);
291
            throw new Exception("Fail to execute search.", e);
292
        }
293

    
294
        PrintWriter writer = response.getWriter();
295
        writer.append(formattedSearchResult.getFormattedResult());
296
        writer.close();
297

    
298
	}
299

    
300
    @RequestMapping(value = "/api/software", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
301
    public void searchSoftware(HttpServletRequest request, HttpServletResponse response) throws Exception {
302

    
303
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, SOFTWARE_PARAMETERS),request.getParameterMap());
304

    
305
        int page = readParameter(request, "page", 1);
306
        int size = readParameter(request, "size", 10);
307
        checkRequestSize(page, size);
308

    
309
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
310
        createResponseMeta(response, format);
311

    
312
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
313

    
314
        String model = request.getParameter("model");
315
        checkModelParameter(PUB_N_DATASET_MODELS, model);
316
        String sTransformer = defineTransformer(model,format);
317

    
318
        Collection<String> referrers = readParameter(request,"referrer");
319
        String newFormat = defineFormatter(model, format, false, referrers);
320

    
321
        String locale = request.getParameter("locale");
322

    
323
        StringBuilder queryBuilder = new StringBuilder();
324
        queryBuilder.append(SOFTWARE_BASIC_QUERY);
325

    
326
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
327
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
328
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
329
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
330
        ParameterQueryEnhancer.enhanceQueryWithCommunityParams(queryBuilder, request);
331
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
332
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
333
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
334
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
335

    
336
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
337

    
338
        FormattedSearchResult formattedSearchResult = null;
339

    
340
        try {
341
            formattedSearchResult =  searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
342

    
343
        } catch (Exception e) {
344
            logger.error("Fail to execute search.", e);
345
            throw new Exception("Fail to execute search", e);
346
        }
347

    
348
        PrintWriter writer = response.getWriter();
349
        writer.append(formattedSearchResult.getFormattedResult());
350

    
351
    }
352

    
353
    @RequestMapping(value = "/api/other", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
354
    public void searchOther(HttpServletRequest request, HttpServletResponse response) throws Exception {
355

    
356
        checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, OTHER_PARAMETERS),request.getParameterMap());
357

    
358
        int page = readParameter(request, "page", 1);
359
        int size = readParameter(request, "size", 10);
360
        checkRequestSize(page, size);
361

    
362
        String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
363
        createResponseMeta(response, format);
364

    
365
        checkFormatParameter(PUB_N_DATASET_FORMATS, format);
366

    
367
        String model = request.getParameter("model");
368
        checkModelParameter(PUB_N_DATASET_MODELS, model);
369
        String sTransformer = defineTransformer(model,format);
370

    
371
        Collection<String> referrers = readParameter(request,"referrer");
372
        String newFormat = defineFormatter(model, format, false, referrers);
373

    
374
        String locale = request.getParameter("locale");
375

    
376
        StringBuilder queryBuilder = new StringBuilder();
377
        queryBuilder.append(OTHER_BASIC_QUERY);
378

    
379
        ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
380
        ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
381
        ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
382
        ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
383
        ParameterQueryEnhancer.enhanceQueryWithCommunityParams(queryBuilder, request);
384
        ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
385
        ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
386
        ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
387
        ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
388

    
389
        ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
390

    
391
        FormattedSearchResult formattedSearchResult = null;
392

    
393
        try {
394
            formattedSearchResult =  searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
395

    
396
        } catch (Exception e) {
397
            logger.error("Fail to execute search.", e);
398
            throw new Exception("Fail to execute search", e);
399
        }
400

    
401
        PrintWriter writer = response.getWriter();
402
        writer.append(formattedSearchResult.getFormattedResult());
403

    
404
    }
405

    
406
	@RequestMapping(value = "/api/projects", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE})
407
	public void searchProjects(HttpServletRequest request, HttpServletResponse response) throws Exception {
408

    
409
	    checkParameters(PROJECT_PARAMETERS, request.getParameterMap());
410

    
411
        int page = readParameter(request, "page", 1);
412
        int size = readParameter(request, "size", 10);
413
        checkRequestSize(page, size);
414

    
415
        StringBuilder queryBuilder = new StringBuilder();
416
        queryBuilder.append(PROJECT_BASIC_QUERY);
417
        String locale = request.getParameter("locale");
418

    
419
        String format =  (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
420
        checkFormatParameter(PROJECT_FORMATS, format);
421
        createResponseMeta(response, format);
422

    
423
        format = finalFormat(format);
424

    
425
        String sTransformer = request.getParameter("sTransformer");
426

    
427
        ParameterQueryEnhancer.enhanceProjectQueryWithOpenAIREIds(queryBuilder, request);
428
        ParameterQueryEnhancer.enhanceQueryWithProjectMetadataKeywords(queryBuilder, request);
429
        ParameterQueryEnhancer.enhanceQueryWithProjectFundingParams(queryBuilder, request);
430
        ParameterQueryEnhancer.enhanceProjectQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager);
431
        ParameterQueryEnhancer.enhanceQueryWithParticipantsInfoParams(queryBuilder, request);
432
        ParameterQueryEnhancer.enhanceQueryWithYearParams(queryBuilder, request);
433
        ParameterQueryEnhancer.enhanceQueryWithSC39Params(queryBuilder, request);
434

    
435
        ParameterQueryEnhancer.enhanceQueryWithProjectSortParameters(queryBuilder, request);
436

    
437
        FormattedSearchResult formattedSearchResult = null;
438
        try {
439
            formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, format, locale, page, size);
440

    
441
        } catch (SearchServiceException e) {
442
            throw new Exception("Fail to execute search");
443
        }
444

    
445
        PrintWriter writer = response.getWriter();
446
        writer.append(formattedSearchResult.getFormattedResult());
447
        writer.close();
448
	}
449

    
450

    
451
    @ExceptionHandler(IllegalArgumentException.class)
452
    public @ResponseBody ResponseEntity<Error> invalidInput(HttpServletRequest request, HttpServletResponse httpServletResponse, Exception ex) {
453
        Error response = new Error();
454
        response.setStatus("error");
455
        response.setCode("400");
456
        response.setMessage("400 - Illegal argument exception.");
457
        response.setException(ex.getMessage());
458

    
459
        String format = (request.getParameter("format") == null)? "xml": request.getParameter("format").toLowerCase();
460

    
461
        return new ResponseEntity<Error>(response, HttpStatus.BAD_REQUEST);
462
    }
463

    
464
    private String finalFormat(String format) {
465
        if (format.equals("tsv")){
466
            return "project_tsv";
467

    
468
        } else if (format.equals("csv")) {
469
            return "project_csv";
470

    
471
        } else if (format.equals("html")) {
472
            return "project_html";
473
        }
474

    
475
        return format;
476
    }
477

    
478
    private String finalFormat(String format, String referrer) {
479
        if (referrer == null || referrer.isEmpty() || !referrer.equals("joomla")) {
480
            return finalFormat(format);
481
        }
482

    
483
        if (format.equals("tsv")){
484
            return "publication_tsv_notitle";
485

    
486
        } else if (format.equals("csv")) {
487
            return "publication_csv_notitle";
488

    
489
        }
490

    
491
        return format;
492
    }
493

    
494
    /** TODO: check if needed
495
     * Based on the given model the transformer to be used is defined
496
     * @param model
497
     * @return
498

    
499
    private String defineTransformer(String model) {
500
        if (model!=null && !model.trim().isEmpty()) {
501
            if (model.equals("openaire")) {
502
                return null;
503

    
504
            } else if (model.equals("sygma")) {
505
                return "results_openaire";
506
            }
507
            else if (model.equals("dc")) {
508
                return "dc";
509
            }
510

    
511
            throw new IllegalArgumentException("model '" + model + "' is not supported.");
512

    
513
        } else {
514
            return null;
515
        }
516
    }*/
517

    
518
    //TODO: check if needed
519
    private String defineTransformer(String model, String format) {
520
    if (model != null && !model.trim().isEmpty() && format != null && (format.equals("json")||format.equals("xml"))) {
521
            if (model.equals("openaire")) {
522
                return null;
523

    
524
            } else if (model.equals("sygma")) {
525
                return "results_openaire";
526
            }
527
            else if (model.equals("dc")) {
528
                return "dc";
529
            }
530

    
531
            throw new IllegalArgumentException("model '" + model + "' is not supported.");
532

    
533
    } else if (format != null && !format.trim().isEmpty()) {
534
        if (format.equals("rss") || format.equals("csv") || format.equals("tsv") || format.equals("html")) {
535
            return "results_openaire";
536
        }
537
    }
538

    
539
    return null;
540
	
541
    }
542

    
543
    private String defineFormatter(String model, String format, boolean isPublications, Collection<String> referrers) {
544
        if( model != null && !model.trim().isEmpty() ) {
545
            if (model.equals("sygma")) {
546

    
547
                if (isPublications) {
548
                    return "sygma_publication";
549
                }
550
                return "sygma_dataset";
551
            }
552
        } else {
553
            if (referrers != null && !referrers.isEmpty() && Iterables.get(referrers, 0) != null && !Iterables.get(referrers, 0).isEmpty()) {
554
                return finalFormat(format, Iterables.get(referrers, 0));
555
            } else {
556
                format = finalFormat(format);
557
            }
558
        }
559

    
560
        return null;
561
    }
562

    
563
    @Deprecated
564
    private void createXmlErrorPage(PrintWriter writer, Exception e) {
565
		writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
566
		writer.append("<error>");
567
		writer.append("<exception>")
568
				.append(StringEscapeUtils.escapeXml(e.getClass().getName()))
569
				.append("</exception>");
570
		if (e.getMessage() != null) {
571
			writer.append("<message>")
572
					.append(StringEscapeUtils.escapeXml(e.getMessage()))
573
					.append("</message>");
574
		}
575
		if (e.getCause() != null) {
576
			writer.append("<cause>")
577
					.append(StringEscapeUtils.escapeXml(e.getCause()
578
							.toString())).append("</cause>");
579
		}
580

    
581
		StackTraceElement[] trace = e.getStackTrace();
582
		writer.append("<trace>");
583
		for (int i = 0; i < trace.length; i++) {
584
			writer.append(StringEscapeUtils.escapeXml(trace[i].toString()))
585
					.append("\n");
586
		}
587
		writer.append("</trace>");
588

    
589
		writer.append("</error>");
590
	}
591

    
592
    // Reading parameters from url and adding default values
593
    public int readParameter(HttpServletRequest request, String parameterName, int defaultValue) {
594
        String param = request.getParameter(parameterName);
595
        return (param != null && !param.isEmpty()) ? Integer.parseInt(param) : defaultValue;
596
    }
597

    
598
    private Collection<String> readParameter(HttpServletRequest request, String parameterName) {
599
        Collection<String> fields = null;
600
        String[] paramfields = request.getParameterValues(parameterName);
601
        if (paramfields != null) {
602
            fields = new ArrayList<String>();
603
            for (int i = 0; i < paramfields.length; i++) {
604
                fields.add(paramfields[i]);
605
            }
606
        }
607
        return fields;
608
    }
609

    
610
    /**
611
	 * Checks if the requested result size exceeds the maximum allowed numbers of returned results
612
	 * @param page the page parameter
613
	 * @param size the size parameter
614
	 */
615
	private void checkRequestSize(int page, int size) {
616
		int total = page*size;
617
		if (total > Integer.parseInt(maxResults)) {
618
			throw new IllegalArgumentException("Size and page arguments have exceeded the maximum number of returned results.");
619
		}
620
	}
621

    
622
    private String defineContentType(String format) {
623
        if (format != null) {
624
            if (format.equalsIgnoreCase("xml")) {
625
                return XML_CONTENT_TYPE;
626
            } else if (format.equalsIgnoreCase("json")) {
627
                return JSON_CONTENT_TYPE;
628

    
629
			} else if (format.equalsIgnoreCase("csv")) {
630
                return CSV_CONTENT_TYPE;
631

    
632
            } else if (format.equalsIgnoreCase("tsv")) {
633
                return TSV_CONTENT_TYPE;
634

    
635
            } else if (format.equalsIgnoreCase("html")){
636
                return HTML_CONTENT_TYPE;
637
            }
638
        }
639

    
640
        return XML_CONTENT_TYPE;
641
    }
642
    /**
643
     * Checks if the parameters given are allowed. The given parameters are checked against the allowed parameter
644
     * and the GLOBAL_PARAMETERS.
645
     * @param allowedParameters the allowed parameters
646
     * @param currentParameters the given parameters
647
     */
648
    private void checkParameters(List<String> allowedParameters, Map<String, String[]> currentParameters){
649
        if(currentParameters != null) {
650
            for (String parameter : currentParameters.keySet()) {
651
                if (!allowedParameters.contains(parameter) && !GLOBAL_PARAMETERS.contains(parameter) && !parameter.equals("referrer")) {
652
                    throw new IllegalArgumentException("Parameter " + parameter + " is not supported. The supported parameters are: " +
653
                            allowedParameters.toString().replace("[","").replace("]", ", ") + GLOBAL_PARAMETERS.toString().substring(1,GLOBAL_PARAMETERS.toString().length()-1));
654
                }
655
            }
656
        }
657
    }
658

    
659
    private void checkFormatParameter(List<String> allowedFormats, String requestedFormat) {
660
        if (requestedFormat!= null && !allowedFormats.contains(requestedFormat)) {
661
            throw new IllegalArgumentException("The requested format \'"+ requestedFormat +"\' is not supported. The supported formats are: " + allowedFormats);
662
        }
663
    }
664

    
665
    private static void checkModelParameter(List<String> allowedModels, String requestedModel) {
666
        if (requestedModel!= null && !allowedModels.contains(requestedModel)) {
667
            throw new IllegalArgumentException("The requested model \'"+ allowedModels +"\' is not supported. The supported formats are: " + allowedModels);
668
        }
669
    }
670

    
671
    private static boolean isModelSygma(String model) {
672
        if (model == null || model.isEmpty()) { return false; }
673

    
674
        if (!model.isEmpty() && !model.equals("sygma")) {
675
            return  false;
676
        }
677

    
678
        return true;
679
    }
680

    
681
    private void createResponseMeta( HttpServletResponse response, String format) {
682
        response.setContentType(defineContentType(format));
683
        response.setCharacterEncoding("UTF-8");
684

    
685
        if (!format.equals("xml") || !format.equals("json")) {
686

    
687
            SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
688
            String date = sdf.format(new Date());
689

    
690
            if (format.equals("csv")) {
691
                response.setHeader("Content-Disposition", "filename="+date+".csv");
692

    
693
            } else if (format.equals("csv")) {
694
                response.setHeader("Content-Disposition", "filename="+date+".tsv");
695

    
696
            } else if (format.equals("html")) {
697
                response.setHeader("Content-Disposition", "filename="+date+".html");
698
            }
699
        }
700
    }
701

    
702

    
703
    /* TODO: enable if we decide to use ACCEPT Header as a priority to format parameter
704
    private String getFormat(HttpServletRequest request) {
705
        if (request.getParameter("format") == null && request.getHeader("Accept")!=null) {
706
            if (request.getHeader("Accept").equals(MediaType.APPLICATION_XML_VALUE) ||
707
                    request.getHeader("Accept").contains(MediaType.APPLICATION_XML_VALUE)){
708
                return "xml";
709
            }
710

    
711
            if (request.getHeader("Accept").equals(MediaType.APPLICATION_JSON_VALUE)){
712
                return "json";
713
            }
714
        }
715

    
716
        if (request.getParameter("format") == null && (request.getHeader("Accept")== null ||
717
                request.getHeader("Accept").equals(MediaType.ALL_VALUE))) {
718
            return "xml";
719
        }
720

    
721
        return request.getParameter("format");
722
    } */
723

    
724
    /*public void test(HttpServletRequest request, HttpServletResponse response) throws IOException, SolrServerException {
725

    
726
        long time = System.currentTimeMillis();
727

    
728
        CloudSolrServer solrClient = new CloudSolrServer("openaire-solr-beta.vls.icm.edu.pl:9983");
729
        solrClient.setDefaultCollection("DMF-index-openaire");
730

    
731
        response.setContentType("text/html");
732
        ServletOutputStream out=response.getOutputStream();
733

    
734
        NamedList<String> queryOpts = new NamedList<String>();
735

    
736
        //q=*:*&start=0&rows=10&cursorMark=*&sort=dateofcollection asc
737
        try {
738
            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());
739

    
740
        } catch (CQLParseException e) {
741
            logger.error(e);
742
        }
743
        queryOpts.add("start", "0");
744
        queryOpts.add("rows", "500");
745
        queryOpts.add("fl", "__result");
746
        queryOpts.add("shards.tolerant","true");
747
        queryOpts.add("cursorMark", "*");
748
        queryOpts.add("sort", "__indexrecordidentifier asc");
749

    
750

    
751
        //queryOpts.add("q", new CqlTranslatorImpl().getTranslatedQuery("oaftype exact project").asLucene());
752
        NamedList<String> extraOpts = new NamedList<String>();
753

    
754
        QueryResponse resp = null;
755

    
756
        String cursorMark = "*";
757
        String nextCursorMark = "";
758

    
759
        //QueryResponse resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
760

    
761
        int curs = 0;
762
        while (!cursorMark.equals(nextCursorMark)) {
763
            logger.debug("QUERY OPTS: " + queryOpts.get("cursorMark"));
764
            resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
765
            logger.debug("TOTAL number " + resp.getResults().getNumFound());
766
            logger.debug(resp.getNextCursorMark());
767

    
768
            System.out.println("BEGIN");
769
            System.out.println("cursor " + cursorMark);
770
            System.out.println("next cursor " + nextCursorMark);
771

    
772
            cursorMark = nextCursorMark;
773
            nextCursorMark = resp.getNextCursorMark();
774

    
775
            for (int i = 0; i < resp.getResults().size(); i++) {
776
                String result = ((ArrayList<String>) resp.getResults().get(i).get("__result")).get(0);
777
                out.write(result.getBytes());
778
                out.flush();
779
            }
780

    
781
            System.out.println("END");
782
            System.out.println("cursor " + cursorMark);
783
            System.out.println("next cursor " + nextCursorMark);
784
            queryOpts.remove("cursorMark");
785
            queryOpts.add("cursorMark", nextCursorMark);
786

    
787
            System.out.println("CURS " + curs);
788
            curs ++;
789

    
790
        }
791

    
792
        out.close();
793

    
794
        time = System.currentTimeMillis() - time;
795
        System.out.println("Answer time " + time);
796
    }*/
797
}
(8-8/10)