Project

General

Profile

1
package gr.uoa.di.validator.api;
2

    
3
import gr.uoa.di.validator.Validator;
4
import gr.uoa.di.validator.api.listeners.OpenAIREValidatorCompatibilityTestListener;
5
import gr.uoa.di.validator.api.listeners.OpenAIREValidatorRegistrationListener;
6
import gr.uoa.di.validator.constants.FieldNames;
7
import gr.uoa.di.validator.constants.FieldsAndDetails;
8
import gr.uoa.di.validator.constants.JobTypes;
9
import gr.uoa.di.validator.constants.RuleTypes;
10
import gr.uoa.di.validator.constants.TableNames;
11
import gr.uoa.di.validator.constants.fielddetails.FieldDetails;
12
import gr.uoa.di.validator.dao.Entry;
13
import gr.uoa.di.validator.dao.JobSubmitted;
14
import gr.uoa.di.validator.dao.JobSubmittedDAO;
15
import gr.uoa.di.validator.dao.RulePair;
16
import gr.uoa.di.validator.dao.RuleSet;
17
import gr.uoa.di.validator.dao.RuleSetDAO;
18
import gr.uoa.di.validator.dao.RuleStored;
19
import gr.uoa.di.validator.dao.RuleStoredDAO;
20
import gr.uoa.di.validator.dao.TaskStoredDAO;
21
import gr.uoa.di.validator.dao.Utilities;
22
import gr.uoa.di.validator.data.Rule;
23
import gr.uoa.di.validator.execution.Job;
24
import gr.uoa.di.validator.impls.MemoryThreadValidator;
25
import gr.uoa.di.validator.impls.listeners.DnetListener;
26
import gr.uoa.di.validator.impls.listeners.ValidatorJobListener;
27
import gr.uoa.di.validator.impls.providers.OAIPMHRecordProvider;
28
import gr.uoa.di.validator.impls.providers.OAIPMHSinglePageVerbProvider;
29
import gr.uoa.di.validator.impls.rules.ChainRule;
30
import gr.uoa.di.validatorweb.actions.admin.rules.FieldPair;
31
import gr.uoa.di.validatorweb.actions.admin.rulesets.RuleS;
32
import gr.uoa.di.validatorweb.actions.compTest.RuleD;
33
import gr.uoa.di.validatorweb.email.Emailer;
34

    
35
import java.io.BufferedReader;
36
import java.io.Serializable;
37
import java.io.StringReader;
38
import java.lang.reflect.InvocationTargetException;
39
import java.util.ArrayList;
40
import java.util.HashMap;
41
import java.util.HashSet;
42
import java.util.List;
43
import java.util.Map;
44
import java.util.Properties;
45
import java.util.Set;
46

    
47
import org.apache.log4j.Logger;
48
import org.springframework.transaction.annotation.Propagation;
49
import org.springframework.transaction.annotation.Transactional;
50

    
51

    
52
/**
53
 * 
54
 * @author Nikon Gasparis
55
 *
56
 */
57

    
58
@Transactional(propagation = Propagation.REQUIRED)
59
public abstract class OpenAIREValidatorImpl implements OpenAIREValidator {
60
	
61
	private Validator validator;
62
	private JobSubmittedDAO jobSubmittedDao;
63
	private RuleSetDAO ruleSetDao;
64
	private RuleStoredDAO ruleStoredDao;
65
	private TaskStoredDAO taskStoredDao;
66
	private ValidatorRestore valRestore;
67

    
68
	private Emailer emailer = null;
69
	private String valBaseUrl = null;
70

    
71
	private Map<Integer,Integer> ruleLinkingMap = new HashMap<Integer,Integer>();
72
	private Integer jobIdRegistry=1;	
73
	private Integer ruleIdRegistry=1;
74
	
75

    
76
	private List<String> repoRegistrationOverride = new ArrayList<String>();
77
	
78
	private static Logger logger = Logger.getLogger(OpenAIREValidatorImpl.class);
79

    
80
	protected abstract ValidatorJobListener createListener();
81
	protected abstract OpenAIREValidatorCompatibilityTestListener createCompTestListener();
82
	protected abstract OpenAIREValidatorRegistrationListener createRegListener();
83
	protected abstract DnetListener createDnetListener();
84
	
85
	
86
	public void start(){
87
		logger.debug("deleting uncompleted jobs..");
88
		List<JobSubmitted> jobs = valRestore.deleteUncompleted();
89
		logger.debug("restoring OpenAire Validator..");
90
		valRestore.restore(jobs);
91
		logger.debug("finished restoring OpenAire Validator..");
92
	}
93

    
94

    
95
	@Override
96
	public void createRuleSet(String name, String description,String guidelinesAcronym, String visibility,  String[] ruleIdsContent,String[] ruleIdsUsage) throws OpenAIREValidatorException {
97

    
98
		try {
99
			logger.debug("creating rule set " + name);
100
			
101
			RuleSet newRuleSet = new RuleSet();		
102
			newRuleSet.setRuleIdsContent(Utilities.convertArrayToList(ruleIdsContent));
103
			newRuleSet.setRuleIdsUsage(Utilities.convertArrayToList(ruleIdsUsage));
104
			logger.debug("creating rule set : content : " + newRuleSet.getRuleIdsContent());
105
			logger.debug("creating rule set : usage : " + newRuleSet.getRuleIdsUsage());
106
			newRuleSet.setName(name);
107
			newRuleSet.setDescription(description);
108
			newRuleSet.setGuidelinesAcronym(guidelinesAcronym);
109
			newRuleSet.setVisibility(Utilities.convertStringToList(visibility));
110
			newRuleSet.setId(-1);
111
			ruleSetDao.save(newRuleSet);
112
			} catch (Exception e) {
113
			logger.error("Error creating rule set " + name, e);
114
			throw new OpenAIREValidatorException(e);
115
		}
116

    
117

    
118
	}
119

    
120
	@Override
121
	public void editRuleSet(int setId, String name, String description,String guidelinesAcronym, String visibility,  String[] ruleIdsContent, String[] ruleIdsUsage) throws OpenAIREValidatorException {
122
		try {
123
			logger.debug("editing rule set " + setId);
124
			RuleSet newRuleSet = new RuleSet();
125
			newRuleSet.setRuleIdsContent(Utilities.convertArrayToList(ruleIdsContent));
126
			newRuleSet.setRuleIdsUsage(Utilities.convertArrayToList(ruleIdsUsage));
127
			newRuleSet.setName(name);
128
			newRuleSet.setDescription(description);
129
			newRuleSet.setGuidelinesAcronym(guidelinesAcronym);
130
			newRuleSet.setVisibility(Utilities.convertStringToList(visibility));
131
			newRuleSet.setId(setId);
132
			ruleSetDao.save(newRuleSet);
133
		} catch (Exception e) {
134
			logger.error("Error editing rule set " + setId, e);
135
			throw new OpenAIREValidatorException(e);
136
		}	
137
	}
138

    
139
	@Override
140
	public void deleteRuleSet(int setId) throws OpenAIREValidatorException {
141
		try {
142
			logger.debug("deleting rule set " + setId);
143
			ruleSetDao.delete(Integer.toString(setId));
144
		} catch (Exception e) {
145
			logger.error("Error deleting rule set " + setId, e);
146
			throw new OpenAIREValidatorException(e);
147
		}
148
	}	
149
	
150
	@Override
151
	public String getRuleSetName(int setId) throws OpenAIREValidatorException {
152
		try {
153
			logger.debug("getting rule set names for rule set " + setId);
154
			return ruleSetDao.getRuleSetName(Integer.toString(setId));
155
		} catch (Exception e) {
156
			logger.error("Error getting rule set names for rule set " + setId, e);
157
			throw new OpenAIREValidatorException(e);
158
		}
159
	}
160
	
161
	@Override
162
	public RuleSet getRuleSet(int setId) throws OpenAIREValidatorException {
163
		try {
164
			logger.debug("getting rule set names for rule set " + setId);
165
			return ruleSetDao.get(Integer.toString(setId));
166
		} catch (Exception e) {
167
			logger.error("Error getting rule set names for rule set " + setId, e);
168
			throw new OpenAIREValidatorException(e);
169
		}
170
	}
171

    
172
	@Override
173
	public List<RuleSet> getRuleSetIdNames() throws OpenAIREValidatorException {
174
		try {
175
			logger.debug("Getting all rule sets");
176
			return ruleSetDao.getRuleSetIdNames();
177
		} catch (Exception e) {
178
			logger.error("Error getting all rule sets", e);
179
			throw new OpenAIREValidatorException(e);
180
		}
181
	}
182

    
183
	@Override
184
	public List<String> getRuleSetRuleIdsByJobType(int setId, String jobType) throws OpenAIREValidatorException {
185
		try {
186
			logger.debug("getting rule set rule ids for rule set " + setId);
187
			return ruleSetDao.getRuleSetRuleIdsByJobType(Integer.toString(setId), jobType);
188
		} catch (Exception e) {
189
			logger.error("Error getting rule set rule ids for rule set " + setId, e);
190
			throw new OpenAIREValidatorException(e);
191
		}
192
	}
193

    
194
	@Override
195
	public List<RuleD> convertRuleIdsListToRuleDList(List<String> ruleIds) {
196
		List<RuleD> ruleDList = new ArrayList<RuleD>();
197
		for(String ruleId : ruleIds) {
198
			RuleStored rule = ruleStoredDao.get(ruleId);
199
			RuleD ruleD = new RuleD();
200
			ruleD.setName(rule.getName());
201
			ruleD.setDescription(rule.getDescription());
202
			if (rule.getJob_type().equals("content"))
203
				ruleD.setJobType("OAI Content Validation");	
204
			else
205
				ruleD.setJobType("OAI Usage Validation");
206
			ruleDList.add(ruleD);
207
		}
208
		return ruleDList;
209
	}
210
	
211
	@Override
212
	public List<RuleS> getAllRulesForPresentationByJobType(String jobType) throws OpenAIREValidatorException {
213
		try {
214
			logger.debug("getting all rules for front-end presentation");
215
			List<RuleS> rules = new ArrayList<RuleS>();
216
			List<RuleStored> rulesTemp = getAllRulesByJobType(jobType);
217
			for (RuleStored rule : rulesTemp)
218
			{
219
				RuleS ruleS= new RuleS();
220
				ruleS.setName(rule.getName());
221
				ruleS.setId(rule.getId());
222
				ruleS.setChosen(false);
223
				rules.add(ruleS);
224
			}	
225
			return rules;
226
		} catch (Exception e) {
227
			logger.error("Error getting all rules for front-end presentation", e);
228
			throw new OpenAIREValidatorException(e);
229
		}
230
	}
231

    
232
	@Override
233
	public List<RuleS> getAllRulesForPresentationByJobTypeByRuleSet(List<String> ruleSetRuleIds, String jobType) throws OpenAIREValidatorException {
234
		try {
235
		logger.debug("getting all rules for front-end presentation sorted by ruleset");
236
		List<RuleS> rules = new ArrayList<RuleS>();
237
		List<RuleStored> rulesTemp = getAllRulesByJobType(jobType);
238
		for (RuleStored rule : rulesTemp)
239
		{
240
			RuleS ruleS= new RuleS();
241
			ruleS.setName(rule.getName());
242
			ruleS.setId(rule.getId());
243
			if(ruleSetRuleIds.contains(ruleS.getId()))
244
				ruleS.setChosen(true);
245
			else
246
				ruleS.setChosen(false);
247
			rules.add(ruleS);
248
		}	
249
		return rules;
250
		} catch (Exception e) {
251
			logger.error("Error getting all rules for presentation by rule set", e);
252
			throw new OpenAIREValidatorException(e);
253
		}
254
	}
255

    
256
	@Override
257
	public List<RuleD> getRulesForJobValidationByJobType (String jobType) throws OpenAIREValidatorException {
258
		try {
259
			logger.debug("getting all rules for front-end validation presentation");
260
			List<RuleD> rules = new ArrayList<RuleD>();
261
			List<RuleStored> rulesTemp = getAllRulesByJobType(jobType);
262
			for (RuleStored rule : rulesTemp)
263
			{
264
//				logger.debug("rule id: "+ rule.getId());
265
				RuleD ruleD= new RuleD();
266
				ruleD.setName(rule.getName());
267
				ruleD.setId(Integer.parseInt(rule.getId()));
268
				ruleD.setJobType(rule.getJob_type());
269
				ruleD.setDescription(rule.getDescription());				
270

    
271
				rules.add(ruleD);
272
			}	
273
			return rules;
274
		} catch (Exception e) {
275
			logger.error("Error getting all rules for front-end validation presentation", e);
276
			throw new OpenAIREValidatorException(e);
277
		}	
278
	}
279
	
280
	@Override
281
	public List<RuleD> getRulesForJobValidationByJobTypeByRuleSet (int setId, String jobType) throws OpenAIREValidatorException {
282
		try {
283
			logger.debug("getting all rules for front-end validation by ruleset:"+setId);
284
			List<RuleD> rules = new ArrayList<RuleD>();
285
			List<String> ruleSetRuleIds = this.getRuleSetRuleIdsByJobType(setId, jobType);
286
			List<RuleStored> rulesTemp = getAllRulesByJobType(jobType);
287
			for (RuleStored rule : rulesTemp)
288
			{
289
//				logger.debug("rule id: "+ rule.getId());
290
				if(!ruleSetRuleIds.contains(rule.getId()))
291
					continue;
292
				RuleD ruleD= new RuleD();
293
				ruleD.setName(rule.getName());
294
				ruleD.setId(Integer.parseInt(rule.getId()));
295
				ruleD.setJobType(rule.getJob_type());
296
				ruleD.setDescription(rule.getDescription());					
297

    
298
				rules.add(ruleD);
299
			}	
300
			return rules;
301
		} catch (Exception e) {
302
			logger.error("Error getting all rules for front-end validation by ruleset", e);
303
			throw new OpenAIREValidatorException(e);
304
		}	
305
	}
306

    
307
	@Override
308
	public List<RuleStored> getAllRulesByJobType(String jobType) throws OpenAIREValidatorException {
309
		try {
310
			logger.debug("getting all rules for a specific jobType");
311
			return ruleStoredDao.getAllRulesByJobType(jobType);
312
		} catch (Exception e) {
313
			logger.error("Error getting all rules for a specific jobType", e);
314
			throw new OpenAIREValidatorException(e);
315
		}		
316
	}
317
		
318
	@Override
319
	public List<RulePair> getAllRulesToRulePair() throws OpenAIREValidatorException {
320
		try {
321
			logger.debug("getting all rules to rule pair");
322
			return ruleStoredDao.getAllRulesToRulePair();
323
		} catch (Exception e) {
324
			logger.error("Error getting all rules  to rule pair", e);
325
			throw new OpenAIREValidatorException(e);
326
		}	
327
	}	
328
		
329
	public void storeJobForRegistration(String baseUrl, String officialName,
330
			String activationId, String user, List<String> adminEmails, String validationSet, String desiredCompatibility, String datasourceId, String interfaceId) throws OpenAIREValidatorException {
331
		try {
332
			logger.debug("storing fields for job registration");
333
			jobSubmittedDao.storeJobForRegistration(baseUrl,officialName,activationId, user, adminEmails.get(0), validationSet, desiredCompatibility, datasourceId, interfaceId);
334
		} catch (Exception e) {
335
			logger.error("Error storing fields for job registration", e);
336
			throw new OpenAIREValidatorException(e);
337
		}		
338
	}
339

    
340
	public List<String> getJobForRegistration(String activationId) throws OpenAIREValidatorException {
341
		try {
342
			logger.debug("getting fields for job registration");
343
			return jobSubmittedDao.getJobForRegistration(activationId);
344
		} catch (Exception e) {
345
			logger.error("Error getting fields for job registration", e);
346
			throw new OpenAIREValidatorException(e);
347
		}		
348
	}
349
	
350
	public void deleteJobForRegistration(String activationId) throws OpenAIREValidatorException {
351
		try {
352
			logger.debug("deleting fields for job registration");
353
			jobSubmittedDao.deleteJobForRegistration(activationId);
354
		} catch (Exception e) {
355
			logger.error("Error deleting fields for job registration", e);
356
			throw new OpenAIREValidatorException(e);
357
		}		
358
	}
359
	
360
	public void preRegistrationValidations(String baseUrl, String officialName,
361
			String activationId, String userMail, List<String> adminEmails,
362
			String validationSet, String desiredCompatibility, String datasourceId, String interfaceId) throws OpenAIREValidatorException {
363
		try {
364
			logger.debug("initiating preregistration validations on repo " + baseUrl + " for user " + userMail + "and desired compatibility: " + desiredCompatibility);
365
			Set<Integer> ruleIdsContent = new HashSet<Integer>();
366
			Set<Integer> ruleIdsUsage = new HashSet<Integer>();
367
			for (RuleSet ruleset : ruleSetDao.getRuleSetIdNames()) {
368
				if (ruleset.getDescription().equals(desiredCompatibility)) {
369
					ruleIdsContent = Utilities.convertListToSet(ruleset.getRuleIdsContent());
370
					ruleIdsUsage = Utilities.convertListToSet(ruleset.getRuleIdsUsage());
371
				}	
372
			}
373

    
374
			
375
			OpenAIREValidatorRegistrationListener regListener = createRegListener();
376
			regListener.setActivationId(activationId);
377
			regListener.setAdminEmails(adminEmails);
378
			regListener.setBaseUrl(baseUrl);
379
			regListener.setOfficialName(officialName);
380
			regListener.setUserMail(userMail);
381
			regListener.setDatasourceId(datasourceId);
382
			regListener.setInterfaceId(interfaceId);
383
			regListener.setValidationSet(validationSet);
384
			regListener.setDesiredCompLevel(desiredCompatibility);
385
					
386
			Properties pros = null;
387
			pros = new Properties();
388
			pros.setProperty(OAIPMHRecordProvider.BASEURL, baseUrl);
389
			pros.setProperty(OAIPMHRecordProvider.METADATA_PREFIX, "oai_dc");
390
			pros.setProperty(OAIPMHRecordProvider.TIMEOUT, "360000");
391
			pros.setProperty(OAIPMHRecordProvider.DELAY, "1000");
392
			pros.setProperty(OAIPMHRecordProvider.RETRY_DELAY, "60000");
393
			pros.setProperty(OAIPMHRecordProvider.RETRY_EFFORTS, "3");
394
			pros.setProperty(OAIPMHRecordProvider.RECORDS, "all");
395
//			pros.setProperty(OAIPMHRecordProvider.RECORDS, "20");
396
			//TODO
397
			pros.setProperty(OAIPMHRecordProvider.SET, validationSet);
398
			pros.setProperty("ACTIVATION_ID", activationId);
399
			
400
			this.submitContentJob(pros, ruleIdsContent, userMail, null, regListener);
401
			
402
			pros = new Properties();
403
			pros.setProperty(OAIPMHSinglePageVerbProvider.BASEURL, baseUrl);
404
			pros.setProperty(OAIPMHSinglePageVerbProvider.TIMEOUT, "360000");
405
			pros.setProperty(OAIPMHSinglePageVerbProvider.DELAY, "1000");
406
			pros.setProperty(OAIPMHSinglePageVerbProvider.RETRY_DELAY, "60000");
407
			pros.setProperty(OAIPMHSinglePageVerbProvider.RETRY_EFFORTS, "3");
408
			pros.setProperty("ACTIVATION_ID", activationId);
409
			
410
			
411
			this.submitUsageJob(pros, ruleIdsUsage, userMail, regListener);
412
			
413
			
414
			
415
			
416

    
417
			} catch (Exception e) {
418
				logger.error("Error running preregistration validations", e);
419
				throw new OpenAIREValidatorException(e);
420
			}
421
		
422
		
423
		
424
	}
425

    
426
	public Map<String, Set<Integer>> prepareCrisJobs(Set<Integer> chosenContentRules) throws OpenAIREValidatorException {
427
		Map<String, Set<Integer>> entityChosenRulesMap = new HashMap<String, Set<Integer>>();
428
		
429
		//getting rules per entity and leave only chosen ones
430
		for (String entity : RuleTypes.getEntities().keySet()) {
431
			Set<Integer> tempSet = new HashSet<Integer>();
432
			for (RuleStored rule : ruleStoredDao.getAllRulesByJobTypeEntityType("content", entity)) {
433
				if (chosenContentRules.contains(Integer.parseInt(rule.getId())))
434
					tempSet.add(Integer.parseInt(rule.getId()));
435
			}
436
			entityChosenRulesMap.put(RuleTypes.getSetOfEntity(entity), tempSet);
437
		}
438
		
439
		return entityChosenRulesMap;
440
	}
441
	
442
	@Override
443
	@Transactional(propagation = Propagation.REQUIRED)
444
	public JobSubmitted submitContentJob(Properties pros, Set<Integer> crules, String user, String groupBy_xpath, OpenAIREValidatorRegistrationListener regListener) throws OpenAIREValidatorException {
445
		try {
446
			logger.debug("Submitting content job");
447
		
448
			JobSubmitted newJob = new JobSubmitted();
449

    
450
			Set<Integer> rules = new HashSet<Integer>();
451
			
452
			for (Integer ruleId : crules){
453
				RuleStored tempRule=ruleStoredDao.get(ruleId.toString());
454
				
455
				//special behaviour type of rule is chain
456
				if(tempRule.getType().equals("ChainRule")) {
457
					ChainRule<Rule> chainRule = this.handleChain(tempRule);
458
//					logger.debug("chain rule found");
459
//					RuleStored tempRuleChain1=ruleStoredDao.get(tempRule.getConfiguration().getProperty("rule_1"));
460
//					RuleStored tempRuleChain2=ruleStoredDao.get(tempRule.getConfiguration().getProperty("rule_2"));
461
//					List<Rule> rules_chain = new ArrayList<Rule>();
462
//					rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain1.getType(), tempRuleChain1.getConfiguration(), ruleIdRegistry));
463
//					ruleIdRegistry++;
464
//					rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain2.getType(), tempRuleChain2.getConfiguration(), ruleIdRegistry));
465
//					ruleIdRegistry++;
466
//					
467
//					Properties chainPros = new Properties();
468
//					chainPros.setProperty(ChainRule.TYPE,tempRule.getConfiguration().getProperty(ChainRule.TYPE));
469
//					ChainRule<Rule> chainRule = new ChainRule<Rule>(chainPros, ruleIdRegistry, rules_chain);
470
					
471
					validator.addToRegistry(ruleIdRegistry,chainRule, MemoryThreadValidator.RegistryType.rules);					
472
				}
473
				else {
474
					validator.addToRegistry(ruleIdRegistry,this.getRuleClassInstanceByType(tempRule.getType(), tempRule.getConfiguration(), ruleIdRegistry), MemoryThreadValidator.RegistryType.rules);
475
				}
476
				rules.add(ruleIdRegistry);
477
				this.linkRules(ruleIdRegistry, ruleId);
478
				ruleIdRegistry++;
479
			}
480
			if (pros.getProperty(OAIPMHRecordProvider.SET).equalsIgnoreCase("openaire_data"))
481
				pros.setProperty(OAIPMHRecordProvider.METADATA_PREFIX,"oai_datacite");
482
					
483

    
484
			Job job = new Job(this.jobIdRegistry, 1, rules, pros);
485
			this.jobIdRegistry++;
486
			
487
			newJob.setUser(user);
488
			newJob.setType("OAI Content Validation");
489
			newJob.setStatus("working");
490
			if (regListener != null) {
491
				newJob.setRuleset("Registration Request");
492
				newJob.setActivation_id(pros.getProperty("ACTIVATION_ID"));
493
			}
494
			else
495
				newJob.setRuleset("Custom");
496
			newJob.setDuration("--");
497
			newJob.setRepo(pros.getProperty(OAIPMHRecordProvider.BASEURL));
498
			newJob.setRules(crules);
499
			newJob.setRecords(pros.getProperty(OAIPMHRecordProvider.RECORDS));
500
			newJob.setSet(pros.getProperty(OAIPMHRecordProvider.SET));
501
			newJob.setGroupBy_xpath(groupBy_xpath);
502
			newJob.setMetadata_prefix(pros.getProperty(OAIPMHRecordProvider.METADATA_PREFIX));
503
			newJob.setId("-1");
504
			int jobIdStored = jobSubmittedDao.save(newJob);
505

    
506
			ValidatorJobListener listener = createListener();
507
			listener.setJobSubmittedId(jobIdStored);
508
			listener.setJobSubmittedUser(user);
509
			listener.setRuleLinkingMap(ruleLinkingMap);
510
			listener.setGroupBy_xpath(groupBy_xpath);
511
			listener.setInternalJobsSum(1);
512
			
513
			
514
			
515
//			DnetListener dnetListener = createDnetListener();
516
			
517
			if (regListener != null) {
518
				regListener.setJobId1(jobIdStored);
519
				regListener.setActivationId(pros.getProperty("ACTIVATION_ID"));
520
				validator.submitJob(job, listener, regListener);
521
			} else {
522
				OpenAIREValidatorCompatibilityTestListener compTestListener = createCompTestListener();
523
				compTestListener.setValidationSet(pros.getProperty(OAIPMHRecordProvider.SET));
524
				compTestListener.setGuidelines(pros.getProperty("guidelines"));
525
				validator.submitJob(job, listener,compTestListener);
526
			}		
527
			return newJob;
528
			
529
		} catch (Exception e) {
530
			logger.error("Error Submitting content job", e);
531
			throw new OpenAIREValidatorException(e);
532
		}
533
	}
534
	
535
	
536

    
537
	@Override
538
	@Transactional(propagation = Propagation.REQUIRED)
539
	public JobSubmitted submitUsageJob(Properties pros, Set<Integer> urules, String user, OpenAIREValidatorRegistrationListener regListener) throws OpenAIREValidatorException {
540
		try {
541
			logger.debug("Submitting Usage job(s)");
542
			JobSubmitted newJob = new JobSubmitted();
543
			
544
			List<RuleStored> rulesStored = new ArrayList<RuleStored>();
545
			for (Integer id : urules){
546
				logger.debug("Rule with id: "+id+" added");
547
				rulesStored.add(ruleStoredDao.get(id.toString()));
548
			}
549
			
550
			logger.debug("Creating map for provider information");
551
			Map<String,Set<Integer>> verbRuleMap= new HashMap<String,Set<Integer>>();
552
			Set<Integer> old,temp = null;
553
			for (RuleStored ruleStored : rulesStored){
554
				logger.debug("Checking for verb : "+ruleStored.getProvider_information());
555
		        if((old=verbRuleMap.get(ruleStored.getProvider_information())) == null){
556
		        	logger.debug("Verb doesn't exist");
557
		            temp = new HashSet<Integer>();
558
		            temp.add(Integer.parseInt(ruleStored.getId()));
559
		            verbRuleMap.put(ruleStored.getProvider_information(),temp);
560
		        }else{
561
		        	logger.debug("Verb exists");
562
		            old.add(Integer.parseInt(ruleStored.getId()));
563
		        }
564
			}
565
			
566
			Set<Integer> rules = null;
567

    
568
			Job job = null;
569
			newJob.setUser(user);
570
			newJob.setType("OAI Usage Validation");
571
			newJob.setStatus("working");
572
			if (regListener != null) {
573
				newJob.setRuleset("Registration Request");
574
				newJob.setActivation_id(pros.getProperty("ACTIVATION_ID"));
575
			}
576
			else
577
				newJob.setRuleset("Custom");
578
			newJob.setDuration("--");
579
			newJob.setRepo(pros.getProperty(OAIPMHSinglePageVerbProvider.BASEURL));
580
			newJob.setRules(urules);
581
			newJob.setMetadata_prefix(pros.getProperty(OAIPMHRecordProvider.METADATA_PREFIX));
582
//			newJob.setRecords(pros.getProperty(OAIPMHRecordProvider.RECORDS));
583
//			newJob.setSet(pros.getProperty(OAIPMHRecordProvider.SET));
584
			newJob.setId("-1");
585

    
586
			int jobIdStored = jobSubmittedDao.save(newJob);
587
			
588

    
589
			ValidatorJobListener listener = createListener();
590
			listener.setJobSubmittedId(jobIdStored);
591
			listener.setJobSubmittedUser(user);
592
			listener.setRuleLinkingMap(ruleLinkingMap);
593

    
594
//			DnetListener dnetListener = createDnetListener();
595
			
596
			
597
			
598
			
599
			listener.setInternalJobsSum(verbRuleMap.size());
600
			for (Map.Entry<String, Set<Integer>> entry : verbRuleMap.entrySet()) {
601
				pros.remove(OAIPMHSinglePageVerbProvider.VERB);
602
				pros.setProperty(OAIPMHSinglePageVerbProvider.VERB,entry.getKey());
603
				rules = new HashSet<Integer>();
604
				for (Integer ruleId : entry.getValue()){
605
					RuleStored tempRule=ruleStoredDao.get(Integer.toString(ruleId));
606
					logger.debug("prepare to add rule to registry with regexp: "+tempRule.getConfiguration().getProperty("regexp")+ " and ruleIdregistry: "+ruleIdRegistry);
607
					validator.addToRegistry(ruleIdRegistry,this.getRuleClassInstanceByType(tempRule.getType(), tempRule.getConfiguration(), ruleIdRegistry), MemoryThreadValidator.RegistryType.rules);
608
					rules.add(ruleIdRegistry);
609
					this.linkRules(ruleIdRegistry, ruleId);
610
					ruleIdRegistry++;
611
				}
612
				
613
				job = new Job(this.jobIdRegistry, 2, rules, pros);
614

    
615
				if (regListener != null) {
616
					regListener.setJobId2(jobIdStored);
617
					regListener.setActivationId(pros.getProperty("ACTIVATION_ID"));
618
					validator.submitJob(job, listener, regListener);
619
				} else {
620
					OpenAIREValidatorCompatibilityTestListener compTestListener = createCompTestListener();
621
					compTestListener.setGuidelines(pros.getProperty("guidelines"));
622
					validator.submitJob(job, listener, compTestListener);
623
				}
624
				
625
				this.jobIdRegistry++;								
626
			}
627
			return newJob;
628
		} catch (Exception e) {
629
			logger.error("Error Submitting usage job(s)", e);
630
			throw new OpenAIREValidatorException(e);
631
		}
632
	}
633
	
634
	@Override
635
	public List<JobSubmitted> getJobsOfUser(String user) throws OpenAIREValidatorException {
636
		try {
637
			logger.debug("getting jobs of user " + user);
638
			if (this.userOverridesRepoRegistration(user))
639
				return jobSubmittedDao.getJobs();
640
			else
641
				return jobSubmittedDao.getJobsOfUser(user);
642

    
643
		} catch (Exception e) {
644
			logger.error("Error getting jobs of user " + user, e);
645
			throw new OpenAIREValidatorException(e);
646
		}
647
	}	
648

    
649
	@Override
650
	@Transactional(propagation = Propagation.REQUIRED)
651
	public String addNewRule(String type, String jobType, String entityType, String[] inputs) throws OpenAIREValidatorException{
652
		try {
653
			logger.debug("adding new rule using the inputs of the user");
654
			RuleStored newRule = new RuleStored();
655
			List<String> fields = new ArrayList<String>();
656
			List<FieldDetails> generalFields = FieldsAndDetails.getFieldsAndDetails("Rules");
657
			List<FieldDetails> subFields = FieldsAndDetails.getFieldsAndDetails(TableNames.getTableNameByClass(RuleTypes.getClassOfType(type)));
658
			for (FieldDetails field : generalFields) {
659
				if (field.isForDet() && !field.getFieldName().equals(FieldNames.RULE_TYPE) && !field.getFieldName().equals(FieldNames.RULE_JOBTYPE))
660
					fields.add(field.getFieldName());
661
			}
662
			if (subFields != null) {
663
				for (FieldDetails field : subFields) {
664
					if (field.isForDet())
665
						fields.add(field.getFieldName());
666
				}
667
			}
668
			Properties pros = new Properties();
669
			for (int i = 0; i < inputs.length; i++) {
670
				if (fields.get(i).equals(FieldNames.RULE_NAME)) {
671
					newRule.setName(inputs[i]);
672
				}
673
				else if (fields.get(i).equals(FieldNames.RULE_DESCRIPTION)) {
674
					newRule.setDescription(inputs[i]);
675
				}
676
				else if (fields.get(i).equals(FieldNames.RULE_MANDATORY)) {
677
					newRule.setMandatory(inputs[i]);
678
				}				
679
				else if (fields.get(i).equals(FieldNames.RULE_WEIGHT)) {
680
					newRule.setWeight(inputs[i]);
681
				}
682
				else if (fields.get(i).equals(FieldNames.RULE_PROVIDER_INFORMATION)) {
683
					newRule.setProvider_information(inputs[i]);
684
				}
685
				else{
686
					if (fields.get(i).equals(FieldNames.RULE_VOCABULARY_WORDS)) {
687
						String words = "";
688
						BufferedReader bf = new BufferedReader(new StringReader(inputs[i]));
689
						String line;
690
						while ((line = bf.readLine()) != null) {
691
							words += ",";
692
							words += line;
693
						}
694
//							words += line + "\n";
695
						words = words.substring(1);
696
//						words = words.substring(0, words.lastIndexOf('\n'));
697
						pros.setProperty(fields.get(i), words);
698
					
699
					} else if (fields.get(i).equals(FieldNames.RULE_NOTCONNFUSEDFIELDS)) {
700
						String ncfields = "";
701
						BufferedReader bf = new BufferedReader(new StringReader(inputs[i]));
702
						String line;
703
						while ((line = bf.readLine()) != null)
704
							ncfields += line + "\n";
705
						ncfields = ncfields.substring(0, ncfields.lastIndexOf('\n'));
706
						pros.setProperty(fields.get(i), ncfields);
707
					
708
					}else  
709
						pros.setProperty(fields.get(i), inputs[i]);
710
				}
711
			}
712
			newRule.setId("-1");
713
			newRule.setJob_type(JobTypes.getClassOfType(jobType));
714
			newRule.setEntity_type(entityType);
715
			newRule.setType(type);
716
			newRule.setConfiguration(pros);
717
						
718
			ruleStoredDao.save(newRule);
719
			
720
			return null;
721
		} catch (Exception e) {
722
			logger.error("Error adding new rule", e);
723
			throw new OpenAIREValidatorException(e);
724
		}
725
	}
726

    
727
	@Override
728
	@Transactional(propagation = Propagation.REQUIRED)
729
	public String editRule(String ruleId, String type, String jobType, String entityType, String[] inputs) throws OpenAIREValidatorException {
730
		try {
731
			logger.debug("edit rule using the inputs of the user");
732
			RuleStored newRule = new RuleStored();
733
			List<String> fields = new ArrayList<String>();
734
			List<FieldDetails> generalFields = FieldsAndDetails.getFieldsAndDetails("Rules");
735
			List<FieldDetails> subFields = FieldsAndDetails.getFieldsAndDetails(TableNames.getTableNameByClass(RuleTypes.getClassOfType(type)));
736
			for (FieldDetails field : generalFields) {
737
				if (field.isForDet() && !field.getFieldName().equals(FieldNames.RULE_TYPE) && !field.getFieldName().equals(FieldNames.RULE_JOBTYPE))
738
					fields.add(field.getFieldName());
739
			}
740
			if (subFields != null) {
741
				for (FieldDetails field : subFields) {
742
					if (field.isForDet())
743
						fields.add(field.getFieldName());
744
				}
745
			}
746
			Properties pros = new Properties();
747
			for (int i = 0; i < inputs.length; i++) {
748
				if (fields.get(i).equals(FieldNames.RULE_NAME)) {
749
					newRule.setName(inputs[i]);
750
				}
751
				else if (fields.get(i).equals(FieldNames.RULE_DESCRIPTION)) {
752
					newRule.setDescription(inputs[i]);
753
				}
754
				else if (fields.get(i).equals(FieldNames.RULE_MANDATORY)) {
755
					newRule.setMandatory(inputs[i]);
756
				}				
757
				else if (fields.get(i).equals(FieldNames.RULE_WEIGHT)) {
758
					newRule.setWeight(inputs[i]);
759
				}
760
				else if (fields.get(i).equals(FieldNames.RULE_PROVIDER_INFORMATION)) {
761
					newRule.setProvider_information(inputs[i]);
762
				}
763
				else{
764
					if (fields.get(i).equals(FieldNames.RULE_VOCABULARY_WORDS)) {
765
						String words = "";
766
						BufferedReader bf = new BufferedReader(new StringReader(inputs[i]));
767
						String line;
768
						while ((line = bf.readLine()) != null) {
769
							words += ",";
770
							words += line;
771
						}
772
//							words += line + "\n";
773
						words = words.substring(1);
774
//						words = words.substring(0, words.lastIndexOf('\n'));
775
						pros.setProperty(fields.get(i), words);
776
//						while ((line = bf.readLine()) != null)
777
//							words += line + "\n";
778
//						words = words.substring(0, words.lastIndexOf('\n'));
779
//						pros.setProperty(fields.get(i), words);
780
					
781
					} else if (fields.get(i).equals(FieldNames.RULE_NOTCONNFUSEDFIELDS)) {
782
						String ncfields = "";
783
						BufferedReader bf = new BufferedReader(new StringReader(inputs[i]));
784
						String line;
785
						while ((line = bf.readLine()) != null)
786
							ncfields += line + "\n";
787
						ncfields = ncfields.substring(0, ncfields.lastIndexOf('\n'));
788
						pros.setProperty(fields.get(i), ncfields);
789
					
790
					}else  
791
						pros.setProperty(fields.get(i), inputs[i]);
792
				}
793
			}
794
			newRule.setId(ruleId);
795
			newRule.setJob_type(JobTypes.getClassOfType(jobType));
796
			newRule.setEntity_type(entityType);
797
			newRule.setType(type);
798
			newRule.setConfiguration(pros);
799
			
800
			ruleStoredDao.save(newRule);
801
			
802
			return null;
803

    
804
		} catch (Exception e) {
805
			logger.error("Error editing rule", e);
806
			throw new OpenAIREValidatorException(e);
807
		}
808
	}
809
	
810
	@Override
811
	public RuleStored getRule(String ruleId) throws OpenAIREValidatorException {
812
		try {
813
			logger.debug("getting rule with id: "+ruleId);
814
			return ruleStoredDao.get(ruleId);
815
		} catch (Exception e) {
816
			logger.error("Error getting rule ", e);
817
			throw new OpenAIREValidatorException(e);
818
		}
819
		
820
	}
821
		
822
	@Override
823
	public List<FieldPair> getRuleValuePairs(String ruleId) throws OpenAIREValidatorException {
824
		try {
825
			logger.debug("getting rule value pairs");
826
			RuleStored rule = ruleStoredDao.get(ruleId);
827
			List<String> labels = new ArrayList<String>();
828
			List<FieldDetails> generalFields = FieldsAndDetails.getFieldsAndDetails("Rules");
829
			List<FieldDetails> subFields = FieldsAndDetails.getFieldsAndDetails(TableNames.getTableNameByClass(RuleTypes.getClassOfType(rule.getType())));
830
			for (FieldDetails field : generalFields) {
831
				if (field.isForDet() && !field.getFieldName().equals(FieldNames.RULE_TYPE) && !field.getFieldName().equals(FieldNames.RULE_JOBTYPE))
832
					labels.add(field.getTableName() + "." + field.getFieldName());
833
			}
834
			if (subFields != null) {
835
				for (FieldDetails field : subFields) {
836
					if (field.isForDet())
837
						labels.add(field.getTableName() + "." + field.getFieldName());
838
				}
839
			}
840

    
841
			List<FieldPair> ruleValues = new ArrayList<FieldPair>();
842
			for (String fieldName : labels) {
843
				FieldPair pair = new FieldPair();
844
//				String fieldValue=null;
845
				pair.setFieldName(fieldName);
846
				if (fieldName.split("\\.")[1].equals(FieldNames.RULE_NAME)) {
847
					pair.setFieldValue(rule.getName());
848
				}
849
				else if (fieldName.split("\\.")[1].equals(FieldNames.RULE_DESCRIPTION)) {
850
					pair.setFieldValue(rule.getDescription());
851
				}
852
				else if (fieldName.split("\\.")[1].equals(FieldNames.RULE_MANDATORY)) {
853
					pair.setFieldValue(rule.getMandatory());
854
				}				
855
				else if (fieldName.split("\\.")[1].equals(FieldNames.RULE_WEIGHT)) {
856
					pair.setFieldValue(rule.getWeight());
857
				}
858
				else if (fieldName.split("\\.")[1].equals(FieldNames.RULE_PROVIDER_INFORMATION)) {
859
					pair.setFieldValue(rule.getProvider_information());
860
				}
861
				else{
862
						pair.setFieldValue(rule.getConfiguration().getProperty(fieldName.split("\\.")[1]));
863
				}				
864
				logger.debug("getting rule value pairs-addpair: "+fieldName+"-"+rule.getConfiguration().getProperty(fieldName.split("\\.")[1]));
865
				ruleValues.add(pair);
866
			}
867
			return ruleValues;
868
		} catch (Exception e) {
869
			logger.error("Error getting ruleValue pairs", e);
870
			throw new OpenAIREValidatorException(e);
871
		}
872

    
873
	}	
874
	
875

    
876
	@Override
877
	public Properties getRuleProperties(String ruleId) throws OpenAIREValidatorException {
878
		try {
879
			logger.debug("getting rule properties with id "+ruleId);
880
			return ruleStoredDao.getProperties(ruleId);
881
		}
882
		catch (Exception e) {
883
			logger.error("Error getting rule properties with id "+ruleId, e);
884
			throw new OpenAIREValidatorException(e);
885
		}
886
		
887
	}
888
	
889

    
890
	@Override
891
	public String deleteRule(String ruleId) throws OpenAIREValidatorException {
892
		try {
893
			logger.debug("deleting rule with id "+ruleId);
894
			return ruleStoredDao.delete(ruleId);
895
		}
896
		catch (Exception e) {
897
			logger.error("Error deleting rule with id "+ruleId, e);
898
			throw new OpenAIREValidatorException(e);
899
		}
900
	}
901

    
902
	@Override
903
	public List<String> getConstantRuleTypes() throws OpenAIREValidatorException {
904
		try {
905
			logger.debug("getting all rule types");
906
			List<String> ruleTypes = new ArrayList<String>();
907
			for (String rule : RuleTypes.getTypes())
908
				ruleTypes.add(rule);
909
			return ruleTypes;
910
		}
911
		catch (Exception e) {
912
			logger.error("Error getting all rule types", e);
913
			throw new OpenAIREValidatorException(e);
914
		}
915
	}
916

    
917
	@Override
918
	public String[] getJobTypesAsArray() throws OpenAIREValidatorException {
919
		logger.debug("getting job types as array");
920
		return JobTypes.getTypes();
921
	}
922

    
923
	@Override
924
	public List<String> getRuleLabels(String type) throws OpenAIREValidatorException {
925
		try {
926
			logger.debug("getting rule labels for type " + type);
927
			List<String> labels = new ArrayList<String>();
928
			List<FieldDetails> generalFields = FieldsAndDetails.getFieldsAndDetails("Rules");
929
			List<FieldDetails> subFields = FieldsAndDetails.getFieldsAndDetails(TableNames.getTableNameByClass(RuleTypes.getClassOfType(type)));
930
			for (FieldDetails field : generalFields) {
931
				if (field.isForDet() && !field.getFieldName().equals(FieldNames.RULE_TYPE) && !field.getFieldName().equals(FieldNames.RULE_JOBTYPE))
932
					labels.add(field.getTableName() + "." + field.getFieldName());
933
			}
934
			if (subFields != null) {
935
				for (FieldDetails field : subFields) {
936
					if (field.isForDet())
937
						labels.add(field.getTableName() + "." + field.getFieldName());
938
				}
939
			}
940
			return labels;
941
		}catch (Exception e) {
942
			logger.error("getting rule labels for type " + type, e);
943
			throw new OpenAIREValidatorException(e);
944
		}			
945
	}
946

    
947
	@Override
948
	public Serializable getRuleClassInstanceByType(String type, Properties pros, int id) throws OpenAIREValidatorException {
949
		logger.debug("getting rule object of type "+type);
950
		String classname = RuleTypes.getClassOfType(type);
951
		if (classname == null){
952
			logger.debug("error getting rule object of type "+type+" classname=null");
953
			return null;
954
		}
955
		else {
956
			try {
957
				Class<?> clazz = Class.forName(classname);
958
				logger.debug("classname: "+clazz.getName());
959
				return (Serializable) clazz.getConstructor(new Class[]{Properties.class,Integer.TYPE}).newInstance(pros,id);
960
				
961
			} catch (ClassNotFoundException e) {
962
				logger.debug("error getting rule object: "+e);
963
				return null;
964
			} catch (NoSuchMethodException e) {
965
				logger.debug("error getting rule object: "+e);
966
				return null;
967
			} catch (InvocationTargetException e) {
968
				logger.debug("error getting rule object: "+e);
969
				return null;
970
			} catch (InstantiationException e) {
971
				logger.debug("error getting rule object: "+e);
972
				return null;
973
			} catch (IllegalAccessException e) {
974
				logger.debug("error getting rule object: "+e);
975
				return null;
976
			}
977
		}
978

    
979
	}
980

    
981

    
982
	@Override
983
	public List<String> getAllRuleIdsByJobType(String jobType)
984
			throws OpenAIREValidatorException {
985
		try {
986
			logger.debug("getting all rule ids by job Type");
987
			List<String> retList= new ArrayList<String>();
988
			List<RuleStored> tempList = ruleStoredDao.getAllRulesByJobType(jobType);
989
			for (RuleStored rule : tempList ){
990
				retList.add(rule.getId());
991
			}
992
			return retList;			
993
		}
994
		catch (Exception e) {
995
			logger.error("Error getting all rule ids by job Type", e);
996
			throw new OpenAIREValidatorException(e);
997
		}
998
	}
999

    
1000

    
1001

    
1002

    
1003
	@Override
1004
	public List<String> getValidationErrors(int jobId, int ruleId) throws OpenAIREValidatorException {
1005
			try {
1006
				logger.debug("getting validation errors of job " + jobId + " and rule " + ruleId);
1007
				return taskStoredDao.getValidationErrors(Integer.toString(jobId),Integer.toString(ruleId));				
1008
			} catch (Exception e) {
1009
				logger.error("Error getting validation errors of job " + jobId + " and rule " + ruleId, e);
1010
				throw new OpenAIREValidatorException(e);
1011
			}
1012
		}
1013

    
1014
	@Override
1015
	public boolean userOverridesRepoRegistration(String user)
1016
			throws OpenAIREValidatorException {
1017
		logger.debug("checking if user " + user + " overrides repo registration procedures");
1018
		if (this.repoRegistrationOverride.contains(user)) {
1019
			logger.debug("overrides");
1020
			return true;
1021
		} else {
1022
			logger.debug("not overrides");
1023
			return false;
1024
		}
1025
	}
1026
	
1027
	@Override
1028
	public JobSubmitted getJobSubmitted(String jobId) throws OpenAIREValidatorException {
1029
		try {
1030
			logger.debug("getting submitted job with id " + jobId);
1031
			return jobSubmittedDao.get(jobId);
1032
		}catch (Exception e) {
1033
			logger.error("getting submitted job with id " + jobId, e);
1034
			throw new OpenAIREValidatorException(e);
1035
		}			
1036
	}
1037

    
1038
	@Override
1039
	public List<Entry> getJobSummary(String jobId, String groupBy) throws OpenAIREValidatorException {
1040
		try {
1041
			logger.debug("Getting job summary for job " + jobId +" with groupBy: "+groupBy);
1042
			List<Entry> entries = null;
1043
			if(jobSubmittedDao.getJobError(jobId))
1044
				return null;
1045
			entries = jobSubmittedDao.getJobSummary(jobId,groupBy);
1046
			return entries;
1047
		} catch (Exception e) {
1048
			logger.error("error getting job summary for job " + jobId, e);
1049
			throw new OpenAIREValidatorException(e);
1050
		}
1051
	}
1052

    
1053
	@Override
1054
	@Transactional(propagation = Propagation.REQUIRED)
1055
	public void deleteOldJobs(String date,String mode) throws OpenAIREValidatorException {
1056
		try {
1057
			logger.debug("Deleting jobs older than "+date);
1058
			if (mode.equalsIgnoreCase("uncompleted_only")) {
1059
				jobSubmittedDao.deleteUncompletedJobs();
1060
				jobSubmittedDao.deleteJobsForRegistration();
1061
			}
1062
			else if (mode.equalsIgnoreCase("custom_only"))
1063
				jobSubmittedDao.deleteOldCustomOnly(date);
1064
			else if (mode.equalsIgnoreCase("all"))
1065
				jobSubmittedDao.deleteOld(date);
1066
		} catch (Exception e) {
1067
			logger.error("Error deleting old jobs", e);
1068
			throw new OpenAIREValidatorException(e);
1069
		}
1070
	}
1071
	
1072
	@Override
1073
	@Transactional(propagation = Propagation.REQUIRED)
1074
	public void cleanUncompletedJobs() throws OpenAIREValidatorException {
1075
		try {
1076
			logger.debug("Deleting uncompleted jobs");
1077
			jobSubmittedDao.deleteJobsForRegistration();
1078
		} catch (Exception e) {
1079
			logger.error("Error deleting old jobs", e);
1080
			throw new OpenAIREValidatorException(e);
1081
		}
1082
	}
1083

    
1084
	@Override
1085
	@Transactional(propagation = Propagation.REQUIRED)
1086
	public List<String> getDistinctGroupByValues(String jobId) throws OpenAIREValidatorException {
1087
		List<String> ret = null;
1088
		try {
1089
			logger.debug("Getting distinct groupBy values for job:"+ jobId );
1090
			ret = jobSubmittedDao.getDistinctGroupByValues(jobId);
1091
	
1092
		} catch (Exception e) {
1093
			logger.error("Error Getting distinct groupBy values for job", e);
1094
			throw new OpenAIREValidatorException(e);
1095
		}
1096
		return ret;
1097
	}
1098
	
1099
	@Override
1100
	@Transactional(propagation = Propagation.REQUIRED)
1101
	public String getFilteredScore(String jobId, String groupBy) throws OpenAIREValidatorException {
1102
		String ret = null;
1103
		try {
1104
			logger.debug("Getting filtered score for job:"+ jobId+ " and groupBy: "+groupBy );
1105
			ret = jobSubmittedDao.getFilteredScore(jobId, groupBy);
1106
	
1107
		} catch (Exception e) {
1108
			logger.error("Error Getting distinct groupBy values for job", e);
1109
			throw new OpenAIREValidatorException(e);
1110
		}
1111
		return ret;
1112
	}
1113
	
1114
	@Override
1115
	public Map<String, String> getRuleSetsMap() throws OpenAIREValidatorException {
1116
		Map<String, String> map = new HashMap<String, String>();
1117
		List<RuleSet> ruleSets = ruleSetDao.getRuleSetIdNames();
1118
		for(RuleSet ruleSet : ruleSets)
1119
		{
1120
			map.put(ruleSet.getId().toString(), ruleSet.getName());
1121
		}
1122
		return map;
1123
	}
1124
	
1125
	@Override
1126
	public Map<String, String> getRuleSetsMap(String deployEnvironment) throws OpenAIREValidatorException {
1127
		Map<String, String> map = new HashMap<String, String>();
1128
		List<RuleSet> ruleSets = ruleSetDao.getRuleSetIdNames();
1129
		for(RuleSet ruleSet : ruleSets)
1130
		{
1131
			if (ruleSet.getVisibility().contains(deployEnvironment))
1132
				map.put(ruleSet.getId().toString(), ruleSet.getName());
1133
		}
1134
		return map;
1135
	}
1136
	
1137
	private ChainRule<Rule> handleChain(RuleStored tempRule) throws OpenAIREValidatorException {
1138
		logger.debug("chain rule found");
1139
		List<Rule> rules_chain = new ArrayList<Rule>();
1140
		RuleStored tempRuleChain1=ruleStoredDao.get(tempRule.getConfiguration().getProperty("rule_1"));
1141
		if(tempRuleChain1.getType().equals("ChainRule")) {
1142
			ChainRule<Rule> chainRule1 = this.handleChain(tempRuleChain1);
1143
			rules_chain.add(chainRule1);
1144
			ruleIdRegistry++;
1145
		} else {
1146
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain1.getType(), tempRuleChain1.getConfiguration(), ruleIdRegistry));
1147
			ruleIdRegistry++;
1148
		}
1149
		RuleStored tempRuleChain2=ruleStoredDao.get(tempRule.getConfiguration().getProperty("rule_2"));
1150
		if(tempRuleChain2.getType().equals("ChainRule")) {
1151
			ChainRule<Rule> chainRule2 = this.handleChain(tempRuleChain2);
1152
			rules_chain.add(chainRule2);
1153
			ruleIdRegistry++;
1154
		} else {
1155
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain2.getType(), tempRuleChain2.getConfiguration(), ruleIdRegistry));
1156
			ruleIdRegistry++;
1157
		}
1158
		Properties chainPros = new Properties();
1159
		chainPros.setProperty(ChainRule.TYPE,tempRule.getConfiguration().getProperty(ChainRule.TYPE));
1160
		ChainRule<Rule> chainRule = new ChainRule<Rule>(chainPros, ruleIdRegistry, rules_chain);
1161
		return chainRule;
1162
	}
1163
	
1164

    
1165

    
1166
	public RuleSetDAO getRuleSetDao() {
1167
		return ruleSetDao;
1168
	}
1169

    
1170
	public void setRuleSetDao(RuleSetDAO ruleSetDao) {
1171
		this.ruleSetDao = ruleSetDao;
1172
	}
1173

    
1174
	public Validator getValidator() {
1175
		return validator;
1176
	}
1177

    
1178
	public void setValidator(Validator validator) {
1179
		this.validator = validator;
1180
	}
1181

    
1182
	public RuleStoredDAO getRuleWebDao() {
1183
		return ruleStoredDao;
1184
	}
1185

    
1186
	public void setRuleWebDao(RuleStoredDAO ruleWebDao) {
1187
		this.ruleStoredDao = ruleWebDao;
1188
	}
1189

    
1190
	public JobSubmittedDAO getJobSubmittedDao() {
1191
		return jobSubmittedDao;
1192
	}
1193

    
1194
	public void setJobSubmittedDao(JobSubmittedDAO jobSubmittedDao) {
1195
		this.jobSubmittedDao = jobSubmittedDao;
1196
	}
1197

    
1198
	@Override
1199
	public void linkRules(int ruleRegistry, int ruleStored) {
1200
		this.ruleLinkingMap.put(ruleRegistry, ruleStored);	
1201
	}
1202

    
1203
	@Override
1204
	public int getRuleFromLink(int ruleRegistry) {
1205
		return this.ruleLinkingMap.get(ruleRegistry);
1206
	}
1207

    
1208
	public RuleStoredDAO getRuleStoredDao() {
1209
		return ruleStoredDao;
1210
	}
1211

    
1212
	public void setRuleStoredDao(RuleStoredDAO ruleStoredDao) {
1213
		this.ruleStoredDao = ruleStoredDao;
1214
	}
1215

    
1216
	public TaskStoredDAO getTaskStoredDao() {
1217
		return taskStoredDao;
1218
	}
1219

    
1220
	public void setTaskStoredDao(TaskStoredDAO taskStoredDao) {
1221
		this.taskStoredDao = taskStoredDao;
1222
	}
1223

    
1224
	public Emailer getEmailer() {
1225
		return emailer;
1226
	}
1227
	public void setEmailer(Emailer emailer) {
1228
		this.emailer = emailer;
1229
	}
1230
	public String getValBaseUrl() {
1231
		return valBaseUrl;
1232
	}
1233
	public void setValBaseUrl(String valBaseUrl) {
1234
		this.valBaseUrl = valBaseUrl;
1235
	}
1236
	public Map<Integer, Integer> getRuleLinkingMap() {
1237
		return ruleLinkingMap;
1238
	}
1239

    
1240
	public void setRuleLinkingMap(Map<Integer, Integer> ruleLinkingMap) {
1241
		this.ruleLinkingMap = ruleLinkingMap;
1242
	}
1243

    
1244
	public Integer getJobIdRegistry() {
1245
		return jobIdRegistry;
1246
	}
1247

    
1248
	public void setJobIdRegistry(Integer jobIdRegistry) {
1249
		this.jobIdRegistry = jobIdRegistry;
1250
	}
1251

    
1252
	public Integer getRuleIdRegistry() {
1253
		return ruleIdRegistry;
1254
	}
1255

    
1256
	public void setRuleIdRegistry(Integer ruleIdRegistry) {
1257
		this.ruleIdRegistry = ruleIdRegistry;
1258
	}
1259

    
1260
//	public List<String> getRepoRegistrationOverride() {
1261
//		return repoRegistrationOverride;
1262
//	}
1263

    
1264
	public void setRepoRegistrationOverride(String repoRegistrationOverride) {
1265
		String[] recps = repoRegistrationOverride.split(",");
1266

    
1267
		for (String recp : recps) {
1268
			recp = recp.trim();
1269
			this.repoRegistrationOverride.add(recp);
1270
		}
1271
	}
1272

    
1273
	public ValidatorRestore getValRestore() {
1274
		return valRestore;
1275
	}
1276

    
1277

    
1278
	public void setValRestore(ValidatorRestore valRestore) {
1279
		this.valRestore = valRestore;
1280
	}
1281
	
1282
}
1283

    
1284
/*
1285
public List<Entry> getJobSummary(String jobId) throws OpenAIREValidatorException {
1286
	try {
1287
		logger.debug("Getting job summary for job " + jobId);
1288
		List<Entry> entries = null;
1289
		entries = new ArrayList<Entry>();
1290
		if(jobSubmittedDao.getJobError(jobId))
1291
			return null;
1292
		List<String> ruleIds = taskStoredDao.getDistinctTasksOfJob(jobId);
1293
		new ArrayList<Integer>();
1294
		float score = 0;
1295
		float weights = 0 ;
1296
		for (String ruleId : ruleIds) {
1297
			int successes = 0, total = 0;
1298
			float perc = 0;
1299
			List<String> errors = new ArrayList<String>();
1300
			Entry entry = new Entry();
1301
			List<TaskStored> tasksFinished = taskStoredDao.getFinishedTasks(jobId,ruleId);
1302
			for(TaskStored task : tasksFinished){
1303
				total++;
1304
				if (task.getSuccess())
1305
					successes++;
1306
				else
1307
					errors.add(task.getRecordIdentifier());
1308
			}
1309
			if (total > 0)
1310
				entry.setSuccesses(successes + "/" + total);
1311
			else
1312
				entry.setSuccesses("--");
1313
			entry.setErrors(errors);
1314
			RuleStored rule = ruleStoredDao.get(ruleId);
1315
			if (rule.getMandatory().equals("true"))
1316
				weights += Integer.parseInt(rule.getWeight());
1317
			entry.setName(rule.getName());
1318
			entry.setDescription(rule.getDescription());
1319
			entry.setWeight(Integer.parseInt(rule.getWeight()));
1320
			entry.setRuleId(Integer.parseInt(rule.getId()));
1321
			if (successes < total)
1322
				entry.setHasErrors(true);
1323
			else
1324
				entry.setHasErrors(false);
1325
			perc=100*successes/total;
1326
			if (rule.getMandatory().equals("true"))
1327
				score += perc * Integer.parseInt(rule.getWeight());
1328
			entries.add(entry);
1329
		}
1330
		score /= weights;
1331
		
1332
		jobSubmittedDao.setScore(jobId,Integer.toString((int)Math.ceil(score)));
1333
		return entries;
1334
	} catch (Exception e) {
1335
		logger.error("error getting job summary for job " + jobId, e);
1336
		throw new OpenAIREValidatorException(e);
1337
	}
1338
} */
1339

    
(5-5/7)