Project

General

Profile

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

    
3
import eu.dnetlib.data.claims.migration.ClaimValidation;
4
import eu.dnetlib.data.claims.migration.ClaimValidationException;
5
import eu.dnetlib.data.claims.migration.entity.Claim;
6
import eu.dnetlib.data.claims.migration.entity.OpenaireEntity;
7
import eu.dnetlib.data.claims.migration.entity.Project;
8
import eu.dnetlib.data.claims.migration.entity.Result;
9
import eu.dnetlib.data.claimsDemo.ClaimUtils;
10
import eu.dnetlib.data.claimsDemo.QueryGenerator;
11
import eu.dnetlib.data.claimsDemo.SQLStoreException;
12
import eu.dnetlib.data.claimsDemo.SqlDAO;
13
import org.apache.log4j.Logger;
14

    
15
import java.sql.ResultSet;
16
import java.sql.SQLException;
17
import java.util.ArrayList;
18
import java.util.Date;
19
import java.util.List;
20

    
21
/**
22
 * Created by kiatrop on 5/2/2016.
23
 */
24
public class ClaimHandler {
25

    
26
    SqlDAO sqlDAO = null;
27
    QueryGenerator queryGenerator = null;
28
    ResultHandler resultHandler = null;
29
    DMFContextHandler dmfContextHandler = null;
30
    ProjectHandler projectHandler = null;
31
    ClaimValidation claimValidation = null;
32

    
33
    private static final Logger logger = Logger.getLogger(ClaimHandler.class);
34

    
35
    /**
36
     * Saves a list of claims in DB
37
     * @param claims
38
     */
39
    public void saveClaims(List<Claim> claims){
40
        for(Claim claim:claims){
41
            try {
42
                saveClaim(claim);
43
            } catch (SQLStoreException e) {
44
                logger.error("Claim couldn't be saved : " + claim.getId() + "\n" + claim.toString(), e);
45
            } catch (SQLException e) {
46
                logger.error("Claim couldn't be saved : " + claim.getId() + "\n" + claim.toString(), e);
47
            }
48
        }
49
    }
50
   public String  generateSaveQueryForClaim(Claim claim, ArrayList<Object> params){
51

    
52
       String query= null;
53
       /*if (claim.getSourceType().equals(ClaimUtils.CONTEXT)) {
54
           query = queryGenerator.generateInsertClaimContextQuery(resultHandler.generateSaveQueryForResult(((Result)claim.getTarget())),dmfContextHandler.generateSaveQueryForContext ((Context) claim.getSource()), claim);
55
       } else if (claim.getSourceType().equals(ClaimUtils.PROJECT)) {
56
           query = queryGenerator.generateInsertClaimProjectQuery(resultHandler.generateSaveQueryForResult((Result)claim.getTarget()), projectHandler.generateSaveQueryForProject((Project) claim.getSource()), claim);
57
       } else{
58
           query = queryGenerator.generateInsertClaimResultQuery(resultHandler.generateSaveQueryForResult((Result)claim.getTarget()), resultHandler.generateSaveQueryForResult((Result) claim.getSource()), claim);
59
       }*/
60
       query = queryGenerator.generateInsertFullClaimQuery(claim, params);
61
       return query;
62
   }
63
    /**
64
     * saves a claim in DB
65
     * @param claim
66
     * @throws Exception
67
     */
68
    //TODO make private - used in Migration
69
    public String saveClaim(Claim claim) throws SQLStoreException, SQLException {
70
        logger.info("Saving claim...");
71
        String id = null;
72
        ArrayList<Object> params = new ArrayList<>();
73
        String query = generateSaveQueryForClaim(claim, params);
74
        ResultSet rs=sqlDAO.executePreparedQuery(query, params);
75
        if(rs.next()) {
76
            id = rs.getString(1);
77
        }
78
        rs.close();
79
        return id;
80
    }
81

    
82
    /**
83
     * Gets the main information for a claim relation - builds a claim object
84
     * exports metadata
85
     * and saves the claim relations in the DB
86
     * @param user
87
     * @param sourceType
88
     * @param sourceId
89
     * @param sourceCollectedFrom
90
     * @param targetType
91
     * @param targetId
92
     * @param targetCollectedFrom
93
     * @throws Exception
94
     */
95
    public String buildAndInsertClaim(String user, String sourceType, String sourceId, String sourceCollectedFrom, String sourceAccessRights, String sourceEmbargoDate, String targetType, String targetId, String targetCollectedFrom, String targetAccessRights, String targetEmbargoDate) throws Exception, SQLStoreException {
96
        String id = null;
97

    
98
        claimValidation.validateCollectedFrom(targetCollectedFrom);
99
        claimValidation.validateCollectedFrom(sourceCollectedFrom);
100
        logger.info("Trying to create a claim {user:"+user+", sourceType:"+sourceType+", sourceId:"+sourceId+", sourceCollectedFrom:"+sourceCollectedFrom+", sourceAccessRights:"+sourceAccessRights
101
                +", sourceEmbargoDate:"+sourceEmbargoDate +", targetType:"+targetType +", targetId:"+targetId +", targetCollectedFrom:"+targetCollectedFrom +", targetAccessRights:"+targetAccessRights
102
                +", targetEmbargoDate:"+targetEmbargoDate+"}");
103
        Claim claim = buildClaim(user,sourceType,sourceId,sourceCollectedFrom, sourceAccessRights, sourceEmbargoDate, targetType, targetId, targetCollectedFrom, targetAccessRights, targetEmbargoDate);
104
        if(claimValidation.validateClaim(claim)) {
105
            claim = exportMedatataForClaim(claim);
106
            id = saveClaim(claim);
107
        }else{
108
            logger.info("claim is not valid");
109
        }
110
        return id;
111
    }
112

    
113
    /**
114
     * Gets the main information of a relation claim and
115
     * builds a claim object
116
     * @param user
117
     * @param sourceType publication, dataset, project, context
118
     * @param sourceId openaireId, doi or orcid workid
119
     * @param sourceCollectedFrom only for source with type publication, dataset
120
     * @param targetType publication, dataset, project, context
121
     * @param targetId openaireId, doi or orcid workid
122
     * @param targetCollectedFrom only for target with type publication, dataset
123
     * @return a claim object
124
     * @throws Exception
125
     */
126
    public Claim buildClaim(String user, String sourceType,String sourceId,String sourceCollectedFrom, String sourceAccessRights, String sourceEmbargoDate, String targetType,String targetId,String targetCollectedFrom, String targetAccessRights, String targetEmbargoDate ) throws Exception {
127
        Claim claim = new Claim();
128
        claim.setUserMail(user);
129
        claim.setDate(new Date());
130
        //date
131
        claim.setSourceType(sourceType);
132
        claim.setTargetType(targetType);
133
        claim.setSource(buildOpenaireEntity(sourceId,sourceType,sourceCollectedFrom,sourceAccessRights, sourceEmbargoDate));
134
        claim.setTarget(buildOpenaireEntity(targetId,targetType,targetCollectedFrom, targetAccessRights, targetEmbargoDate));
135

    
136
        if (claim.getSource() == null) {
137
           throw new ClaimValidationException("The source id is invalid.");
138
        }
139

    
140
        if (claim.getTarget() == null) {
141
            throw new ClaimValidationException("The target id is invalid.");
142
        }
143
        //TODO from external sources need an OPenaireID
144
        return claim;
145

    
146
    }
147

    
148
    public boolean updateClaimCurationInfo(String curatedBy, String claimId, boolean approved) throws SQLStoreException, SQLException, Exception {
149
        logger.info("Updating claim curation info...");
150
        ArrayList<Object> params = new ArrayList<>();
151
        String query = queryGenerator.generateUpdateClaimCuration(curatedBy, claimId, approved, params);
152
        //ResultSet rs = sqlDAO.executeUpdateQuery(query, params);
153
        return sqlDAO.executeUpdateQuery(query, params);
154

    
155
        /*
156
        boolean success = false;
157
        while (rs.next())
158
        {
159
            success = true;
160
        }
161
        rs.close();
162
        return success;
163
        */
164
    }
165

    
166

    
167
    /**
168
     * Gets the main information of an openaire entityinfrastruct_::openaire
169
     * and returns a full  object
170
     * @param id
171
     * @param type
172
     * @param collectedFrom
173
     * @return openaire Entity (Context, Result, Project)
174
     * @throws Exception
175
     */
176
    private OpenaireEntity buildOpenaireEntity(String id, String type, String collectedFrom, String accessRights, String embargoDate) throws Exception {
177
        if(type==null){
178
            return null;
179
        }
180
        else if(type.equals(ClaimUtils.CONTEXT)){
181
            return DMFContextHandler.fetchContextById(id);
182
        }else if (type.equals(ClaimUtils.PROJECT)){
183
            Project project = projectHandler.fetchProjectByID(id);
184
            if(project == null){
185
                logger.error("Project with id:"+id + " couldn't be fetched.");
186
            }
187

    
188
            return project;
189
        }else if (type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET)){
190
            ExternalRecordHandler externalRecordHandler = new ExternalRecordHandler();
191
            if(collectedFrom == null){
192
                return null;
193
            }else if(collectedFrom.equals(ClaimUtils.CROSSREF)){
194

    
195
                Result result = externalRecordHandler.fetchResultfromCrossref(id);
196
                if(result == null){
197
                    logger.error("Record with id: " + id + " couldn't be fetched from crossref.");
198
                }
199

    
200
                result.setAccessRights(accessRights);
201
                result.setEmbargoEndDate(embargoDate);
202
                return result;
203
            }else if (collectedFrom.equals(ClaimUtils.DATACITE)){
204
                Result result = externalRecordHandler.fetchResultfromDatacite(id);
205
                if(result == null){
206
                    logger.error("Record with id:"+id + " couldn't be fetched from datacite.");
207
                }else {
208
                    result.setAccessRights(accessRights);
209
                    result.setEmbargoEndDate(embargoDate);
210
                }
211
                return result;
212
            }else if (collectedFrom.equals(ClaimUtils.ORCID)){
213
                Result result = externalRecordHandler.fetchResultfromOrcid(id);
214
                if(result == null){
215
                    logger.error("Record with id:"+id + " couldn't be fetched from ORCID.");
216
                }else {
217
                    result.setAccessRights(accessRights);
218
                    result.setEmbargoEndDate(embargoDate);
219
                }
220
                return result;
221
            }else if (collectedFrom.equals(ClaimUtils.OPENAIRE)){
222
                IndexResultHandler indexResultHandler = new IndexResultHandler();
223
                Result result = indexResultHandler.fetchResultById(id);
224
                if(result == null){
225
                    logger.error("Record with id:"+id + " couldn't be fetched from openaire.");
226
                }
227
                return result;
228
            }
229
        }
230
        return null;
231
    }
232

    
233

    
234
    /**
235
     * Exports the metadata for the source and the target of a claim and sets the proper field
236
     * @param claim
237
     * @return claim with the proper metadata path of the result of source and target
238
     */
239
    public Claim exportMedatataForClaim(Claim claim){
240
        if(claim.getTargetType().equals(ClaimUtils.DATASET)||claim.getTargetType().equals(ClaimUtils.PUBLICATION)){
241
            String path = resultHandler.exportMetadataFileForResult((Result)claim.getTarget());
242
            ((Result) claim.getTarget()).setRecordPath(path);
243
        }
244
        if(claim.getSourceType().equals(ClaimUtils.DATASET)||claim.getSourceType().equals(ClaimUtils.PUBLICATION)){
245
            String path = resultHandler.exportMetadataFileForResult((Result)claim.getSource());
246
            ((Result) claim.getSource()).setRecordPath(path);
247
        }
248
        return claim;
249

    
250
    }
251

    
252
    public void deleteClaim(String user, String claimId) throws SQLStoreException, Exception {
253

    
254
        ArrayList<Object> params = new ArrayList<>();
255
        String query = queryGenerator.generateSelectClaimQuery(claimId,user, params);
256
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
257
        if(rs.next()) {
258
            String sourceType =rs.getString(2);
259
            String sourceId =rs.getString(3);
260
            String targetType =rs.getString(4);
261
            String targetId =rs.getString(5);
262
            ArrayList<Object> params2 = new ArrayList<>();
263
            String query2 = queryGenerator.generateDeleteFullClaimQuery(claimId,user,sourceType,sourceId,targetType,targetId, params2);
264
            sqlDAO.executeUpdateQuery(query2, params2);
265
        }else{
266
            logger.error("Claim with id : "+ claimId+" user:  "+user+" couldn't be deleted." );
267
        }
268
        rs.close();
269
    }
270

    
271
    public boolean deleteClaim(String claimId) throws Exception, SQLStoreException {
272

    
273
        ArrayList<Object> params = new ArrayList<>();
274
        String query = queryGenerator.generateSelectClaimQuery(claimId, params);
275
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
276
        if(rs.next()) {
277
            String sourceType =rs.getString(2);
278
            String sourceId =rs.getString(3);
279
            String targetType =rs.getString(4);
280
            String targetId =rs.getString(5);
281
            String user =rs.getString(6);
282
            ArrayList<Object> params2 = new ArrayList<>();
283
            String query2 = queryGenerator.generateDeleteFullClaimQuery(claimId,user,sourceType,sourceId,targetType,targetId, params2);
284
            sqlDAO.executeUpdateQuery(query2, params2);
285
            rs.close();
286
            return  true;
287
        }
288
        rs.close();
289
        logger.error("Couldn't delete claim with id : " + claimId +". It doesn't not exist.");
290
        return false;
291

    
292
    }
293

    
294
    public SqlDAO getSqlDAO() {
295
        return sqlDAO;
296
    }
297

    
298
    public void setSqlDAO(SqlDAO sqlDAO) {
299
        this.sqlDAO = sqlDAO;
300
    }
301

    
302
    public QueryGenerator getQueryGenerator() {
303
        return queryGenerator;
304
    }
305

    
306
    public void setQueryGenerator(QueryGenerator queryGenerator) {
307
        this.queryGenerator = queryGenerator;
308
    }
309

    
310
    public ResultHandler getResultHandler() {
311
        return resultHandler;
312
    }
313

    
314
    public void setResultHandler(ResultHandler resultHandler) {
315
        this.resultHandler = resultHandler;
316
    }
317

    
318
    public DMFContextHandler getDmfContextHandler() {
319
        return dmfContextHandler;
320
    }
321

    
322
    public void setDmfContextHandler(DMFContextHandler dmfContextHandler) {
323
        this.dmfContextHandler = dmfContextHandler;
324
    }
325

    
326
    public ProjectHandler getProjectHandler() {
327
        return projectHandler;
328
    }
329

    
330
    public void setProjectHandler(ProjectHandler projectHandler) {
331
        this.projectHandler = projectHandler;
332
    }
333

    
334
    public ClaimValidation getClaimValidation() {
335
        return claimValidation;
336
    }
337

    
338
    public void setClaimValidation(ClaimValidation claimValidation) {
339
        this.claimValidation = claimValidation;
340
    }
341
}
(1-1/12)