Project

General

Profile

1
package eu.dnetlib.data.claims.handler;
2

    
3
import eu.dnetlib.data.claims.utils.JsonldBuilder;
4
import eu.dnetlib.data.claims.entity.*;
5
import eu.dnetlib.data.claims.utils.ClaimUtils;
6
import eu.dnetlib.data.claims.utils.QueryGenerator;
7
import eu.dnetlib.data.claims.sql.SQLStoreException;
8
import eu.dnetlib.data.claims.sql.SqlDAO;
9
import org.apache.log4j.Logger;
10

    
11
import java.sql.ResultSet;
12
import java.sql.SQLException;
13
import java.text.DateFormat;
14
import java.text.SimpleDateFormat;
15
import java.util.ArrayList;
16
import java.util.Date;
17
import java.util.List;
18

    
19
/**
20
 * Created by argirok on 9/3/2016.
21
 */
22
public class FetchClaimHandler {
23
    private Logger log = Logger.getLogger(this.getClass());
24

    
25
    SqlDAO sqlDAO = null;
26
    QueryGenerator queryGenerator = null;
27

    
28
    public FetchClaimHandler(){
29
//        ApplicationContext context = new ClassPathXmlApplicationContext("../claims/migration/springContext-claims.xml");
30
//        sqlDAO = context.getBean(SqlDAO.class);
31

    
32
    }
33

    
34
    public String claims2JSON(List<Claim> claims) throws Exception {
35
        return JsonldBuilder.toJsonld(claims);
36
    }
37
    public String claim2JSON(Claim claim) throws Exception {
38
        return JsonldBuilder.toJsonld(claim);
39
    }
40

    
41
    /**
42
     *
43
     * @param user - user e-mail stored in claims DB
44
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
45
     * @param offset returns claims after 'offset' position (null for no offset)
46
     * @return
47
     * @throws Exception
48
     */
49
    public List<Claim> fetchClaimsByUser(String user, Integer limit, Integer offset, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
50
        return fetchClaimsByUser(user,limit,offset,null,"claim.claim_date",true, types, addCurationInfo);
51
    }
52
    /**
53
     *
54
     * @param user - user e-mail stored in claims DB
55
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
56
     * @param offset returns claims after 'offset' position (null for no offset)
57
     * @param keyword filters in specific fields per type (result: {title,doi},project: {name.acronym. funder_name, funder_acronym}, context: {name})
58
     * @param orderField
59
     * @param descending
60
     * @return
61
     * @throws Exception
62
     */
63
    public List<Claim> fetchClaimsByUser(String user, Integer limit, Integer offset,String keyword,String orderField,boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
64
        log.info("Fetching claims for user"+user);
65
        ArrayList<Object> params = new ArrayList<>();
66
        String query = queryGenerator.generateFetchClaimsByUser(user, limit, offset,keyword,orderField,descending, types, params);
67
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
68
        return fetchClaimsByResultSet(rs, addCurationInfo);
69
    }
70
    /**
71
     *
72
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
73
     * @param offset returns claims after 'offset' position (null for no offset)
74
     * @return
75
     * @throws Exception
76
     */
77
    public List<Claim> fetchAllClaims( Integer limit, Integer offset, boolean addCurationInfo) throws Exception, SQLStoreException {
78
        log.info("Fetching all claims");
79
         return fetchAllClaims(limit,offset,null,"claim.claim_date",true,new ArrayList<String>(), addCurationInfo);
80
    }
81

    
82
    /**
83
     *
84
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
85
     * @param offset returns claims after 'offset' position (null for no offset)
86
     * @param keyword  filters in specific fields per type (result: {title,doi},project: {name.acronym. funder_name, funder_acronym}, context: {name})
87
     * @param orderField
88
     * @param descending
89
     * @return
90
     * @throws Exception
91
     */
92
    public List<Claim> fetchAllClaims( Integer limit, Integer offset, String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
93
        log.info("Fetching all claims");
94
        ArrayList<Object> params = new ArrayList<>();
95
        String query = queryGenerator.generateFetchClaims(limit, offset,keyword,orderField,descending,types, params);
96
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
97
        return fetchClaimsByResultSet(rs, addCurationInfo);
98
    }
99

    
100
    /**
101
     *
102
     * @param dateFrom
103
     * @param dataTo
104
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
105
     * @param offset returns claims after 'offset' position (null for no offset)
106
     * @return
107
     * @throws Exception
108
     */
109
    public List<Claim> fetchClaimsByDate(String dateFrom, String dataTo, Integer limit, Integer offset, boolean addCurationInfo) throws Exception, SQLStoreException {
110
         return fetchClaimsByDate(dateFrom, dataTo, limit, offset, null, "claim.claim_date",true, new ArrayList<String>(),addCurationInfo);
111
    }
112
    /**
113
     *
114
     * @param dateFrom
115
     * @param dataTo
116
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
117
     * @param offset returns claims after 'offset' position (null for no offset)
118
     * @return
119
     * @throws Exception
120
     */
121
    public List<Claim> fetchClaimsByDate(String dateFrom, String dataTo, Integer limit, Integer offset, String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
122
        ArrayList<Object> params = new ArrayList<>();
123
        String query = queryGenerator.generateFetchClaimsByDate(dateFrom, dataTo, limit, offset,keyword, orderField, descending,types, params);
124
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
125
        return fetchClaimsByResultSet(rs, addCurationInfo);
126
    }
127

    
128
    public List<Claim> fetchClaimsByDateForDashboards(String dateFrom, String dataTo, Integer limit, Integer offset, boolean addCurationInfo, ArrayList<String> dashboards) throws Exception, SQLStoreException {
129
        ArrayList<Object> params = new ArrayList<>();
130
        String query = queryGenerator.generateFetchClaimsByDateForDashboards(dateFrom, dataTo, limit, offset,null, "claim.claim_date", true,new ArrayList<String>(), params, dashboards);
131
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
132
        return fetchClaimsByResultSet(rs, addCurationInfo);
133
    }
134
    /**
135
     *
136
     * @param dateFrom
137
     * @param dataTo
138
     * @param openaireId for project
139
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
140
     * @param offset returns claims after 'offset' position (null for no offset)
141
     * @return
142
     * @throws Exception
143
     */
144
    public int fetchNumberOfClaimsByDateAndOpenaireId(String dateFrom, String dataTo, String openaireId, Integer limit, Integer offset, String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
145
        ArrayList<Object> params = new ArrayList<>();
146
        String query = queryGenerator.generateFetchNumberOfClaimsByDateAndOpenaireId(dateFrom, dataTo, openaireId, limit, offset,keyword, orderField, descending,types, params);
147
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
148
        return countClaimsByResultSet(rs);
149
    }
150

    
151
    /**
152
     *
153
     * @param openaireId for project
154
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
155
     * @param offset returns claims after 'offset' position (null for no offset)
156
     * @return
157
     * @throws Exception
158
     */
159
    public List<Claim> fetchClaimsByProject(String openaireId, Integer limit, Integer offset, boolean addCurationInfo) throws Exception, SQLStoreException {
160

    
161
        return fetchClaimsByProject(openaireId,limit, offset, null, "claim.claim_date",true, new ArrayList<String>(), addCurationInfo);
162
    }
163
    /**
164
     *
165
     * @param openaireId for project
166
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
167
     * @param offset returns claims after 'offset' position (null for no offset)
168
     * @param orderField
169
     * @param descending
170
     * @return
171
     * @throws Exception
172
     */
173
    public List<Claim> fetchClaimsByProject(String openaireId, Integer limit, Integer offset, String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
174
        log.info("Fetching claims by project ID:"+openaireId);
175
        ArrayList<Object> params = new ArrayList<>();
176
        String query = queryGenerator.generateFetchClaimsByProject(openaireId, limit, offset, keyword, orderField,descending,types, params);
177
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
178
        return fetchClaimsByResultSet(rs, addCurationInfo);
179
    }
180
    /**
181
     *
182
     * @param openaireId of Funder
183
     * @param limit
184
     * @param offset
185
     * @return
186
     * @throws Exception
187
     */
188
    public List<Claim> fetchClaimsByFunder(String openaireId, Integer limit, Integer offset, boolean addCurationInfo) throws Exception, SQLStoreException {
189
         return fetchClaimsByFunder(openaireId,limit,offset,null,"claim.claim_date",true, new ArrayList<String>(), addCurationInfo);
190
    }
191
    /**
192
     *
193
     * @param openaireId of Funder
194
     * @param limit
195
     * @param offset
196
     * @param orderField
197
     * @param descending
198
     * @return
199
     * @throws Exception
200
     */
201
    public List<Claim> fetchClaimsByFunder(String openaireId, Integer limit, Integer offset,String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
202
        ArrayList<Object> params = new ArrayList<>();
203
        String query = queryGenerator.generateFetchClaimsByFunder(openaireId, limit, offset,keyword, orderField,descending,types, params);
204
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
205
        return fetchClaimsByResultSet(rs, addCurationInfo);
206
    }
207
    /**
208
     *
209
     * @param openaireId for result
210
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
211
     * @param offset returns claims after 'offset' position (null for no offset)
212
     * @return
213
     * @throws Exception
214
     */
215
    public List<Claim> fetchClaimsByResult(String openaireId, Integer limit, Integer offset, boolean addCurationInfo) throws Exception, SQLStoreException {
216
         return fetchClaimsByResult(openaireId,limit,offset,null, "claim.claim_date",true, new ArrayList<String>(), addCurationInfo);
217
    }
218
    /**
219
     *
220
     * @param openaireId for result
221
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
222
     * @param offset returns claims after 'offset' position (null for no offset)
223
     * @param orderField
224
     * @param descending
225
     * @return
226
     * @throws Exception
227
     */
228
    public List<Claim> fetchClaimsByResult(String openaireId, Integer limit, Integer offset,String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
229
        log.info("Fetching claims by result ID:"+openaireId);
230
        ArrayList<Object> params = new ArrayList<>();
231
        String query = queryGenerator.generateFetchClaimsByResult(openaireId, limit, offset,keyword, orderField, descending,types, params);
232
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
233
        return fetchClaimsByResultSet(rs, addCurationInfo);
234
    }
235
    /**
236
     *
237
     * @param openaireId
238
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
239
     * @param offset returns claims after 'offset' position (null for no offset)
240
     * @return
241
     * @throws Exception
242
     */
243
    public List<Claim> fetchClaimsByContext(String openaireId, Integer limit, Integer offset, boolean addCurationInfo) throws Exception, SQLStoreException {
244
         return fetchClaimsByContext(openaireId,limit,offset,null,"claim.claim_date",true, new ArrayList<String>(), addCurationInfo);
245
    }
246
    /**
247
     *
248
     * @param openaireId
249
     * @param limit returns at most 'limit' claims  (use -1 or null for no limit)
250
     * @param offset returns claims after 'offset' position (null for no offset)
251
     * @param orderField
252
     * @param descending
253
     * @return
254
     * @throws Exception
255
     */
256
    public List<Claim> fetchClaimsByContext(String openaireId, Integer limit, Integer offset, String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception, SQLStoreException {
257
        log.info("Fetching claims by context ID:"+openaireId);
258
        ArrayList<Object> params = new ArrayList<>();
259
        String query = queryGenerator.generateFetchClaimsByContext(openaireId, limit, offset,keyword,orderField, descending,types, params);
260
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
261
        return fetchClaimsByResultSet(rs, addCurationInfo);
262
    }
263
    public Claim fetchClaimById(String claimId, boolean addCurationInfo) throws Exception, SQLStoreException {
264
        ArrayList<Object> params = new ArrayList<>();
265
        String query = queryGenerator.generateSelectClaimQuery(claimId, params);
266
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
267
        if(rs.next()) {
268
            String sourceType =rs.getString(2);
269
//            String sourceId =rs.getString(3);
270
            String targetType =rs.getString(4);
271
//            String targetId =rs.getString(5);
272
            ArrayList<Object> params2 = new ArrayList<>();
273
            String query2 = queryGenerator.generateFetchClaimsByClaimId(claimId,sourceType,targetType, params2);
274
           rs = sqlDAO.executePreparedQuery(query2, params2);
275
        }else{
276
            log.info("No claim with id : "+ claimId+"\n");
277
        }
278
        Claim claim = null;
279
        List<Claim> claims=fetchClaimsByResultSet(rs, addCurationInfo);
280
        if(claims.size()==1){
281
            claim=claims.get(0);
282
        }
283
        return claim;
284
    }
285

    
286
    /*
287
    public List<Claim> fetchClaimsByToken(String token, String email, Integer limit, Integer offset, boolean addCurationInfo) throws Exception {
288
        return fetchClaimsByToken(token, email, limit, offset, null, "claim.claim_date",true, new ArrayList<String>(), addCurationInfo);
289
    }
290

    
291
    public List<Claim> fetchClaimsByToken(String token, String email, Integer limit, Integer offset, String keyword, String orderField, boolean descending, List<String> types, boolean addCurationInfo) throws Exception {
292
        ResultSet rs = sqlDAO.executePreparedQuery(queryGenerator.generateFetchClaimsByProjectToken(token, email, limit, offset, keyword, orderField,descending,types));
293
        return fetchClaimsByResultSet(rs, addCurationInfo);
294
    }
295
    */
296

    
297

    
298
    public List<Claim> fetchClaimsByResultSet(ResultSet rs, boolean addCurationInfo) throws Exception {
299
        List<Claim> claims= new ArrayList<Claim>();
300
        while(rs.next()) {
301
            Claim claim= new Claim();
302
            claims.add(claim);
303
            Integer i = 1;
304
            claim.setId(rs.getString(i++));
305
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
306
            Date date = format.parse(rs.getString(i++));
307
            claim.setDate(date);
308
            claim.setUserMail(rs.getString(i++));
309
            claim.setSourceType(rs.getString(i++));
310
            claim.setTargetType(rs.getString(i++));
311
            claim.setSemantics(rs.getString(i++));
312
            if(addCurationInfo) {
313
                String curationDate =rs.getString(i++);
314
                if(curationDate != null) {
315
                    date = format.parse(curationDate);
316
                    claim.setCurationDate(date);
317
                }
318
                claim.setCuratedBy(rs.getString(i++));
319
            }else{
320
                i+=2;
321
            }
322
            claim.setApproved(rs.getBoolean(i++));
323
            claim.setClaimedInDashboard(rs.getString(i++));
324
            claim.setSource(buildEntity(rs,i,claim.getSourceType()));
325
            claim.setTarget(buildEntity(rs,i+12,claim.getTargetType()));
326

    
327
        }
328
        return claims;
329
    }
330
    public Integer countClaimsByResultSet(ResultSet rs) throws Exception {
331

    
332
        while(rs.next()) {
333
            return rs.getInt(1);
334
        }
335
        return null;
336
    }
337
    public List<Project> getProjectsByResultSet(ResultSet rs, boolean addCurationInfo) throws Exception {
338
        List<Project> projects= new ArrayList<Project>();
339
        while(rs.next()) {
340
            Project project=(Project)(buildEntity(rs, 1, ClaimUtils.PROJECT));
341
             projects.add(project);
342
        }
343
        return projects;
344
    }
345
    public List<Context> getContextsByResultSet(ResultSet rs, boolean addCurationInfo) throws Exception {
346
        List<Context> contexts= new ArrayList<Context>();
347
        while(rs.next()) {
348
            Context context=(Context)(buildEntity(rs, 1, ClaimUtils.CONTEXT));
349
            contexts.add(context);
350
        }
351
        return contexts;
352
    }
353
    public Integer countAllClaims(String keyword, List<String> types) throws Exception, SQLStoreException {
354
        ArrayList<Object> params = new ArrayList<>();
355
        String query = queryGenerator.generateCountAllClaims(keyword,types, params);
356
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
357
        return countClaimsByResultSet(rs);
358
    }
359
    public Integer countClaimsByUser(String user,String keyword, List<String> types) throws Exception, SQLStoreException {
360
        ArrayList<Object> params = new ArrayList<>();
361
        String query = queryGenerator.generateCountByUser(user,keyword,types, params);
362
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
363
        return countClaimsByResultSet(rs);
364
    }
365
    public Integer countClaimsByProject(String projectId,String keyword, List<String> types) throws Exception, SQLStoreException {
366
        ArrayList<Object> params = new ArrayList<>();
367
        String query = queryGenerator.generateCountByProject(projectId,keyword,types, params);
368
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
369
        return countClaimsByResultSet(rs);
370
    }
371
    /*
372
    public Integer countClaimsByProjectToken(String projectToken,String email,String keyword, List<String> types)throws Exception {
373
        ResultSet rs = sqlDAO.executePreparedQuery(queryGenerator.generateCountByProjectToken(projectToken,email,keyword,types));
374
        return countClaimsByResultSet(rs);
375
    }
376
    */
377
    public Integer countClaimsByFunder(String funderId,String keyword, List<String> types) throws Exception, SQLStoreException {
378
        ArrayList<Object> params = new ArrayList<>();
379
        String query = queryGenerator.generateCountByFunder(funderId,keyword,types, params);
380
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
381
        return countClaimsByResultSet(rs);
382
    }
383
    public Integer countClaimsByResult(String resultId,String keyword, List<String> types) throws Exception, SQLStoreException {
384
        ArrayList<Object> params = new ArrayList<>();
385
        String query = queryGenerator.generateCountByResult(resultId,keyword,types, params);
386
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
387
        return countClaimsByResultSet(rs);
388
    }
389
    public Integer countClaimsByContext(String contextId,String keyword, List<String> types) throws Exception, SQLStoreException {
390
        ArrayList<Object> params = new ArrayList<>();
391
        String query = queryGenerator.generateCountByContext(contextId,keyword,types, params);
392
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
393
        return countClaimsByResultSet(rs);
394
    }
395
    public Integer countClaimsByDate(String dateFrom,String dateTo,String keyword, List<String> types) throws Exception, SQLStoreException {
396
        ArrayList<Object> params = new ArrayList<>();
397
        String query = queryGenerator.generateCountByDate(dateFrom,dateTo,keyword,types, params);
398
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
399
        return countClaimsByResultSet(rs);
400
    }
401

    
402
    public List<Project> getAllclaimedProjects(boolean addCurationInfo) throws Exception, SQLStoreException {
403
        ResultSet rs = sqlDAO.executePreparedQuery(queryGenerator.generateFetchAllProjectsQuery());
404
        return getProjectsByResultSet(rs,addCurationInfo);
405
    }
406
    public List<Context> getAllclaimedContexts( boolean addCurationInfo) throws Exception, SQLStoreException {
407
        ResultSet rs = sqlDAO.executePreparedQuery(queryGenerator.generateFetchAllContextsQuery());
408
        return getContextsByResultSet(rs,addCurationInfo);
409
    }
410
    /**
411
     *
412
     * @param rs
413
     * @param index
414
     * @return
415
     * @throws SQLException
416
     */
417
    private static Result buildResult(ResultSet rs, Integer index) throws SQLException {
418
        Result result = new Result();
419
        result.setOpenaireId(rs.getString(index));
420
        result.setTitle(rs.getString(index + 1));
421
        result.setResultType(rs.getString(index + 2));
422
        result.setDoi(rs.getString(index + 3));
423
        result.setOrcidworkid(rs.getString(index + 4));
424
        result.setAccessRights(rs.getString(index + 5));
425
        result.setEmbargoEndDate(rs.getString(index + 6));
426
        result.setBestLicense(rs.getString(index + 7));
427
        result.setExternalUrl(rs.getString(index + 8));
428
        result.setCollectedFrom(rs.getString(index + 9));
429
        result.setRecordPath(rs.getString(index + 10));
430
        result.setRecordFormat(rs.getString(index + 11));
431

    
432
        return result;
433

    
434
    }
435
    private static Project buildProject(ResultSet rs, Integer index) throws SQLException {
436
        Project project = new Project();
437
        project.setOpenaireId(rs.getString(index));
438
        project.setName(rs.getString(index + 1));
439
        project.setAcronym(rs.getString(index + 2));
440
        project.setFunderId(rs.getString(index + 3));
441
        project.setFunderName(rs.getString(index + 4));
442
        project.setFunderShortName(rs.getString(index + 5));
443
        String contactP = rs.getString(index + 7);
444
        project.setContactEmails(new ArrayList<String>());
445
        if(contactP != null) {
446
            for (String s : contactP.split(",")) {
447
                project.getContactEmails().add(s);
448
            }
449
        }
450

    
451
        return project;
452

    
453
    }
454
    private static Context buildContext(ResultSet rs, Integer index) throws SQLException {
455
        Context context = new Context();
456
        context.setOpenaireId(rs.getString(index));
457
        context.setTitle(rs.getString(index + 1));
458
        return context;
459

    
460
    }
461
    private static OpenaireEntity buildEntity(ResultSet rs, Integer index, String type) throws SQLException {
462
        OpenaireEntity openaireEntity = null;
463
        if(type == null){
464
            openaireEntity = null;
465
        }else if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET)||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)) {
466
            openaireEntity= buildResult(rs, index);
467
        }else if(type.equals(ClaimUtils.PROJECT)){
468
            openaireEntity = buildProject(rs,index);
469
        }else if(type.equals(ClaimUtils.CONTEXT)){
470
            openaireEntity = buildContext(rs,index);
471
        }
472
        return openaireEntity;
473
    }
474

    
475
    public SqlDAO getSqlDAO() {
476
        return sqlDAO;
477
    }
478

    
479
    public void setSqlDAO(SqlDAO sqlDAO) {
480
        this.sqlDAO = sqlDAO;
481
    }
482

    
483
    public QueryGenerator getQueryGenerator() {
484
        return queryGenerator;
485
    }
486

    
487
    public void setQueryGenerator(QueryGenerator queryGenerator) {
488
        this.queryGenerator = queryGenerator;
489
    }
490
}
(5-5/12)