Project

General

Profile

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

    
3
import com.google.common.collect.Iterables;
4
import eu.dnetlib.data.search.app.SearchServiceImpl;
5
import eu.dnetlib.data.search.utils.cql.ParameterQueryEnhancer;
6
import eu.dnetlib.data.search.utils.vocabulary.VocabularyManager;
7
import eu.dnetlib.domain.data.FormattedSearchResult;
8
import org.apache.commons.collections.ListUtils;
9
import org.apache.commons.io.IOUtils;
10
import org.apache.commons.lang.IncompleteArgumentException;
11
import org.apache.commons.lang.StringEscapeUtils;
12
import org.apache.log4j.Logger;
13
import org.springframework.beans.factory.annotation.Autowired;
14
import org.springframework.stereotype.Controller;
15
import org.springframework.ui.ModelMap;
16
import org.springframework.web.bind.annotation.RequestMapping;
17
import org.springframework.web.bind.annotation.RequestMethod;
18

    
19
import javax.annotation.Resource;
20
import javax.servlet.http.HttpServletRequest;
21
import javax.servlet.http.HttpServletResponse;
22
import java.io.PrintWriter;
23
import java.text.SimpleDateFormat;
24
import java.util.*;
25

    
26
@Controller
27
public class SearchRequestController {
28

    
29
	@Autowired
30
	private SearchServiceImpl searchService = null;
31
	@Autowired
32
	private VocabularyManager vocabularyManager = null;
33

    
34
	@Resource
35
	private String maxResults = null;
36

    
37
	@Resource
38
	private String maxSize = null;
39

    
40
	private static Logger logger = Logger.getLogger(SearchRequestController.class);
41

    
42
	private static final String XML_CONTENT_TYPE = "application/xml;charset=UTF-8";
43
	private static final String JSON_CONTENT_TYPE = "application/json;charset=UTF-8;";
44
    private static final String CSV_CONTENT_TYPE = "text/csv;charset=UTF-8;";
45
    private static final String TSV_CONTENT_TYPE = "text/tab-separated-values;charset=UTF-8;";
46
    private static final String HTML_CONTENT_TYPE = "text/html;charset=UTF-8;";
47

    
48
    private static final String PUBLICATION_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact publication)";
49
    private static final String DATASET_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact dataset)";
50
    private static final String SOFTWARE_BASIC_QUERY = "(oaftype exact result) and (resulttypeid exact software)";
51
    private static final String PROJECT_BASIC_QUERY = "(oaftype exact project)";
52

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

    
55
    private static final List<String> PUB_N_DATA_COMMON_PARAMETERS = Arrays.asList("author", "doi", "FP7ProjectID", "FP7scientificArea",
56
            "fromDateAccepted", "funder", "fundingStream", "hasECFunding", "hasProject", "hasWTFunding", "keywords",
57
            "model", "OA", "openaireAuthorID", "openaireProjectID", "openaireProviderID", "projectID", "title", "toDateAccepted");
58

    
59
    private static final List<String> PUB_PARAMETERS = Arrays.asList("openairePublicationID");
60
    private static final List<String> DATA_PARAMETERS = Arrays.asList("openaireDatasetID");
61
    private static final List<String> SOFTWARE_PARAMETERS = Arrays.asList("openaireSoftwareID");
62

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

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

    
71
	@RequestMapping(value = "/search", method = RequestMethod.GET)
72
	public void search(HttpServletRequest request, HttpServletResponse response) {
73
		PrintWriter writer = null;
74
		FormattedSearchResult formattedSearchResult = null;
75

    
76
        String action = readActionParameter(request);
77
        String query = readQueryParameter(request);
78
		String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
79
        createResponseMeta(response, format);
80

    
81
		String locale = request.getParameter("locale");
82

    
83
        int page= 0;
84
        int size =-1;
85
        //TODO check paging
86
        if (!action.equals("refine")) {
87
            page = readParameter(request, "page", 1);
88
            size = readParameter(request, "size", 10);
89
        }
90
        
91
		if (size > Integer.parseInt(maxSize)) {
92
			throw new IllegalArgumentException("Size argument have exceeded the maximum allowed number.");
93
		}
94

    
95
		String sTransformer = request.getParameter("sTransformer");
96
		String rTransformer = request.getParameter("rTransformer");
97
		Collection<String> fields = readParameter(request, "fields");
98

    
99
        checkTransformerParameters(action, sTransformer, rTransformer, fields);
100

    
101
        try {
102
            createResponseMeta(response, format);
103
            writer = response.getWriter();
104

    
105
            formattedSearchResult = searchService.searchNrefine(query,
106
                    sTransformer, rTransformer, format, locale, page, size,
107
                    fields);
108

    
109
			writer.append(formattedSearchResult.getFormattedResult());
110

    
111
		} catch (Exception e) {
112
			logger.error("Fail to execute search.", e);
113
			createXmlErrorPage(writer, e);
114

    
115
		} finally {
116
            if (writer != null) {
117
                writer.close();
118
            }
119
		}
120
	}
121

    
122
    private void checkTransformerParameters(String action, String sTransformer, String rTransformer, Collection<String> fields) {
123
        if (action.equals("search")) {
124
            if (sTransformer == null) {
125
                throw new IncompleteArgumentException("Undefined search transformer. Search request");
126
            }
127

    
128
        } else if (action.equals("refine")) {
129
            if (rTransformer == null) {
130
                throw new IncompleteArgumentException(
131
                        "Undefined refine transformer. Refine request");
132
            }
133

    
134
            if (fields == null) {
135
                throw new IncompleteArgumentException(
136
                        "Undefined refine fields. Refine request");
137
            }
138

    
139
        } else if (action.equals("searchNrefine")) {
140

    
141
            if (sTransformer == null) {
142
                throw new IncompleteArgumentException(
143
                        "Undefined search transformer. Search and Refine request");
144
            }
145

    
146
            if (rTransformer == null) {
147
                throw new IncompleteArgumentException(
148
                        "Undefined refine transformer. Search and Refine request");
149
            }
150

    
151
            if (fields == null) {
152
                throw new IncompleteArgumentException(
153
                        "Undefined refine fields. Search and Refine request");
154
            }
155

    
156
        } else {
157
            throw new UnsupportedOperationException("The action " + action
158
                    + " is not supported. Please try one of {search, refine, searchNrefine}.");
159
        }
160
    }
161

    
162
    private String readQueryParameter(HttpServletRequest request) {
163
        String query = request.getParameter("query");
164
        if (query == null) {
165
            throw new IncompleteArgumentException("Undefined query. Search request");
166
        }
167
        return query;
168
    }
169

    
170
    private String readActionParameter(HttpServletRequest request) {
171
        String action = request.getParameter("action");
172
        if (action == null) {
173
            throw new UnsupportedOperationException("Undefined action.");
174
        }
175
        return action;
176
    }
177

    
178

    
179
    @RequestMapping(value="/search/openSearchDescriptor", method = RequestMethod.GET)
180
    public String printOpenSearchDescriptor(ModelMap model) {
181
        return "openSearchDescriptor";
182
    }
183

    
184
	@RequestMapping(value = "/api/publications", method = RequestMethod.GET)
185
	public void searchPublications(HttpServletRequest request, HttpServletResponse response) {
186

    
187
        long time = System.currentTimeMillis();
188

    
189
		PrintWriter writer = null;
190

    
191
        try {
192
            writer = response.getWriter();
193

    
194
            checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, PUB_PARAMETERS),request.getParameterMap());
195

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

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

    
204
            String locale = request.getParameter("locale");
205

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

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

    
213
            StringBuilder queryBuilder = new StringBuilder();
214
            queryBuilder.append(PUBLICATION_BASIC_QUERY);
215

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

    
225
            ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
226

    
227
			FormattedSearchResult formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
228
			writer.append(formattedSearchResult.getFormattedResult());
229

    
230
		} catch (Exception e) {
231
			logger.error("Fail to execute search.", e);
232
			createXmlErrorPage(writer, e);
233

    
234
		} finally {
235
            if (writer != null) {
236
                IOUtils.closeQuietly(writer);
237
            }
238
		}
239

    
240
        time = System.currentTimeMillis() - time;
241
        System.out.println("Answer old time " + time);
242
	}
243

    
244
	@RequestMapping(value = "/api/datasets", method = RequestMethod.GET)
245
	public void searchData(HttpServletRequest request, HttpServletResponse response) {
246

    
247
		PrintWriter writer = null;
248

    
249
        try {
250
            writer = response.getWriter();
251

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

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

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

    
261
            checkFormatParameter(PUB_N_DATASET_FORMATS, format);
262

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

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

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

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

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

    
284
            ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
285

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

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

    
293
		} finally {
294
            if (writer != null) {
295
                IOUtils.closeQuietly(writer);
296
            }
297
		}
298

    
299
	}
300

    
301
    @RequestMapping(value = "/api/software", method = RequestMethod.GET)
302
    public void searchSoftware(HttpServletRequest request, HttpServletResponse response) {
303

    
304
        PrintWriter writer = null;
305

    
306
        try {
307
            writer = response.getWriter();
308

    
309
            checkParameters(ListUtils.union(PUB_N_DATA_COMMON_PARAMETERS, SOFTWARE_PARAMETERS),request.getParameterMap());
310

    
311
            int page = readParameter(request, "page", 1);
312
            int size = readParameter(request, "size", 10);
313
            checkRequestSize(page, size);
314

    
315
            String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
316
            createResponseMeta(response, format);
317

    
318
            checkFormatParameter(PUB_N_DATASET_FORMATS, format);
319

    
320
            String model = request.getParameter("model");
321
            checkModelParameter(PUB_N_DATASET_MODELS, model);
322
            String sTransformer = defineTransformer(model,format);
323

    
324
            Collection<String> referrers = readParameter(request,"referrer");
325
            String newFormat = defineFormatter(model, format, false, referrers);
326

    
327
            String locale = request.getParameter("locale");
328

    
329
            StringBuilder queryBuilder = new StringBuilder();
330
            queryBuilder.append(SOFTWARE_BASIC_QUERY);
331

    
332
            ParameterQueryEnhancer.enhanceQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager, isModelSygma(model));
333
            ParameterQueryEnhancer.enhanceQueryWithOpenAIREIds(queryBuilder, request);
334
            ParameterQueryEnhancer.enhanceQueryWithMetadataKeywords(queryBuilder, request);
335
            ParameterQueryEnhancer.enhanceQueryWithFundingParams(queryBuilder, request);
336
            ParameterQueryEnhancer.enhanceQueryWithRelProjectParams(queryBuilder, request);
337
            ParameterQueryEnhancer.enhanceQueryWithAccessRights(queryBuilder, request);
338
            ParameterQueryEnhancer.enhanceQueryWithDate(queryBuilder, request);
339
            ParameterQueryEnhancer.enhanceQueryWithDoi(queryBuilder, request);
340

    
341
            ParameterQueryEnhancer.enhanceQueryWithResultsSortParameters(queryBuilder, request);
342

    
343
            FormattedSearchResult formattedSearchResult =  searchService.search(queryBuilder.toString(),sTransformer, (newFormat!=null)?newFormat:format, locale, page, size);
344
            writer.append(formattedSearchResult.getFormattedResult());
345

    
346
        } catch (Exception e) {
347
            logger.error("Fail to execute search.", e);
348
            createXmlErrorPage(writer, e);
349

    
350
        } finally {
351
            if (writer != null) {
352
                IOUtils.closeQuietly(writer);
353
            }
354
        }
355

    
356
    }
357

    
358
	@RequestMapping(value = "/api/projects", method = RequestMethod.GET)
359
	public void searchProjects(HttpServletRequest request, HttpServletResponse response)  {
360

    
361
		PrintWriter writer = null;
362

    
363
        try {
364
            writer = response.getWriter();
365

    
366
            checkParameters(PROJECT_PARAMETERS, request.getParameterMap());
367

    
368
            int page = readParameter(request, "page", 1);
369
            int size = readParameter(request, "size", 10);
370
            checkRequestSize(page, size);
371

    
372
            StringBuilder queryBuilder = new StringBuilder();
373
            queryBuilder.append(PROJECT_BASIC_QUERY);
374
            String locale = request.getParameter("locale");
375

    
376
            String format = (request.getParameter("format") != null) ? request.getParameter("format") : "xml";
377
            checkFormatParameter(PROJECT_FORMATS, format);
378
            createResponseMeta(response, format);
379

    
380
            format = finalFormat(format);
381

    
382

    
383
            String sTransformer = request.getParameter("sTransformer");
384

    
385
            FormattedSearchResult formattedSearchResult = null;
386

    
387
            ParameterQueryEnhancer.enhanceProjectQueryWithOpenAIREIds(queryBuilder, request);
388
            ParameterQueryEnhancer.enhanceQueryWithProjectMetadataKeywords(queryBuilder, request);
389
            ParameterQueryEnhancer.enhanceQueryWithProjectFundingParams(queryBuilder, request);
390
            ParameterQueryEnhancer.enhanceProjectQueryWithFundingLevelParams(queryBuilder, request, vocabularyManager);
391
            ParameterQueryEnhancer.enhanceQueryWithParticipantsInfoParams(queryBuilder, request);
392
            ParameterQueryEnhancer.enhanceQueryWithYearParams(queryBuilder, request);
393
            ParameterQueryEnhancer.enhanceQueryWithSC39Params(queryBuilder, request);
394

    
395
            ParameterQueryEnhancer.enhanceQueryWithProjectSortParameters(queryBuilder, request);
396

    
397
			formattedSearchResult = searchService.search(queryBuilder.toString(),sTransformer, format, locale, page, size);
398
			writer.append(formattedSearchResult.getFormattedResult());
399

    
400
		} catch (Exception e) {
401
			logger.error("Fail to execute search.", e);
402
            createXmlErrorPage(writer, e);
403

    
404
		} finally {
405
            if (writer != null) {
406
                IOUtils.closeQuietly(writer);
407
            }
408
		}
409
	}
410

    
411
    private String finalFormat(String format) {
412
        if (format.equals("tsv")){
413
            return "project_tsv";
414

    
415
        } else if (format.equals("csv")) {
416
            return "project_csv";
417

    
418
        } else if (format.equals("html")) {
419
            return "project_html";
420
        }
421

    
422
        return format;
423
    }
424

    
425
    private String finalFormat(String format, String referrer) {
426
        if (referrer == null || referrer.isEmpty() || !referrer.equals("joomla")) {
427
            return finalFormat(format);
428
        }
429

    
430
        if (format.equals("tsv")){
431
            return "publication_tsv_notitle";
432

    
433
        } else if (format.equals("csv")) {
434
            return "publication_csv_notitle";
435

    
436
        }
437

    
438
        return format;
439
    }
440

    
441
    /** TODO: check if needed
442
     * Based on the given model the transformer to be used is defined
443
     * @param model
444
     * @return
445

    
446
    private String defineTransformer(String model) {
447
        if (model!=null && !model.trim().isEmpty()) {
448
            if (model.equals("openaire")) {
449
                return null;
450

    
451
            } else if (model.equals("sygma")) {
452
                return "results_openaire";
453
            }
454
            else if (model.equals("dc")) {
455
                return "dc";
456
            }
457

    
458
            throw new IllegalArgumentException("model '" + model + "' is not supported.");
459

    
460
        } else {
461
            return null;
462
        }
463
    }*/
464

    
465
    //TODO: check if needed
466
 private String defineTransformer(String model, String format) {
467
   if (model!=null && !model.trim().isEmpty()) {
468
            if (model.equals("openaire")) {
469
                return null;
470

    
471
            } else if (model.equals("sygma")) {
472
                return "results_openaire";
473
            }
474
            else if (model.equals("dc")) {
475
                return "dc";
476
            }
477

    
478
            throw new IllegalArgumentException("model '" + model + "' is not supported.");
479

    
480
        } else if (format!=null && !format.trim().isEmpty()) {
481
            if (format.equals("rss") || format.equals("csv") || format.equals("tsv") || format.equals("html")) {
482
			    return "results_openaire";
483
		    }
484
        } 
485
		return null;
486
	
487
    }
488

    
489
    private String defineFormatter(String model, String format, boolean isPublications, Collection<String> referrers) {
490
        if( model != null && !model.trim().isEmpty() ) {
491
            if (model.equals("sygma")) {
492

    
493
                if (isPublications) {
494
                    return "sygma_publication";
495
                }
496
                return "sygma_dataset";
497
            }
498
        } else {
499
            if (referrers != null && !referrers.isEmpty() && Iterables.get(referrers, 0) != null && !Iterables.get(referrers, 0).isEmpty()) {
500
                return finalFormat(format, Iterables.get(referrers, 0));
501
            } else {
502
                format = finalFormat(format);
503
            }
504
        }
505

    
506
        return null;
507
    }
508

    
509
    private void createXmlErrorPage(PrintWriter writer, Exception e) {
510
		writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
511
		writer.append("<error>");
512
		writer.append("<exception>")
513
				.append(StringEscapeUtils.escapeXml(e.getClass().getName()))
514
				.append("</exception>");
515
		if (e.getMessage() != null) {
516
			writer.append("<message>")
517
					.append(StringEscapeUtils.escapeXml(e.getMessage()))
518
					.append("</message>");
519
		}
520
		if (e.getCause() != null) {
521
			writer.append("<cause>")
522
					.append(StringEscapeUtils.escapeXml(e.getCause()
523
							.toString())).append("</cause>");
524
		}
525

    
526
		StackTraceElement[] trace = e.getStackTrace();
527
		writer.append("<trace>");
528
		for (int i = 0; i < trace.length; i++) {
529
			writer.append(StringEscapeUtils.escapeXml(trace[i].toString()))
530
					.append("\n");
531
		}
532
		writer.append("</trace>");
533

    
534
		writer.append("</error>");
535
	}
536

    
537
    // Reading parameters from url and adding default values
538
    public int readParameter(HttpServletRequest request, String parameterName, int defaultValue) {
539
        String param = request.getParameter(parameterName);
540
        return (param != null && !param.isEmpty()) ? Integer.parseInt(param) : defaultValue;
541
    }
542

    
543
    private Collection<String> readParameter(HttpServletRequest request, String parameterName) {
544
        Collection<String> fields = null;
545
        String[] paramfields = request.getParameterValues(parameterName);
546
        if (paramfields != null) {
547
            fields = new ArrayList<String>();
548
            for (int i = 0; i < paramfields.length; i++) {
549
                fields.add(paramfields[i]);
550
            }
551
        }
552
        return fields;
553
    }
554

    
555
    /**
556
	 * Checks if the requested result size exceeds the maximum allowed numbers of returned results
557
	 * @param page the page parameter
558
	 * @param size the size parameter
559
	 */
560
	private void checkRequestSize(int page, int size) {
561
		int total = page*size;
562
		if (total > Integer.parseInt(maxResults)) {
563
			throw new IllegalArgumentException("Size and page arguments have exceeded the maximum number of returned results.");
564
		}
565
	}
566

    
567
    private String defineContentType(String format) {
568
        if (format != null) {
569
            if (format.equalsIgnoreCase("xml")) {
570
                return XML_CONTENT_TYPE;
571
            } else if (format.equalsIgnoreCase("json")) {
572
                return JSON_CONTENT_TYPE;
573

    
574
			} else if (format.equalsIgnoreCase("csv")) {
575
                return CSV_CONTENT_TYPE;
576

    
577
            } else if (format.equalsIgnoreCase("tsv")) {
578
                return TSV_CONTENT_TYPE;
579

    
580
            } else if (format.equalsIgnoreCase("html")){
581
                return HTML_CONTENT_TYPE;
582
            }
583
        }
584

    
585
        return XML_CONTENT_TYPE;
586
    }
587
    /**
588
     * Checks if the parameters given are allowed. The given parameters are checked against the allowed parameter
589
     * and the GLOBAL_PARAMETERS.
590
     * @param allowedParameters the allowed parameters
591
     * @param currentParameters the given parameters
592
     */
593
    private void checkParameters(List<String> allowedParameters, Map<String, String[]> currentParameters){
594
        if(currentParameters != null) {
595
            for (String parameter : currentParameters.keySet()) {
596
                if (!allowedParameters.contains(parameter) && !GLOBAL_PARAMETERS.contains(parameter) && !parameter.equals("referrer")) {
597
                    throw new IllegalArgumentException("Parameter " + parameter + " is not supported. The supported parameters are: " +
598
                            allowedParameters.toString().replace("[","").replace("]", ", ") + GLOBAL_PARAMETERS.toString().substring(1,GLOBAL_PARAMETERS.toString().length()-1));
599
                }
600
            }
601
        }
602
    }
603

    
604
    private void checkFormatParameter(List<String> allowedFormats, String requestedFormat) {
605
        if (requestedFormat!= null && !allowedFormats.contains(requestedFormat)) {
606
            throw new IllegalArgumentException("The requested format \'"+ requestedFormat +"\' is not supported. The supported formats are: " + allowedFormats);
607
        }
608
    }
609

    
610
    private static void checkModelParameter(List<String> allowedModels, String requestedModel) {
611
        if (requestedModel!= null && !allowedModels.contains(requestedModel)) {
612
            throw new IllegalArgumentException("The requested model \'"+ allowedModels +"\' is not supported. The supported formats are: " + allowedModels);
613
        }
614
    }
615

    
616
    private static boolean isModelSygma(String model) {
617
        if (model == null || model.isEmpty()) { return false; }
618

    
619
        if (!model.isEmpty() && !model.equals("sygma")) {
620
            return  false;
621
        }
622

    
623
        return true;
624
    }
625

    
626
    private void createResponseMeta( HttpServletResponse response, String format) {
627
        response.setContentType(defineContentType(format));
628
        response.setCharacterEncoding("UTF-8");
629

    
630
        if (!format.equals("xml") || !format.equals("json")) {
631

    
632
            SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
633
            String date = sdf.format(new Date());
634

    
635
            if (format.equals("csv")) {
636
                response.setHeader("Content-Disposition", "filename="+date+".csv");
637

    
638
            } else if (format.equals("csv")) {
639
                response.setHeader("Content-Disposition", "filename="+date+".tsv");
640

    
641
            } else if (format.equals("html")) {
642
                response.setHeader("Content-Disposition", "filename="+date+".html");
643
            }
644
        }
645
    }
646

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

    
649
        long time = System.currentTimeMillis();
650

    
651
        CloudSolrServer solrClient = new CloudSolrServer("openaire-solr-beta.vls.icm.edu.pl:9983");
652
        solrClient.setDefaultCollection("DMF-index-openaire");
653

    
654
        response.setContentType("text/html");
655
        ServletOutputStream out=response.getOutputStream();
656

    
657
        NamedList<String> queryOpts = new NamedList<String>();
658

    
659
        //q=*:*&start=0&rows=10&cursorMark=*&sort=dateofcollection asc
660
        try {
661
            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());
662

    
663
        } catch (CQLParseException e) {
664
            logger.error(e);
665
        }
666
        queryOpts.add("start", "0");
667
        queryOpts.add("rows", "500");
668
        queryOpts.add("fl", "__result");
669
        queryOpts.add("shards.tolerant","true");
670
        queryOpts.add("cursorMark", "*");
671
        queryOpts.add("sort", "__indexrecordidentifier asc");
672

    
673

    
674
        //queryOpts.add("q", new CqlTranslatorImpl().getTranslatedQuery("oaftype exact project").asLucene());
675
        NamedList<String> extraOpts = new NamedList<String>();
676

    
677
        QueryResponse resp = null;
678

    
679
        String cursorMark = "*";
680
        String nextCursorMark = "";
681

    
682
        //QueryResponse resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
683

    
684
        int curs = 0;
685
        while (!cursorMark.equals(nextCursorMark)) {
686
            logger.debug("QUERY OPTS: " + queryOpts.get("cursorMark"));
687
            resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
688
            logger.debug("TOTAL number " + resp.getResults().getNumFound());
689
            logger.debug(resp.getNextCursorMark());
690

    
691
            System.out.println("BEGIN");
692
            System.out.println("cursor " + cursorMark);
693
            System.out.println("next cursor " + nextCursorMark);
694

    
695
            cursorMark = nextCursorMark;
696
            nextCursorMark = resp.getNextCursorMark();
697

    
698
            for (int i = 0; i < resp.getResults().size(); i++) {
699
                String result = ((ArrayList<String>) resp.getResults().get(i).get("__result")).get(0);
700
                out.write(result.getBytes());
701
                out.flush();
702
            }
703

    
704
            System.out.println("END");
705
            System.out.println("cursor " + cursorMark);
706
            System.out.println("next cursor " + nextCursorMark);
707
            queryOpts.remove("cursorMark");
708
            queryOpts.add("cursorMark", nextCursorMark);
709

    
710
            System.out.println("CURS " + curs);
711
            curs ++;
712

    
713
        }
714

    
715
        out.close();
716

    
717
        time = System.currentTimeMillis() - time;
718
        System.out.println("Answer time " + time);
719
    }*/
720
}
(6-6/8)