Project

General

Profile

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

    
3
import eu.dnetlib.api.data.SearchServiceException;
4
import eu.dnetlib.data.search.app.SearchServiceImpl;
5
import eu.dnetlib.data.search.transform.Transformer;
6
import eu.dnetlib.data.search.transform.config.SearchRegistry;
7
import eu.dnetlib.data.search.utils.cql.CQLQueryBuilder;
8
import eu.dnetlib.data.search.web.utils.RequestResponseHandler;
9
import eu.dnetlib.domain.data.SearchResult;
10
import org.apache.log4j.Logger;
11
import org.springframework.beans.factory.annotation.Autowired;
12
import org.springframework.stereotype.Component;
13

    
14
import javax.servlet.http.HttpServletRequest;
15
import javax.ws.rs.*;
16
import javax.ws.rs.core.Context;
17
import javax.ws.rs.core.MediaType;
18
import javax.ws.rs.core.Response;
19
import java.util.List;
20
import java.util.Locale;
21

    
22
/**
23
 * Created by kiatrop on 2/6/2016.
24
 */
25

    
26
@Component
27
@Path("/v2")
28
public class SearchApiService {
29

    
30
    private static final Logger logger = Logger.getLogger(SearchApiService.class);
31

    
32
    @Autowired
33
    private SearchServiceImpl searchService = null;
34

    
35
    @Autowired
36
    private SearchRegistry searchRegistry = null;
37

    
38
    @GET
39
    @Path("/api/resources")
40
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
41
    public Response fetchResources(@QueryParam("query") String query,
42
                                      @DefaultValue("0") @QueryParam("page") final int offset,
43
                                      @DefaultValue("10") @QueryParam("size") final int limit,
44
                                      @QueryParam("refine") @DefaultValue("false") final boolean refine,
45
                                      @QueryParam("fields") final List<String> fields,
46
                                      @QueryParam("fq") final List<String> fieldQueries,
47
                                      @QueryParam("format") final String format,
48
                                      @QueryParam("type") final String type,
49
                                      @Context final HttpServletRequest request) {
50

    
51
        return getResponseByEntity(query, extractEntity(type), offset, limit, format, request, refine, fields, fieldQueries);
52
    }
53

    
54
    @GET
55
    @Path("/api/publications")
56
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
57
    public Response fetchPublications(@QueryParam("q") final String keywords,
58
                                      @QueryParam("doi") final String doi,
59
                                      @DefaultValue("0") @QueryParam("page") final int offset,
60
                                      @DefaultValue("10") @QueryParam("size") final int limit,
61
                                      @QueryParam("refine") @DefaultValue("false") final boolean refine,
62
                                      @QueryParam("fields") final List<String> fields,
63
                                      @QueryParam("fq") final List<String> fieldQueries,
64
                                      @QueryParam("format") final String format,
65
                                      @Context final HttpServletRequest request) {
66

    
67
        //TODO do not allow q and keywords both - SWITCH back if needed
68
        //String simpleQuery = buildSimpleSearchQuery(RequestResponseHandler.Entity.PUBLICATION, keywords) ;
69
        String simpleQuery = buildSearchRequest(RequestResponseHandler.Entity.PUBLICATION, keywords, doi, fieldQueries);
70
        return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.PUBLICATION, offset, limit, format, request, refine, fields, fieldQueries);
71

    
72
    }
73

    
74

    
75
    @GET
76
    @Path("/api/publications/count")
77
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
78
    public Response fetchPublicationsCount(@QueryParam("q") String query,
79
                                           @QueryParam("format") final String format,
80
                                           @QueryParam("fq") final List<String> fieldQueries,
81
                                           @Context final HttpServletRequest request)  {
82
        String fullQuery = buildSearchRequest(RequestResponseHandler.Entity.PUBLICATION, query, fieldQueries);
83
        return getCount(request, fullQuery, format, fieldQueries);
84
    }
85

    
86

    
87
    @GET
88
    @Path("/api/publications/{publicationid}")
89
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
90
    public Response fetchPublicationsById(@PathParam("publicationid") String publicationid,
91
                                          @QueryParam("format") final String format,
92
                                          @QueryParam("fq") final List<String> fieldQueries,
93
                                          @Context final HttpServletRequest request) {
94
        return getResponseByEntityId(request, RequestResponseHandler.Entity.PUBLICATION, publicationid, format, fieldQueries);
95
    }
96

    
97

    
98
    @GET
99
    @Path("/api/datasets")
100
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
101
    public Response fetchDatasets(@QueryParam("q") String keywords,
102
                                  @QueryParam("doi") final String doi,
103
                                  @DefaultValue("0") @QueryParam("page") int offset,
104
                                  @DefaultValue("10") @QueryParam("size") int limit,
105
                                  @QueryParam("refine") @DefaultValue("false") boolean refine,
106
                                  @QueryParam("fields") final List<String> fields,
107
                                  @QueryParam("fq") final List<String> fieldQueries,
108
                                  @QueryParam("format") final String format,
109
                                  @Context HttpServletRequest request) {
110

    
111
        String simpleQuery = buildSearchRequest(RequestResponseHandler.Entity.DATASET, keywords, doi, fieldQueries);
112
        return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.DATASET, offset, limit, format, request, refine, fields, fieldQueries);
113
    }
114

    
115
    @GET
116
    @Path("/api/datasets/count")
117
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
118
    public Response fetchDatesetsCount(@QueryParam("q") String query,
119
                                       @QueryParam("format") final String format,
120
                                       @QueryParam("fq") final List<String> fieldQueries,
121
                                       @Context final HttpServletRequest request)  {
122
        String fullQuery = buildSearchRequest(RequestResponseHandler.Entity.DATASET, query, fieldQueries);
123
        return getCount(request, fullQuery, format, fieldQueries);
124
    }
125

    
126

    
127
    @GET
128
    @Path("/api/datasets/{datasetid}")
129
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
130
    public Response fetchDatasets(@PathParam("datasetid") String datasetid,
131
                                  @QueryParam("format") final String format,
132
                                  @QueryParam("fq") final List<String> fieldQueries,
133
                                  @Context final HttpServletRequest request) {
134
        return getResponseByEntityId(request, RequestResponseHandler.Entity.DATASET, datasetid, format, fieldQueries);
135
    }
136

    
137
    @GET
138
    @Path("/api/software")
139
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
140
    public Response fetchSoftware(@QueryParam("q") String keywords,
141
                                  @QueryParam("doi") final String doi,
142
                                  @DefaultValue("0") @QueryParam("page") int offset,
143
                                  @DefaultValue("10") @QueryParam("size") int limit,
144
                                  @QueryParam("refine") @DefaultValue("false") boolean refine,
145
                                  @QueryParam("fields") final List<String> fields,
146
                                  @QueryParam("fq") final List<String> fieldQueries,
147
                                  @QueryParam("format") final String format,
148
                                  @Context HttpServletRequest request) {
149

    
150
        String simpleQuery = buildSearchRequest(RequestResponseHandler.Entity.SOFTWARE, keywords, doi, fieldQueries);
151
        return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.SOFTWARE, offset, limit, format, request, refine, fields, fieldQueries);
152
    }
153

    
154
    @GET
155
    @Path("/api/software/count")
156
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
157
    public Response fetchSoftwareCount(@QueryParam("q") String query,
158
                                       @QueryParam("format") final String format,
159
                                       @QueryParam("fq") final List<String> fieldQueries,
160
                                       @Context final HttpServletRequest request)  {
161
        String fullQuery = buildSearchRequest(RequestResponseHandler.Entity.SOFTWARE, query, fieldQueries);
162
        return getCount(request, fullQuery, format, fieldQueries);
163
    }
164

    
165
    @GET
166
    @Path("/api/software/{softwareid}")
167
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
168
    public Response fetchSoftware(@PathParam("softwareid") String datasetid,
169
                                  @QueryParam("format") final String format,
170
                                  @QueryParam("fq") final List<String> fieldQueries,
171
                                  @Context final HttpServletRequest request) {
172
        return getResponseByEntityId(request, RequestResponseHandler.Entity.SOFTWARE, datasetid, format, fieldQueries);
173
    }
174

    
175
    @GET
176
    @Path("/api/projects")
177
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
178
    public Response fetchProjects(@QueryParam("q") String keywords,
179
                                  @DefaultValue("0") @QueryParam("page") int offset,
180
                                  @DefaultValue("10") @QueryParam("size") int limit,
181
                                  @QueryParam("refine") @DefaultValue("false") boolean refine,
182
                                  @QueryParam("fields") final List<String> fields,
183
                                  @QueryParam("fq") final List<String> fieldQueries,
184
                                  @QueryParam("format") final String format,
185
                                  @Context HttpServletRequest request) {
186

    
187
        String simpleQuery = buildSearchRequest(RequestResponseHandler.Entity.PROJECT, keywords, fieldQueries);
188
        return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.PROJECT, offset, limit, format, request, refine, fields, fieldQueries);
189
    }
190

    
191

    
192
    @GET
193
    @Path("/api/projects/count")
194
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
195
    public Response fetchProjectsCount(@QueryParam("q") String query,
196
                                       @QueryParam("format") final String format,
197
                                       @QueryParam("fq") final List<String> fieldQueries,
198
                                       @Context final HttpServletRequest request) {
199
        String fullQuery = buildSearchRequest(RequestResponseHandler.Entity.PROJECT, query, fieldQueries);
200
        return getCount(request, fullQuery, format, fieldQueries);
201
    }
202

    
203
    @GET
204
    @Path("/api/projects/{projectid}")
205
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
206
    public Response fetchProjects(@PathParam("projectid") String projectid,
207
                                  @QueryParam("format") final String format,
208
                                  @QueryParam("fq") final List<String> fieldQueries,
209
                                  @Context final HttpServletRequest request) {
210
        return getResponseByEntityId(request, RequestResponseHandler.Entity.PROJECT, projectid, format, fieldQueries);
211
    }
212

    
213
    @GET
214
    @Path("/api/projects/{projectId}/publications")
215
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
216
    public Response fetchProjectPublications(@PathParam("projectId") String projectId,
217
                                             @DefaultValue("0") @QueryParam("page") int offset,
218
                                             @DefaultValue("10") @QueryParam("size") int limit,
219
                                             @QueryParam("format") final String format,
220
                                             @QueryParam("fq") final List<String> fieldQueries,
221
                                             @Context HttpServletRequest request)  {
222

    
223
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PUBLICATION, "relprojectid", projectId, fieldQueries);
224
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.PUBLICATION, offset, limit, format, request, false, null, fieldQueries);
225
    }
226

    
227
    @GET
228
    @Path("/api/projects/{projectId}/publications/count")
229
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
230
    public Response fetchProjectPublicationsCount(@PathParam("projectId") String projectId,
231
                                                  @QueryParam("format") final String format,
232
                                                  @QueryParam("fq") final List<String> fieldQueries,
233
                                                  @Context final HttpServletRequest request) {
234
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PUBLICATION, "relprojectid", projectId, fieldQueries);
235
        return getCount(request, fullQuery, format, fieldQueries);
236
    }
237

    
238
    @GET
239
    @Path("/api/projects/{projectId}/datasets")
240
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
241
    public Response fetchProjectDatasets(@PathParam("projectId") String projectId,
242
                                             @DefaultValue("0") @QueryParam("page") int offset,
243
                                             @DefaultValue("10") @QueryParam("size") int limit,
244
                                             @QueryParam("format") final String format,
245
                                             @QueryParam("fq") final List<String> fieldQueries,
246
                                             @Context HttpServletRequest request)  {
247

    
248
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASET, "relprojectid", projectId, fieldQueries);
249
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.DATASET, offset, limit, format, request, false, null, fieldQueries);
250
    }
251

    
252

    
253
    @GET
254
    @Path("/api/projects/{projectId}/datasets/count")
255
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
256
    public Response fetchProjectDatasetsCount(@PathParam("projectId") String projectId,
257
                                              @DefaultValue("0") @QueryParam("page") int offset,
258
                                              @DefaultValue("10") @QueryParam("size") int limit,
259
                                              @QueryParam("format") final String format,
260
                                              @QueryParam("fq") final List<String> fieldQueries,
261
                                              @Context HttpServletRequest request)  {
262
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASET, "relprojectid", projectId, fieldQueries);
263
        return getCount(request, fullQuery, format, fieldQueries);
264
    }
265

    
266

    
267

    
268
    @GET
269
    @Path("/api/projects/{projectId}/software/count")
270
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
271
    public Response fetchProjectSoftwareCount(@PathParam("projectId") String projectId,
272
                                              @DefaultValue("0") @QueryParam("page") int offset,
273
                                              @DefaultValue("10") @QueryParam("size") int limit,
274
                                              @QueryParam("format") final String format,
275
                                              @QueryParam("fq") final List<String> fieldQueries,
276
                                              @Context HttpServletRequest request)  {
277
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.SOFTWARE, "relprojectid", projectId, fieldQueries);
278
        return getCount(request, fullQuery, format, fieldQueries);
279
    }
280

    
281
    @GET
282
    @Path("/api/projects/{projectId}/software")
283
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
284
    public Response fetchProjectSoftware(@PathParam("projectId") String projectId,
285
                                         @DefaultValue("0") @QueryParam("page") int offset,
286
                                         @DefaultValue("10") @QueryParam("size") int limit,
287
                                         @QueryParam("format") final String format,
288
                                         @QueryParam("fq") final List<String> fieldQueries,
289
                                         @Context HttpServletRequest request)  {
290

    
291
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.SOFTWARE, "relprojectid", projectId, fieldQueries);
292
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.SOFTWARE, offset, limit, format, request, false, null, fieldQueries);
293
    }
294

    
295
    @GET
296
    @Path("/api/datasources")
297
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
298
    public Response fetchDatasources(@QueryParam("q") String keywords,
299
                                     @DefaultValue("0") @QueryParam("page") final int offset,
300
                                     @DefaultValue("10") @QueryParam("size") final int limit,
301
                                     @QueryParam("refine") @DefaultValue("false") final boolean refine,
302
                                     @QueryParam("fields") final List<String> fields,
303
                                     @QueryParam("fq") final List<String> fieldQueries,
304
                                     @QueryParam("format") final String format,
305
                                     @Context final HttpServletRequest request) {
306

    
307
        String simpleQuery = buildSearchRequest(RequestResponseHandler.Entity.DATASOURCE, keywords, fieldQueries);
308
        return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.DATASOURCE, offset, limit, format, request, refine, fields, fieldQueries);
309
    }
310

    
311
    @GET
312
    @Path("/api/datasources/count")
313
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
314
    public Response fetchDatasourcesCount(@QueryParam("q") String query,
315
                                          @QueryParam("format") final String format,
316
                                          @QueryParam("fq") final List<String> fieldQueries,
317
                                          @Context final HttpServletRequest request) {
318
        String fullQuery = buildSearchRequest(RequestResponseHandler.Entity.DATASOURCE, query, fieldQueries);
319
        return getCount(request, fullQuery, format, fieldQueries);
320
    }
321

    
322
    @GET
323
    @Path("/api/datasources/{datasourceid}")
324
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
325
    public Response fetchDatasources(@PathParam("datasourceid") String datasourceid,
326
                                     @QueryParam("format") final String format,
327
                                     @QueryParam("fq") final List<String> fieldQueries,
328
                                     @Context final HttpServletRequest request) {
329
        return getResponseByEntityId(request, RequestResponseHandler.Entity.DATASOURCE, datasourceid, format, fieldQueries);
330
    }
331

    
332

    
333
    @GET
334
    @Path("/api/organizations")
335
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
336
    public Response fetchOrganisations(@QueryParam("q") String keywords,
337
                                       @DefaultValue("0") @QueryParam("page") final int offset,
338
                                       @DefaultValue("10") @QueryParam("size") final int limit,
339
                                       @QueryParam("refine") @DefaultValue("false") final boolean refine,
340
                                       @QueryParam("fields") final List<String> fields,
341
                                       @QueryParam("fq") final List<String> fieldQueries,
342
                                       @QueryParam("format") final String format,
343
                                       @Context final HttpServletRequest request) {
344

    
345
        String simpleQuery = buildSearchRequest(RequestResponseHandler.Entity.ORGANIZATION, keywords, fieldQueries);
346
        return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.ORGANIZATION, offset, limit, format, request, refine, fields, fieldQueries);
347
    }
348

    
349

    
350
    @GET
351
    @Path("/api/organizations/count")
352
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
353
    public Response fetchOrganizationsCount(@QueryParam("q") String query,
354
                                            @QueryParam("format") final String format,
355
                                            @QueryParam("fq") final List<String> fieldQueries,
356
                                            @Context final HttpServletRequest request) {
357
        String fullQuery = buildSearchRequest(RequestResponseHandler.Entity.ORGANIZATION, query, fieldQueries);
358
        return getCount(request, fullQuery, format, fieldQueries);
359
    }
360

    
361
    @GET
362
    @Path("/api/organizations/{organizationid}")
363
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
364
    public Response fetchOrganizations(@PathParam("organizationid") String organizationid,
365
                                       @QueryParam("format") final String format,
366
                                       @QueryParam("fq") final List<String> fieldQueries,
367
                                       @Context final HttpServletRequest request) {
368
        return getResponseByEntityId(request, RequestResponseHandler.Entity.ORGANIZATION, organizationid, format, fieldQueries);
369
    }
370

    
371

    
372
    @GET
373
    @Path("/api/organizations/{organizationid}/datasources")
374
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
375
    public Response fetchOrganizationDatasources(@PathParam("organizationid") String organizationid,
376
                                                 @DefaultValue("0") @QueryParam("page") int offset,
377
                                                 @DefaultValue("10") @QueryParam("size") int limit,
378
                                                 @QueryParam("format") final String format,
379
                                                 @QueryParam("fq") final List<String> fieldQueries,
380
                                                 @Context HttpServletRequest request)  {
381
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASOURCE, "relorganizationid", organizationid, fieldQueries);
382
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.DATASOURCE, offset, limit, format, request, false, null, fieldQueries);
383
    }
384

    
385
    @GET
386
    @Path("/api/organizations/{organizationid}/datasources/count")
387
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
388
    public Response fetchOrganizationDatasources(@PathParam("organizationid") String organizationid,
389
                                                 @QueryParam("format") final String format,
390
                                                 @QueryParam("fq") final List<String> fieldQueries,
391
                                                 @Context final HttpServletRequest request) {
392
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASOURCE, "relorganizationid", organizationid, fieldQueries);
393
        return getCount(request, fullQuery, format, fieldQueries);
394
    }
395

    
396

    
397
    @GET
398
    @Path("/api/organizations/{organizationid}/publications")
399
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
400
    public Response fetchOrganizationPublications(@PathParam("organizationid") String organizationid,
401
                                              @DefaultValue("0") @QueryParam("page") int offset,
402
                                              @DefaultValue("10") @QueryParam("size") int limit,
403
                                              @QueryParam("format") final String format,
404
                                              @QueryParam("fq") final List<String> fieldQueries,
405
                                              @Context HttpServletRequest request)  {
406
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PUBLICATION, "relorganizationid", organizationid, fieldQueries);
407
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.PUBLICATION, offset, limit, format, request, false, null, fieldQueries);
408
    }
409

    
410
    @GET
411
    @Path("/api/organizations/{organizationid}/publications/count")
412
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
413
    public Response fetchOrganizationPublicationsCount(@PathParam("organizationid") String organizationid,
414
                                                  @DefaultValue("0") @QueryParam("page") int offset,
415
                                                  @DefaultValue("10") @QueryParam("size") int limit,
416
                                                  @QueryParam("format") final String format,
417
                                                  @QueryParam("fq") final List<String> fieldQueries,
418
                                                  @Context HttpServletRequest request)  {
419
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PUBLICATION, "relorganizationid", organizationid, fieldQueries);
420
        return getCount(request, fullQuery, format, fieldQueries);
421
    }
422

    
423
    @GET
424
    @Path("/api/organizations/{organizationid}/datasets")
425
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
426
    public Response fetchOrganizationDatsets(@PathParam("organizationid") String organizationid,
427
                                                  @DefaultValue("0") @QueryParam("page") int offset,
428
                                                  @DefaultValue("10") @QueryParam("size") int limit,
429
                                                  @QueryParam("format") final String format,
430
                                                  @QueryParam("fq") final List<String> fieldQueries,
431
                                                  @Context HttpServletRequest request)  {
432
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASET, "relorganizationid", organizationid, fieldQueries);
433
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.DATASET, offset, limit, format, request, false, null, fieldQueries);
434
    }
435

    
436
    @GET
437
    @Path("/api/organizations/{organizationid}/datasets/count")
438
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
439
    public Response fetchOrganizationDatsetsCount(@PathParam("organizationid") String organizationid,
440
                                             @DefaultValue("0") @QueryParam("page") int offset,
441
                                             @DefaultValue("10") @QueryParam("size") int limit,
442
                                             @QueryParam("format") final String format,
443
                                             @QueryParam("fq") final List<String> fieldQueries,
444
                                             @Context HttpServletRequest request)  {
445
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASET, "relorganizationid", organizationid, fieldQueries);
446
        return getCount(request, fullQuery, format, fieldQueries);
447
    }
448

    
449
    @GET
450
    @Path("/api/organizations/{organizationid}/projects")
451
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
452
    public Response fetchOrganizationProjects(@PathParam("organizationid") String organizationid,
453
                                                 @DefaultValue("0") @QueryParam("page") int offset,
454
                                                 @DefaultValue("10") @QueryParam("size") int limit,
455
                                                 @QueryParam("format") final String format,
456
                                                 @QueryParam("fq") final List<String> fieldQueries,
457
                                                 @Context HttpServletRequest request)  {
458
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PROJECT, "relorganizationid", organizationid, fieldQueries);
459
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.PROJECT, offset, limit, format, request, false, null, fieldQueries);
460
    }
461

    
462
    @GET
463
    @Path("/api/organizations/{organizationid}/projects/count")
464
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
465
    public Response fetchOrganizationProjectsCount(@PathParam("organizationid") String organizationid,
466
                                                   @QueryParam("format") final String format,
467
                                                   @QueryParam("fq") final List<String> fieldQueries,
468
                                                   @Context final HttpServletRequest request) {
469
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PROJECT, "relorganizationid", organizationid, fieldQueries);
470
        return getCount(request, fullQuery,format, fieldQueries);
471
    }
472

    
473

    
474

    
475
    @GET
476
    @Path("/api/people")
477
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
478
    public Response fetchPeople(@QueryParam("q") String keywords,
479
                                @DefaultValue("0") @QueryParam("page") final int offset,
480
                                @DefaultValue("10") @QueryParam("size") final int limit,
481
                                @QueryParam("refine") @DefaultValue("false") final boolean refine,
482
                                @QueryParam("fields") final List<String> fields,
483
                                @QueryParam("fq") final List<String> fieldQueries,
484
                                @QueryParam("format") final String format,
485
                                @Context final HttpServletRequest request) {
486

    
487
        String simpleQuery = buildSearchRequest(RequestResponseHandler.Entity.PERSON, keywords, fieldQueries);
488
        return getResponseByEntity(simpleQuery, RequestResponseHandler.Entity.PERSON, offset, limit, format, request, refine, fields, fieldQueries);
489
    }
490

    
491

    
492
    @GET
493
    @Path("/api/people/count")
494
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
495
    public Response fetchPeopleCount(@QueryParam("q") String query,
496
                                     @QueryParam("format") final String format,
497
                                     @QueryParam("fq") final List<String> fieldQueries,
498
                                     @Context final HttpServletRequest request) {
499
        String fullQuery = buildSearchRequest(RequestResponseHandler.Entity.PERSON, query, fieldQueries);
500
        return getCount(request, fullQuery, format, fieldQueries);
501
    }
502

    
503
    @GET
504
    @Path("/api/people/{personid}")
505
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
506
    public Response fetchPeople(@PathParam("personid") String personid,
507
                                @QueryParam("format") final String format,
508
                                @QueryParam("fq") final List<String> fieldQueries,
509
                                @Context final HttpServletRequest request) {
510
        return getResponseByEntityId(request, RequestResponseHandler.Entity.PERSON, personid, format, fieldQueries);
511
    }
512

    
513

    
514
    @GET
515
    @Path("/api/people/{personid}/publications")
516
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
517
    public Response fetchPeoplePublications(@PathParam("personid") String personid,
518
                                            @DefaultValue("0") @QueryParam("page") final int offset,
519
                                            @DefaultValue("10") @QueryParam("size") final int limit,
520
                                            @QueryParam("format") final String format,
521
                                            @QueryParam("fq") final List<String> fieldQueries,
522
                                            @Context final HttpServletRequest request) {
523
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PUBLICATION, "relpersonid", personid, fieldQueries);
524
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.PUBLICATION, offset, limit, format, request, false, null, fieldQueries);
525
    }
526

    
527
    @GET
528
    @Path("/api/people/{personid}/publications/count")
529
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
530
    public Response fetchPeoplePublicationsCount(@PathParam("personid") String personid,
531
                                                 @QueryParam("format") final String format,
532
                                                 @QueryParam("fq") final List<String> fieldQueries,
533
                                                 @Context final HttpServletRequest request) {
534
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.PUBLICATION, "relpersonid", personid, fieldQueries);
535
        return getCount(request, fullQuery, format, fieldQueries);
536
    }
537

    
538

    
539
    @GET
540
    @Path("/api/people/{personid}/datasets")
541
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
542
    public Response fetchPeopleDatasets(@PathParam("personid") String personid,
543
                                        @DefaultValue("0") @QueryParam("page") final int offset,
544
                                        @DefaultValue("10") @QueryParam("size") final int limit,
545
                                        @QueryParam("format") final String format,
546
                                        @QueryParam("fq") final List<String> fieldQueries,
547
                                        @Context final HttpServletRequest request) {
548
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASET, "relpersonid", personid, fieldQueries);
549
        return getResponseByEntity(fullQuery, RequestResponseHandler.Entity.DATASET, offset, limit, format, request, false, null, fieldQueries);
550
    }
551

    
552
    @GET
553
    @Path("/api/people/{personid}/datasets/count")
554
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
555
    public Response fetchPeopleDatasetsCount(@PathParam("personid") String personid,
556
                                             @QueryParam("format") final String format,
557
                                             @QueryParam("fq") final List<String> fieldQueries,
558
                                             @Context final HttpServletRequest request) {
559
        String fullQuery = builtEntity2EntityRelationQuery(RequestResponseHandler.Entity.DATASET, "relpersonid", personid, fieldQueries);
560
        return getCount(request, fullQuery, format, fieldQueries);
561
    }
562

    
563
    private String extractResponseFormat(String format) {
564
        if (format != null && !format.isEmpty()) {
565
            if (format.equalsIgnoreCase("json")) {
566
                return MediaType.APPLICATION_JSON;
567

    
568
            } else if (format.contains("csv")) {
569
                return new MediaType("text", "csv").toString();
570

    
571
            }  else if (format.equalsIgnoreCase("tsv")) {
572
                return new MediaType("text", "tsv").toString();
573

    
574
            } else if (format.equalsIgnoreCase("html")) {
575
                return MediaType.TEXT_HTML;
576
            }
577
        }
578

    
579
        return MediaType.APPLICATION_XML;
580
    }
581

    
582
    private boolean isSpecialFormat(String format) {
583
        if (format != null && format.toLowerCase().contains("special")) {
584
            return true;
585
        }
586
        return false;
587
    }
588

    
589
    private boolean hasTitle(String format) {
590
        if (format != null && format.toLowerCase().contains("notitle")) {
591
            return false;
592
        }
593
        return true;
594
    }
595

    
596
    //TODO differentiate for html + add special controls for format support
597
    private Transformer extractTransformer(String format, RequestResponseHandler.Entity entity) {
598
        logger.debug("Extracting transformer...." + format + "_" + entity);
599
        if (searchRegistry == null) { return  null;}
600

    
601
        if (format != null && (format.toLowerCase().contains("csv") || format.equalsIgnoreCase("html"))) {
602
            return searchRegistry.getTransformer(format.replaceAll("-notitle","") + "_" + entity, Locale.getDefault());
603

    
604
        }
605

    
606
        return null;
607
    }
608

    
609
    /* TODO: check if needed
610
    private String extractResponseType(String format) {
611
        return extractResponseFormat(format)+"; charset=UTF-8";
612
    }*/
613

    
614
    //TODO old way of creating query see if needed.
615
    /*private String buildSimpleSearchQuery(RequestResponseHandler.Entity entity, String keywords) {
616
        StringBuilder queryBuilder = new StringBuilder();
617
        enhanceQueryWithEntityType(queryBuilder, entity);
618
        builtQueryKeywords(queryBuilder, cleanKeywords(keywords));
619
        return queryBuilder.toString();
620
    }*/
621

    
622
    private String cleanKeywords(String keywords) {
623
        if (keywords != null) {
624
            return keywords.replaceAll("[\\\\/:*?<>|()]", "");
625
        }
626
        return keywords;
627
    }
628

    
629
    private String cleanId(String entityId) {
630
        return entityId.replaceAll("\"", "");
631
    }
632

    
633
    private String buildSearchRequest(RequestResponseHandler.Entity entity, String keywords, String doi, List<String> fieldQueries) {
634
        enhanceFieldQueryWithEntityType(entity, fieldQueries);
635

    
636
        StringBuilder queryBuilder = new StringBuilder();
637
        if (doi != null && !doi.trim().isEmpty()) {
638
            queryBuilder.append("(pidclassid exact \"doi\" and pid exact " + doi + ")");
639
        }
640

    
641
        builtQueryKeywords(queryBuilder, keywords);
642

    
643
        return queryBuilder.toString();
644
    }
645

    
646
    private String buildSearchRequest(RequestResponseHandler.Entity entity, String keywords, List<String> fieldQueries) {
647
        enhanceFieldQueryWithEntityType(entity, fieldQueries);
648

    
649
        StringBuilder queryBuilder = new StringBuilder();
650
        builtQueryKeywords(queryBuilder, keywords);
651

    
652
        return queryBuilder.toString();
653
    }
654

    
655
    private void enhanceFieldQueryWithEntityType(RequestResponseHandler.Entity entity, List<String> fieldQueries) {
656
        for (String fieldQuery: entity.getFieldQueries()) {
657
            logger.debug("adding " + fieldQuery);
658
            fieldQueries.add(fieldQuery);
659
        }
660
    }
661

    
662
/*    private void enhanceQueryWithKeywords(StringBuilder queryBuilder, String keywords) {
663
        if ( keywords!= null && !keywords.isEmpty()) {
664
            CQLQueryBuilder.appendKeywords(queryBuilder, keywords);
665

    
666
        } else {
667
            CQLQueryBuilder.appendQuery(queryBuilder, "*");
668
        }
669
    }
670
*/
671
    private void builtQueryKeywords(StringBuilder queryBuilder, String keywords) {
672
        if (keywords != null && !keywords.trim().isEmpty()) {
673
            CQLQueryBuilder.appendKeywords(queryBuilder, cleanKeywords(keywords));
674
        }
675

    
676
        if (queryBuilder.toString().isEmpty()) {
677
            queryBuilder.append("(*)");
678
        }
679
    }
680

    
681
    private void builtEntityIdQuery(StringBuilder queryBuilder, RequestResponseHandler.Entity entity, String entityId, List<String> fieldQueries){
682
        enhanceFieldQueryWithEntityType(entity, fieldQueries);
683
        enhanceQueryWithEntityId(queryBuilder, entity, cleanId(entityId));
684
    }
685

    
686
    private String builtEntity2EntityRelationQuery(RequestResponseHandler.Entity entity, String relationfield, String entityId, List<String> fieldQueries){
687
        StringBuilder queryBuilder = new StringBuilder();
688
        //enhanceQueryWithEntityType(queryBuilder, entity);
689
        enhanceFieldQueryWithEntityType(entity, fieldQueries);
690
        enhanceQueryWithRelationId(queryBuilder, relationfield, cleanId(entityId));
691
        return queryBuilder.toString();
692
    }
693

    
694
    private void enhanceQueryWithRelationId(StringBuilder queryBuilder, String relationfield, String entityId) {
695
        if (!queryBuilder.toString().isEmpty()) {
696
            CQLQueryBuilder.appendFieldTerm(queryBuilder, CQLQueryBuilder.Operator.AND, " " + relationfield + " ", CQLQueryBuilder.Operator.EXACT, entityId);
697

    
698
        } else {
699
            CQLQueryBuilder.appendFieldTerm(queryBuilder, CQLQueryBuilder.Operator.NONE, relationfield + " ", CQLQueryBuilder.Operator.EXACT, entityId);
700
        }
701
    }
702

    
703
/*
704
    private void enhanceQueryWithEntityType(StringBuilder queryBuilder, RequestResponseHandler.Entity entity) {
705
        queryBuilder.append(entity.getQueryPrefix());
706
    }
707
*/
708
    private void enhanceQueryWithEntityId(StringBuilder queryBuilder, RequestResponseHandler.Entity entity, String entityId) {
709
        if (queryBuilder.toString().isEmpty()) {
710
            CQLQueryBuilder.appendFieldTerm(queryBuilder, CQLQueryBuilder.Operator.NONE, "objidentifier", CQLQueryBuilder.Operator.EXACT, entityId);
711
        } else {
712
            CQLQueryBuilder.appendFieldTerm(queryBuilder, CQLQueryBuilder.Operator.AND, "objidentifier", CQLQueryBuilder.Operator.EXACT, entityId);
713
        }
714

    
715
        if (entity == RequestResponseHandler.Entity.PUBLICATION || entity == RequestResponseHandler.Entity.DATASET) {
716
            CQLQueryBuilder.appendFieldTerm(queryBuilder, CQLQueryBuilder.Operator.OR, "resultdupid", CQLQueryBuilder.Operator.EXACT, entityId);
717
        }
718

    
719
    }
720

    
721
/*    @Deprecated
722
    private String builtQueryByEntity(String query, RequestResponseHandler.Entity entity, List<String> fieldQueries) {
723
        StringBuilder queryBuilder = new StringBuilder();
724
        //enhanceQueryWithEntityType(queryBuilder, entity);
725
        enhanceFieldQueryWithEntityType(entity, fieldQueries);
726

    
727
        if (query != null && !query.trim().isEmpty()) {
728
            CQLQueryBuilder.appendSimpleTerm(queryBuilder, CQLQueryBuilder.Operator.AND, "(" + query + ")");
729
        }
730

    
731
        return queryBuilder.toString();
732
    }
733
*/
734
    private Response getCount(HttpServletRequest request, String query, String format, List<String> fieldQueries) {
735
        String responseFormat = extractResponseFormat(format);
736

    
737
        try {
738
            SearchResult searchResult = searchService.newSearch(query, Locale.getDefault().toString(), null, fieldQueries, 0, 0, responseFormat, null, null, false);
739
            return Response.status(Response.Status.OK).entity(APIResponseFormatter.createCountMeta(request, query, searchResult.getTotal(), responseFormat)).type(responseFormat).build();
740

    
741
        } catch (SearchServiceException sse) {
742
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(APIResponseFormatter.compose500Message(responseFormat, "Fail to fetch count for query " + query + ".", sse.getMessage())).build();
743
        }
744
    }
745

    
746
    private Response getResponseByEntityId(HttpServletRequest request, RequestResponseHandler.Entity entity, String entityId, String format, List<String> fieldQueries) {
747
        String responseType = extractResponseFormat(format);
748
        
749
        try {
750
            StringBuilder queryBuilder = new StringBuilder();
751
            builtEntityIdQuery(queryBuilder, entity, entityId, fieldQueries);
752
            String fullQuery = queryBuilder.toString();
753

    
754
            if(fullQuery == null || fullQuery.isEmpty()) {
755
                return Response.status(Response.Status.BAD_REQUEST).
756
                        entity(APIResponseFormatter.compose400Message(format, "The 'query' parameter is required")).
757
                        type(responseType).build();
758
            }
759

    
760
            SearchResult searchResult = searchService.newSearch(fullQuery, Locale.getDefault().toString(), null, fieldQueries, 0, 1, responseType, null, null, false);
761

    
762
            if (searchResult.getSearchResults() == null || searchResult.getSearchResults().isEmpty() ||
763
                    searchResult.getSearchResults().size() == 0 || searchResult.getSearchResults().get(0) == null) {
764
                return Response.status(Response.Status.NOT_FOUND).entity(APIResponseFormatter.compose404Message(responseType, "404 - " + entity +" with id "
765
                                + entityId + " not found.")).type(responseType).build();
766
            }
767

    
768
            return Response.status(Response.Status.OK).entity(APIResponseFormatter.createEntityResponse(request, entity, searchResult.getSearchResults().get(0).toString(), responseType)).type(responseType).build();
769

    
770
        } catch (SearchServiceException sse) {
771
            logger.error("Fail to fetch "+ entity + " with id " + entityId, sse);
772
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(APIResponseFormatter.compose500Message(responseType, "Fail to fetch " + entity + " with id " + entityId, sse.getMessage())).build();
773
        }
774
    }
775

    
776
    private Response getResponseByEntity(String fullQuery, RequestResponseHandler.Entity entity, int offset, int limit, String format, HttpServletRequest request, boolean refine, List<String> refineFields, List<String> fieldQueries) {
777
        Transformer transformer = extractTransformer(format, entity);
778
        boolean special = isSpecialFormat(format);
779
        boolean hasTitle = hasTitle(format);
780
        String responseType = extractResponseFormat(format);
781

    
782
        if(fullQuery == null || fullQuery.isEmpty()) {
783
            return Response.status(Response.Status.BAD_REQUEST).
784
                    entity(APIResponseFormatter.compose400Message(responseType, "The 'query' parameter is required")).
785
                    type(responseType).build();
786
        }
787

    
788
        try {
789
            SearchResult solrResults = searchService.newSearch(fullQuery, Locale.getDefault().toString(), refineFields, fieldQueries, offset, limit, responseType, transformer, null, false);
790
            return Response.status(Response.Status.OK).entity(APIResponseFormatter.createEntitiesResponse(request, entity, fullQuery, fieldQueries, solrResults, refine, responseType, special, hasTitle)).type(responseType).build();
791

    
792
        } catch (SearchServiceException sse) {
793
            logger.error("Fail to get " + entity.getPlural() , sse);
794
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
795
                    entity(APIResponseFormatter.compose500Message(responseType, "Fail to fetch " + entity.getPlural(), sse.getMessage())).type(responseType).build();
796
        }
797
    }
798

    
799
    private RequestResponseHandler.Entity extractEntity(String type) {
800

    
801
        if (type == null) {
802
            return RequestResponseHandler.Entity.NONE;
803
        }
804

    
805
        if (type.equalsIgnoreCase(RequestResponseHandler.Entity.PUBLICATION.getPlural())) {
806
            return RequestResponseHandler.Entity.PUBLICATION;
807

    
808
        } else if (type.equalsIgnoreCase(RequestResponseHandler.Entity.DATASET.getPlural())) {
809
            return RequestResponseHandler.Entity.DATASET;
810

    
811
        } else if (type.equalsIgnoreCase(RequestResponseHandler.Entity.PROJECT.getPlural())) {
812
            return RequestResponseHandler.Entity.PROJECT;
813

    
814
        } else if (type.equalsIgnoreCase(RequestResponseHandler.Entity.DATASOURCE.getPlural())) {
815
            return RequestResponseHandler.Entity.DATASOURCE;
816

    
817
        } else if (type.equalsIgnoreCase(RequestResponseHandler.Entity.PERSON.getPlural())) {
818
            return RequestResponseHandler.Entity.PERSON;
819

    
820
        } else if (type.equalsIgnoreCase(RequestResponseHandler.Entity.ORGANIZATION.getPlural())) {
821
            return RequestResponseHandler.Entity.ORGANIZATION;
822
        }
823

    
824
        return RequestResponseHandler.Entity.NONE;
825
    }
826

    
827

    
828
    /*
829
    public static void main(String[] args) {
830
        String json = " {\"result\":{\"xmlns:oaf\":\"http://namespace.openaire.eu/oaf\",\"xmlns:xsi\":\"http://www.w3.o" +
831
                "rg/2001/XMLSchema-instance\",\"header\":{\"dri:dateOfCollection\":\"2016-05-20T03:34:07Z\",\"dri:dateOfTransformation\":\"\",\"counters\":{\"counter_dedup\":{\"value\":2},\"counter_doi\":{\"value\":2},\"counter_authorship\":{\"va" +
832
                "lue\":1},\"counter_authorship_inferred\":{\"value\":1}},\"dri:objIdentifier\":\"dedup_wf_001::0f5604702b32f59d9789573113279e69\"},\"metadata\":{\"oaf:entity\":{\"oaf:result\":{\"datainfo\":{\"provenanceaction\":{\"schemename\"" +
833
                ":\"dnet:provenanceActions\",\"classname\":\"sysimport:dedup\",\"schemeid\":\"dnet:provenanceActions\",\"classid\":\"sysimport:dedup\"},\"trust\":0.9,\"inferenceprovenance\":\"dedup-similarity-result\",\"deletedbyinference\":fal" +
834
                "se,\"inferred\":true},\"rels\":{\"rel\":{\"to\":{\"content\":\"dedup_wf_001::884d8c367553a8de98ec90ece1b1be4a\",\"scheme\":\"dnet:person_result_relations\",\"class\":\"hasAuthor\",\"type\":\"person\"},\"provenanceaction\":\"sysimpor" +
835
                "t:crosswalk:repository\",\"trust\":0.9,\"inferenceprovenance\":\"\",\"ranking\":1,\"inferred\":true,\"fullname\":\"Krafft, Alexander\"}},\"subject\":[{\"content\":\"Clinic for Obstetrics\",\"schemename\":\"dnet:result_subject\",\"c" +
836
                "lassname\":\"keyword\",\"schemeid\":\"dnet:result_subject\",\"classid\":\"keyword\"},{\"content\":\"610 Medicine & health\",\"schemename\":\"dnet:result_subject\",\"classname\":\"keyword\",\"schemeid\":\"dnet:result_subject\",\"class" +
837
                "id\":\"keyword\"},{\"content\":\"News\",\"schemename\":\"dnet:result_subject\",\"classname\":\"keyword\",\"schemeid\":\"dnet:result_subject\",\"classid\":\"keyword\"}],\"collectedfrom\":[{\"id\":\"opendoar____::0efe32849d230d7f53049d" +
838
                "dc4a4b0c60\",\"name\":\"Zurich Open Repository and Archive\"},{\"id\":\"opendoar____::8b6dd7db9af49e67306feb59a8bdc52c\",\"name\":\"Europe PubMed Central\"}],\"children\":{\"result\":[{\"title\":{\"content\":\"Iron supplementat" +
839
                "ion in pregnancy\",\"schemename\":\"dnet:dataCite_title\",\"classname\":\"main title\",\"schemeid\":\"dnet:dataCite_title\",\"classid\":\"main title\"},\"resulttype\":{\"schemename\":\"dnet:result_typologies\",\"classname\":\"publi" +
840
                "cation\",\"schemeid\":\"dnet:result_typologies\",\"classid\":\"publication\"},\"dateofacceptance\":\"1981-09-01\",\"objidentifier\":\"od_______908::f27f9e68f0b9f510ebf572ba295344e1\"},{\"title\":{\"content\":\"Iron supplementat" +
841
                "ion in pregnancy\",\"schemename\":\"dnet:dataCite_title\",\"classname\":\"main title\",\"schemeid\":\"dnet:dataCite_title\",\"classid\":\"main title\"},\"resulttype\":{\"schemename\":\"dnet:result_typologies\",\"classname\":\"publi" +
842
                "cation\",\"schemeid\":\"dnet:result_typologies\",\"classid\":\"publication\"},\"dateofacceptance\":\"2013-01-01\",\"publisher\":\"BMJ Publishing Group\",\"objidentifier\":\"od_______885::0f5604702b32f59d9789573113279e69\"}],\"i" +
843
                "nstance\":[{\"webresource\":{\"url\":\"http://europepmc.org/articles/PMC2306130\"},\"id\":\"opendoar____::8b6dd7db9af49e67306feb59a8bdc52c\",\"licence\":{\"schemename\":\"dnet:access_modes\",\"classname\":\"Open Access\",\"sche" +
844
                "meid\":\"dnet:access_modes\",\"classid\":\"OPEN\"},\"hostedby\":{\"id\":\"opendoar____::8b6dd7db9af49e67306feb59a8bdc52c\",\"name\":\"Europe PubMed Central\"},\"instancetype\":{\"schemename\":\"dnet:publication_resource\",\"class" +
845
                "name\":\"Article\",\"schemeid\":\"dnet:publication_resource\",\"classid\":\"0001\"}},{\"webresource\":{\"url\":\"http://www.zora.uzh.ch/87059/1/30_13_Krafft_2013bmj_f4399_full.pdf\"},\"id\":\"opendoar____::0efe32849d230d7f530" +
846
                "49ddc4a4b0c60\",\"licence\":{\"schemename\":\"dnet:access_modes\",\"classname\":\"Open Access\",\"schemeid\":\"dnet:access_modes\",\"classid\":\"OPEN\"},\"hostedby\":{\"id\":\"opendoar____::0efe32849d230d7f53049ddc4a4b0c60\",\"name" +
847
                "\":\"Zurich Open Repository and Archive\"},\"instancetype\":{\"schemename\":\"dnet:publication_resource\",\"classname\":\"Article\",\"schemeid\":\"dnet:publication_resource\",\"classid\":\"0001\"}}]},\"pid\":[{\"content\":\"10.5167" +
848
                "/uzh-87059\",\"schemename\":\"dnet:pid_types\",\"classname\":\"doi\",\"schemeid\":\"dnet:pid_types\",\"classid\":\"doi\"},{\"content\":\"PMC2306130\",\"schemename\":\"dnet:pid_types\",\"classname\":\"pmc\",\"schemeid\":\"dnet:pid_types\"," +
849
                "\"classid\":\"pmc\"},{\"content\":\"10.1136/bmj.f4399\",\"schemename\":\"dnet:pid_types\",\"classname\":\"doi\",\"schemeid\":\"dnet:pid_types\",\"classid\":\"doi\"}],\"resourcetype\":{\"schemename\":\"\",\"classname\":\"\",\"schemeid\":\"\",\"c" +
850
                "lassid\":\"\"},\"format\":\"\",\"dateofacceptance\":\"2013-01-01\",\"embargoenddate\":\"\",\"version\":\"\",\"size\":\"\",\"publisher\":\"BMJ Publishing Group\",\"country\":{\"schemename\":\"\",\"classname\":\"\",\"schemeid\":\"\",\"classid\":\"\"},\"" +
851
                "metadataversionnumber\":\"\",\"title\":{\"content\":\"Iron supplementation in pregnancy\",\"schemename\":\"dnet:dataCite_title\",\"classname\":\"main title\",\"schemeid\":\"dnet:dataCite_title\",\"classid\":\"main title\"},\"result" +
852
                "type\":{\"schemename\":\"dnet:result_typologies\",\"classname\":\"publication\",\"schemeid\":\"dnet:result_typologies\",\"classid\":\"publication\"},\"source\":\"Krafft, Alexander (2013). Iron supplementation in pregnancy. Br" +
853
                "itish Medical Journal, 347:f4399.\",\"contributor\":\"\",\"description\":\"\",\"originalId\":[\"oai:europepmc.org:1052305\",\"oai:www.zora.uzh.ch:87059\"],\"lastmetadataupdate\":\"\",\"relevantdate\":{\"schemename\":\"\",\"classnam" +
854
                "e\":\"\",\"schemeid\":\"\",\"classid\":\"\"},\"device\":\"\",\"bestlicense\":{\"schemename\":\"dnet:access_modes\",\"classname\":\"Open Access\",\"schemeid\":\"dnet:access_modes\",\"classid\":\"OPEN\"},\"language\":{\"schemename\":\"dnet:langu" +
855
                "ages\",\"classname\":\"English\",\"schemeid\":\"dnet:languages\",\"classid\":\"eng\"},\"storagedate\":\"\",\"fulltext\":\"\"},\"xsi:schemaLocation\":\"http://namespace.openaire.eu/oaf https://www.openaire.eu/schema/0.2/oaf-0.2.xs" +
856
                "d\"}},\"xmlns:dri\":\"http://www.driver-repository.eu/namespace/dri\"}}";
857

    
858
        String s = "{\"result\":{\"xmlns:oaf\":\"http://namespace.openaire.eu/oaf\",\"xmlns:xsi\":\"http://www.w3.org/2001" +
859
                "/XMLSchema-instance\",\"header\":{\"dri:dateOfCollection\":\"2014-04-10T13:35:33Z\",\"dri:dateOfTransformation\":\"\",\"counters\":{\"counter_dedup\":{\"value\":2},\"counter_authorship\":{\"value\":1},\"counter_authorship_infer" +
860
                "red\":{\"value\":1}},\"dri:objIdentifier\":\"dedup_wf_001::4d934888dee33a62dece6fa36192c710\"},\"metadata\":{\"oaf:entity\":{\"oaf:result\":{\"datainfo\":{\"provenanceaction\":{\"schemename\":\"dnet:provenanceActions\",\"classn" +
861
                "ame\":\"sysimport:dedup\",\"schemeid\":\"dnet:provenanceActions\",\"classid\":\"sysimport:dedup\"},\"trust\":0.9,\"inferenceprovenance\":\"dedup-similarity-result\",\"deletedbyinference\":false,\"inferred\":true},\"rels\":{\"rel\"" +
862
                ":{\"to\":{\"content\":\"od______1232::d4f9cea02c7762da24cd71ea0b9791de\",\"scheme\":\"dnet:person_result_relations\",\"class\":\"hasAuthor\",\"type\":\"person\"},\"provenanceaction\":\"sysimport:crosswalk:repository\",\"trust\":0" +
863
                ".9,\"inferenceprovenance\":\"\",\"ranking\":1,\"inferred\":true,\"fullname\":\"Anonymous\"}},\"subject\":{\"content\":\"Señoríos-Legislación\",\"schemename\":\"dnet:result_subject\",\"classname\":\"keyword\",\"schemeid\":\"dnet:result" +
864
                "_subject\",\"classid\":\"keyword\"},\"collectedfrom\":[{\"id\":\"opendoar____::e53a0a2978c28872a4505bdb51db06dc\",\"name\":\"Biblioteca Virtual del Patrimonio Bibliográfico (Virtual Library of Bibliographical Heritage)\"" +
865
                "},{\"id\":\"opendoar____::7aee26c309def8c5a2a076eb250b8f36\",\"name\":\"Biblioteca Virtual de Aragón\"}],\"children\":{\"result\":[{\"title\":{\"content\":\"Discurso sobre los señoríos : necesidad y justicia del decreto de" +
866
                " Cortes de 6 de Agosto de 1811 y ventaja que debe causar a la Nación\",\"schemename\":\"dnet:dataCite_title\",\"classname\":\"main title\",\"schemeid\":\"dnet:dataCite_title\",\"classid\":\"main title\"},\"resulttype\":{\"sch" +
867
                "emename\":\"dnet:result_typologies\",\"classname\":\"publication\",\"schemeid\":\"dnet:result_typologies\",\"classid\":\"publication\"},\"dateofacceptance\":\"1820-01-01\",\"objidentifier\":\"od______2719::bc2326a31763719dc5ebd" +
868
                "38f16a25404\"},{\"title\":{\"content\":\"Discurso sobre los señoríos : necesidad y justicia del decreto de Cortes de 6 de Agosto de 1811 y ventaja que debe causar a la Nación\",\"schemename\":\"dnet:dataCite_title\"," +
869
                "\"classname\":\"main title\",\"schemeid\":\"dnet:dataCite_title\",\"classid\":\"main title\"},\"resulttype\":{\"schemename\":\"dnet:result_typologies\",\"classname\":\"publication\",\"schemeid\":\"dnet:result_typologies\",\"classid\"" +
870
                ":\"publication\"},\"dateofacceptance\":\"1820-01-01\",\"objidentifier\":\"od______1232::4d934888dee33a62dece6fa36192c710\"}],\"instance\":[{\"webresource\":[{\"url\":\"http://bvpb.mcu.es/es/consulta/registro.cmd?id=403864\"" +
871
                "},{\"url\":\"http://bvpb.mcu.es/es/catalogo_imagenes/grupo.cmd?path=2755\"}],\"id\":\"opendoar____::e53a0a2978c28872a4505bdb51db06dc\",\"licence\":{\"schemename\":\"dnet:access_modes\",\"classname\":\"Open Access\",\"schemei" +
872
                "d\":\"dnet:access_modes\",\"classid\":\"OPEN\"},\"hostedby\":{\"id\":\"opendoar____::e53a0a2978c28872a4505bdb51db06dc\",\"name\":\"Biblioteca Virtual del Patrimonio Bibliográfico (Virtual Library of Bibliographical Herita" +
873
                "ge)\"},\"instancetype\":{\"schemename\":\"dnet:publication_resource\",\"classname\":\"Book\",\"schemeid\":\"dnet:publication_resource\",\"classid\":\"0002\"}},{\"webresource\":{\"url\":\"http://bibliotecavirtual.aragon.es/bva/i18" +
874
                "n/consulta/registro.cmd?id=2878\"},\"id\":\"opendoar____::7aee26c309def8c5a2a076eb250b8f36\",\"licence\":{\"schemename\":\"dnet:access_modes\",\"classname\":\"Open Access\",\"schemeid\":\"dnet:access_modes\",\"classid\":\"OPEN\"" +
875
                "},\"hostedby\":{\"id\":\"opendoar____::7aee26c309def8c5a2a076eb250b8f36\",\"name\":\"Biblioteca Virtual de Aragón\"},\"instancetype\":{\"schemename\":\"dnet:publication_resource\",\"classname\":\"Book\",\"schemeid\":\"dnet:publi" +
876
                "cation_resource\",\"classid\":\"0002\"}}]},\"pid\":{\"schemename\":\"\",\"classname\":\"\",\"schemeid\":\"\",\"classid\":\"\"},\"resourcetype\":{\"schemename\":\"\",\"classname\":\"\",\"schemeid\":\"\",\"classid\":\"\"},\"format\":\"\",\"dateofaccepta" +
877
                "nce\":\"1820-01-01\",\"embargoenddate\":\"\",\"version\":\"\",\"size\":\"\",\"country\":{\"schemename\":\"\",\"classname\":\"\",\"schemeid\":\"\",\"classid\":\"\"},\"publisher\":\"\",\"metadataversionnumber\":\"\",\"title\":{\"content\":\"Discurso sob" +
878
                "re los señoríos : necesidad y justicia del decreto de Cortes de 6 de Agosto de 1811 y ventaja que debe causar a la Nación\",\"schemename\":\"dnet:dataCite_title\",\"classname\":\"main title\",\"schemeid\":\"dnet:dataC" +
879
                "ite_title\",\"classid\":\"main title\"},\"resulttype\":{\"schemename\":\"dnet:result_typologies\",\"classname\":\"publication\",\"schemeid\":\"dnet:result_typologies\",\"classid\":\"publication\"},\"source\":\"\",\"contributor\":\"Impr" +
880
                "enta de Heras, imp.\",\"description\":\"\",\"originalId\":[\"oai:bvpb.mcu.es:403864\",\"oai:bibliotecavirtual.aragon.es:2878\"],\"lastmetadataupdate\":\"\",\"relevantdate\":{\"schemename\":\"\",\"classname\":\"\",\"schemeid\":\"\",\"cl" +
881
                "assid\":\"\"},\"device\":\"\",\"bestlicense\":{\"schemename\":\"dnet:access_modes\",\"classname\":\"Open Access\",\"schemeid\":\"dnet:access_modes\",\"classid\":\"OPEN\"},\"language\":{\"schemename\":\"dnet:languages\",\"classname\":\"Span" +
882
                "ish\",\"schemeid\":\"dnet:languages\",\"classid\":\"esl/spa\"},\"storagedate\":\"\",\"fulltext\":\"\"},\"xsi:schemaLocation\":\"http://namespace.openaire.eu/oaf https://www.openaire.eu/schema/0.2/oaf-0.2.xsd\"}},\"xmlns:dri\":\"h" +
883
                "ttp://www.driver-repository.eu/namespace/dri\"}}\n";
884

    
885
        JSONObject finalOject = new JSONObject();
886
        finalOject.put("dri:objIdentifier", new JSONObject(json).getJSONObject("result").getJSONObject("header").getString("dri:objIdentifier"));
887
        finalOject.put("content", new JSONObject(new JSONObject(json).getJSONObject("result").getJSONObject("metadata").getJSONObject("oaf:entity").getJSONObject("oaf:result"),
888
                new String[]{"title", "description", "language", "bestlicense", "pid", "rels"}));
889

    
890
        System.out.println(finalOject);
891

    
892
        JSONObject jsonObject = new JSONObject(s).getJSONObject("result").getJSONObject("metadata").getJSONObject("oaf:entity").getJSONObject("oaf:result");
893
        System.out.println("title --> " + jsonObject.getJSONObject("title").getString("content"));
894
        System.out.println("pid --> " + jsonObject.getJSONArray("pid"));
895

    
896
        JSONObject newJsonObject1 = new JSONObject(jsonObject, new String[]{"title", "description", "language", "bestlicense", "pid", "rels"});
897

    
898
    }
899
*/
900
    /*
901

    
902
    public static void main(String[] args) throws IOException, CQLParseException {
903
        CqlTranslator translator = new CqlTranslatorImpl();
904
        System.out.println(translator.toLucene("relfundinglevel0_id = ec__________::EC::FP7"));
905
    }
906
    */
907

    
908
}
(5-5/8)