Project

General

Profile

1
package eu.dnetlib.validator.service.impl;
2

    
3
import eu.dnetlib.domain.functionality.validator.CustomProperties;
4
import eu.dnetlib.domain.functionality.validator.JobForValidation;
5
import eu.dnetlib.domain.functionality.validator.RuleSet;
6
import eu.dnetlib.domain.functionality.validator.StoredJob;
7
import eu.dnetlib.enabling.tools.blackboard.BlackboardJob;
8
import eu.dnetlib.enabling.tools.blackboard.BlackboardNotificationHandler;
9
import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler;
10
import eu.dnetlib.validator.commons.dao.DaoException;
11
import eu.dnetlib.validator.commons.dao.jobs.JobsDAO;
12
import eu.dnetlib.validator.commons.dao.rules.RulesDAO;
13
import eu.dnetlib.validator.commons.dao.rules.RulesetsDAO;
14
import eu.dnetlib.validator.commons.email.Emailer;
15
import eu.dnetlib.validator.engine.Validator;
16
import eu.dnetlib.validator.engine.ValidatorException;
17
import eu.dnetlib.validator.engine.data.Rule;
18
import eu.dnetlib.validator.engine.execution.Job;
19
import eu.dnetlib.validator.service.impls.ValidatorRestore;
20
import eu.dnetlib.validator.service.impls.listeners.*;
21
import eu.dnetlib.validator.service.impls.providers.DnetProvider;
22
import eu.dnetlib.validator.service.impls.providers.OAIPMHRecordProvider;
23
import eu.dnetlib.validator.service.impls.providers.OAIPMHSinglePageVerbProvider;
24
import eu.dnetlib.validator.service.impls.rules.ChainRule;
25
import eu.dnetlib.validator.service.impls.rules.RuleTypes;
26
import org.apache.log4j.Logger;
27
import org.springframework.transaction.annotation.Propagation;
28
import org.springframework.transaction.annotation.Transactional;
29

    
30
import java.util.*;
31

    
32
@Transactional
33
public class ValidatorManagerImpl implements ValidatorManager {
34

    
35
        private Emailer emailer;
36
        private Validator validator;
37
	private JobsDAO jobsDao;
38
	private RulesetsDAO rulesetsDao;
39
	private RulesDAO rulesDao;
40
	private ValidatorRestore valRestore;
41
	
42
	
43
	private static Logger logger = Logger.getLogger(ValidatorManagerImpl.class);
44

    
45
	private ListenersManager listenersManager;
46
//	this.restartJobs();
47
	public void start() {
48
		logger.info("Initializing Validator Manager module");
49
		if (valRestore.isAutoRestoreOnStartup()) {
50
			logger.info("auto-restoring OpenAire Validator is enabled..");
51
			List<StoredJob> jobs = valRestore.deleteUncompleted();
52
			valRestore.restartJobs(jobs);
53
			logger.info("finished restoring OpenAire Validator..");
54
		} else {
55
			logger.info("auto-restoring OpenAire Validator is disabled..");
56
		}
57
	}
58
	
59
	public StoredJob getStoredJob(int jobId, String groupBy)
60
			throws ValidatorException {
61
		try {
62
			logger.info("Getting job summary for job " + jobId +" with groupBy: "+groupBy);
63
			return jobsDao.getJobSummary(jobId,groupBy);
64
		} catch (Exception e) {
65
			logger.error("error getting job summary for job " + jobId, e);
66
			throw new ValidatorException(e);
67
		}
68
	}
69
	
70
	public List<StoredJob> getStoredJobs(String userMail, String jobType,
71
			Integer offset, Integer limit, String dateFrom, String dateTo)
72
			throws ValidatorException {
73
		return this.getStoredJobs(userMail, jobType, offset, limit, dateFrom, dateTo, null);
74

    
75
	}
76

    
77
	public List<StoredJob> getStoredJobs(String userMail, String jobType,
78
										 Integer offset, Integer limit, String dateFrom, String dateTo, String jobStatus)
79
			throws ValidatorException {
80
		try {
81
			logger.debug("Getting jobs of user " + userMail);
82
			return jobsDao.getJobs(userMail, jobType, offset, limit, dateFrom, dateTo, jobStatus);
83
		} catch (Exception e) {
84
			logger.error("error Getting jobs of user " + userMail, e);
85
			throw new ValidatorException(e);
86
		}
87
	}
88

    
89
	public int getStoredJobsTotalNumber(String userMail, String jobType)
90
			throws ValidatorException {
91
		return this.getStoredJobsTotalNumber(userMail, jobType, null);
92
	}
93

    
94
	public int getStoredJobsTotalNumber(String userMail, String jobType, String jobStatus)
95
			throws ValidatorException {
96
		try {
97
			logger.debug("Getting jobs total sum of user " + userMail);
98
			return jobsDao.getJobsTotalNumber(userMail, jobType, jobStatus);
99
		} catch (Exception e) {
100
			logger.error("error Getting jobs sum of user " + userMail, e);
101
			throw new ValidatorException(e);
102
		}
103
	}
104
	
105
	public List<RuleSet> getRuleSets() throws ValidatorException {
106
		try {
107
			logger.info("Getting rulesets");
108
			return rulesetsDao.getRuleSets();
109
		} catch (Exception e) {
110
			logger.error("error Getting rulesets ", e);
111
			throw new ValidatorException(e);
112
		}
113
	}
114

    
115
	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
116
	public StoredJob beginDataJobForWorkflow(String mdstoreId, String guidelines, String groupBy, int records, int workers, BlackboardJob bJob, BlackboardNotificationHandler<BlackboardServerHandler> blackboardHandler, int jobStatusUpdateInterval, boolean outputEpr, boolean blacklistedRecords, String blacklistGuidelines) throws ValidatorException{
117
		try {
118
			logger.info("Submitting data job for workflow");
119
//			String desiredCompatibility = "openaire3.0";
120
			Set<Integer> ruleIdsForBlacklist = new HashSet<Integer>();
121
			Set<Integer> ruleIdsContent = new HashSet<Integer>();
122
			for (RuleSet ruleset : rulesetsDao.getRuleSets()) {
123
				if (ruleset.getGuidelinesAcronym().equals(guidelines)) {
124
					ruleIdsContent = ruleset.getContentRulesIds();
125
				}	
126
				if (blacklistedRecords && ruleset.getGuidelinesAcronym().equals(blacklistGuidelines)) {
127
					ruleIdsForBlacklist = ruleset.getContentRulesIds();
128
					ruleIdsContent.addAll(ruleIdsForBlacklist);
129
				}
130
			}
131
			
132
			Properties props = new Properties();
133

    
134
			props.setProperty(DnetProvider.MDSTORE_ID, mdstoreId);
135
			props.setProperty(DnetProvider.BATCH_SIZE, "50");
136
			if (bJob.getParameters().get("batchSize") != null )
137
				props.setProperty(DnetProvider.BATCH_SIZE, bJob.getParameters().get("batchSize"));
138
			
139
			props.setProperty(DnetProvider.RECORDS, Integer.toString(records));
140
			
141
			StoredJob newJob = new StoredJob();
142
			newJob.setUserEmail("Workflow Service");
143
			newJob.setValidationType("C");
144
			newJob.setDesiredCompatibilityLevel(guidelines);
145
			newJob.setContentJobStatus("ongoing");
146
			newJob.setUsageJobStatus("none");
147
			newJob.setJobType("Workflow Request");
148
			newJob.setDuration("--");
149
			newJob.setBaseUrl(mdstoreId);
150
			newJob.setRules(ruleIdsContent);
151
			newJob.setRecords(records);
152
			newJob.setValidationSet("dnet-workflow");
153
			newJob.setGroupByXpath(groupBy);
154
			newJob.setMetadataPrefix("oai_dc");
155
			newJob.setId(-1);
156
	
157
			int jobIdStored = jobsDao.save(newJob);
158
					
159
			Set<Rule> rulesContent = new HashSet<Rule>();
160
			
161
			logger.debug("Selected content rules number: " + ruleIdsContent.size());
162
			for (Integer ruleId : ruleIdsContent){
163
				
164
				eu.dnetlib.domain.functionality.validator.Rule tempRule=rulesDao.get(ruleId);
165
				
166
				//special behaviour type of rule is chain
167
				if(tempRule.getType().equals("ChainRule")) {
168
					ChainRule<Rule> chainRule = this.handleChain(tempRule);
169
					rulesContent.add(chainRule);
170
				}
171
				else {
172
					rulesContent.add((Rule) this.getRuleClassInstanceByType(tempRule.getType(), tempRule.getConfiguration(), tempRule.getId()));
173
				}
174
			}
175
			
176
			Job jobContent = new Job(jobIdStored, 3, rulesContent, props);
177
			
178
			ValidatorJobListener listenerContent = listenersManager.createListener();
179
			listenerContent.setJobSubmittedId(jobIdStored);
180
			listenerContent.setJobSubmittedUser("Workflow Service");
181
			listenerContent.setGroupBy_xpath(groupBy);
182
			listenerContent.setValidationType("content");
183
			listenerContent.setInternalJobsSum(workers);
184
			listenerContent.setBlacklistRuleIds(ruleIdsForBlacklist);
185

    
186
			DnetListener dnetListener = listenersManager.createDnetListener();
187
			dnetListener.setJob(bJob);
188
			dnetListener.setBlackboardHandler(blackboardHandler);
189
			dnetListener.setInternalJobsSum(workers);
190
			dnetListener.setValidationJobId(jobIdStored);
191
			dnetListener.setJobStatusUpdateInterval(jobStatusUpdateInterval);
192

    
193
			dnetListener.setValidatorManager(this);
194
			dnetListener.setGroupBy(groupBy);
195

    
196
			if (blacklistedRecords) {
197
				dnetListener.setEnableOutputToDisk(true);
198
				
199
			}
200
			if (outputEpr)
201
				dnetListener.setEnableOutputToRS(true);
202

    
203
			dnetListener.initOutputs();
204

    
205
			validator.submitJob(jobContent, workers, listenerContent, dnetListener);
206
				
207
			return newJob;
208
			
209
			
210
		} catch (Exception e) {
211
			logger.error("Error Submitting content job", e);
212
			throw new ValidatorException(e);
213
		}
214
	}
215
	
216
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
217
	public void submitJob(JobForValidation job) throws ValidatorException {
218

    
219
		try {
220
			logger.info("Submiting validation job requested by user: " + job.getUserEmail());
221

    
222
			if (job.isRegistration()) {
223
				logger.debug("initiating preregistration validations on repo " + job.getBaseUrl() + " for user " + job.getUserEmail() + "and desired compatibility: " + job.getDesiredCompatibilityLevel());
224
				for (RuleSet ruleset : rulesetsDao.getRuleSets()) {
225
					if (ruleset.getGuidelinesAcronym().equals(job.getDesiredCompatibilityLevel())) {
226
						job.setSelectedContentRules(ruleset.getContentRulesIds());
227
						job.setSelectedUsageRules(ruleset.getUsageRulesIds());
228
					}	
229
				}	
230
			}
231
			
232
			if ( job.getDesiredCompatibilityLevel().toLowerCase().matches("^openaire4.0$") ) {
233
				logger.debug("Chosen set: OpenAIRE For Thematic + Institutional Repositories");
234
				logger.debug("Setting METADATA_PREFIX to: oai_openaire");
235
				job.setMetadataPrefix("oai_openaire");
236
			} else if (
237
//					job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire2.0") ||
238
					job.getDesiredCompatibilityLevel().toLowerCase().matches("^openaire\\d.\\d$") ||
239
//					job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire3.0") ||
240
//					job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire4.0") ||
241
					job.getDesiredCompatibilityLevel().equalsIgnoreCase("driver") ) {
242
				logger.debug("Chosen set: OpenAIRE For Literature Repositories");
243
				logger.debug("Setting METADATA_PREFIX to: oai_dc");
244
				job.setMetadataPrefix("oai_dc");
245
			} else if ( job.getDesiredCompatibilityLevel().toLowerCase().matches("^openaire\\d.\\d_data$")) {
246
					// job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire2.0_data")) {
247
				logger.debug("Chosen set: OpenAIRE For Data Archives");
248
				logger.debug("Setting METADATA_PREFIX to: oai_datacite");
249
				job.setMetadataPrefix("oai_datacite");			
250
			} else if ( job.getDesiredCompatibilityLevel().toLowerCase().matches("^openaire\\d.\\d(.\\d)?_cris$")) {
251
					// job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire3.0_cris")) {
252
				logger.debug("Chosen set: OpenAIRE For Cris");
253
				logger.debug("Setting METADATA_PREFIX to: oai_CERIF_openaire");
254
				job.setMetadataPrefix("oai_CERIF_openaire");			
255
			}
256
			
257
			
258
			StoredJob newJob = new StoredJob(job);
259

    
260
			int usageJobs = 0;
261
			int contentJobs = 0;
262
			Set<Integer> totalRules = new HashSet<Integer>();
263
			Map<String,Set<Integer>> verbRuleMap = null;
264
			String validationType = "";
265
			
266
			if (job.getSelectedContentRules() != null) {
267
				contentJobs = 1;
268
				validationType +="C";
269
				totalRules.addAll(job.getSelectedContentRules());
270
				newJob.setContentJobStatus("ongoing");
271
			} else {
272
				newJob.setContentJobStatus("none");
273
			}
274
			if (job.getSelectedUsageRules() != null) {
275
				logger.debug("Creating map for provider information");
276
				verbRuleMap= new HashMap<String,Set<Integer>>();
277
				Set<Integer> old,temp = null;
278
				for (Integer id : job.getSelectedUsageRules()){
279
					eu.dnetlib.domain.functionality.validator.Rule ruleStored = rulesDao.get(id);
280
					logger.debug("Checking for verb : "+ruleStored.getProvider_information());
281
			        if((old=verbRuleMap.get(ruleStored.getProvider_information())) == null){
282
			        	logger.debug("Verb doesn't exist");
283
			            temp = new HashSet<Integer>();
284
			            temp.add(ruleStored.getId());
285
			            verbRuleMap.put(ruleStored.getProvider_information(),temp);
286
			        }else{
287
			        	logger.debug("Verb exists");
288
			            old.add(ruleStored.getId());
289
			        }
290
				}
291
				usageJobs = verbRuleMap.size();
292
				validationType +="U";
293
				totalRules.addAll(job.getSelectedUsageRules());
294
				newJob.setUsageJobStatus("ongoing");
295
			} else {
296
				newJob.setUsageJobStatus("none");
297
			}
298
			
299
			
300
			Map<String, Set<Rule>> entityChosenRulesMap = null;
301
			Map<String, Set<Rule>> entityChosenRulesMapReferential = null;
302
			
303
			if (job.isCris()) {
304
				entityChosenRulesMap = new HashMap<String, Set<Rule>>();
305
				entityChosenRulesMapReferential = new HashMap<String, Set<Rule>>();
306
				this.prepareCrisJobs(job, entityChosenRulesMap, entityChosenRulesMapReferential);
307
				newJob.setGroupByXpath("//header/setSpec");
308
				contentJobs = entityChosenRulesMap.keySet().size() + entityChosenRulesMapReferential.keySet().size();
309
				//TODO move in uoa-domain
310
				newJob.setCris(true);
311
				newJob.setSelectedCrisEntities(job.getSelectedCrisEntities());
312
				newJob.setCrisReferentialChecks(job.isCrisReferentialChecks());
313
			}
314
			newJob.setValidationType(validationType);
315
			if (job.isRegistration()) {
316
				newJob.setJobType("Registration Request");
317
				//TODO move in uoa-domain
318
				newJob.setActivationId(job.getActivationId());
319
				newJob.setRegistration(true);
320
				newJob.setUpdateExisting(job.isUpdateExisting());
321
				newJob.setOfficialName(job.getOfficialName());
322
				newJob.setAdminEmails(job.getAdminEmails());
323
				newJob.setDatasourceId(job.getDatasourceId());
324
				newJob.setInterfaceId(job.getInterfaceId());
325
				newJob.setInterfaceIdOld(job.getInterfaceIdOld());
326
				newJob.setRepoType(job.getRepoType());
327
			} else
328
				newJob.setJobType("Compatibility Test");
329
			
330
			newJob.setDuration("--");
331
			newJob.setRules(totalRules);
332
			newJob.setId(-1);
333
	
334
			int jobIdStored = jobsDao.save(newJob);
335
			
336

    
337
			RegistrationListener regListener = null;
338
			if (job.isRegistration()) {
339
				regListener = listenersManager.createRegListener();
340
				regListener.setActivationId(job.getActivationId());
341
				regListener.setBaseUrl(job.getBaseUrl());
342
				regListener.setActivationId(job.getActivationId());
343
				regListener.setAdminEmails(job.getAdminEmails());
344
				regListener.setOfficialName(job.getOfficialName());
345
				regListener.setUserMail(job.getUserEmail());
346
				regListener.setDatasourceId(job.getDatasourceId());
347
				regListener.setInterfaceId(job.getInterfaceId());
348
				regListener.setValidationSet(job.getValidationSet());
349
				regListener.setDesiredCompLevel(job.getDesiredCompatibilityLevel());
350
				regListener.setRepoType(job.getRepoType());
351
				regListener.setInterfaceIdOld(job.getInterfaceIdOld());
352
				regListener.setUpdateExisting(job.isUpdateExisting());	
353
				regListener.setTotalJobs(usageJobs + contentJobs);
354
			}
355
			
356
			CompatibilityTestListener compTestListener = listenersManager.createCompTestListener();
357
			compTestListener.setValidationSet(job.getValidationSet());
358
			compTestListener.setGuidelines(job.getDesiredCompatibilityLevel());
359
			compTestListener.setTotalJobs(usageJobs + contentJobs);
360

    
361
			
362
//CONTENT
363
			if (job.getSelectedContentRules() != null) {
364
			
365
				Set<Rule> rulesContent = new HashSet<Rule>();
366
				
367
				Properties props = new Properties();
368
				props.setProperty(OAIPMHRecordProvider.BASEURL, job.getBaseUrl());
369
				props.setProperty(OAIPMHRecordProvider.METADATA_PREFIX, newJob.getMetadataPrefix());
370
				props.setProperty(OAIPMHRecordProvider.RECORDS,Integer.toString(job.getRecords()));
371
				props.setProperty(OAIPMHRecordProvider.SET,job.getValidationSet());
372
				
373
		
374
				Job jobContent = null;
375
				
376
				ValidatorJobListener listenerContent = listenersManager.createListener();
377
				listenerContent.setJobSubmittedId(jobIdStored);
378
				listenerContent.setJobSubmittedUser(job.getUserEmail());
379
				listenerContent.setGroupBy_xpath(newJob.getGroupByXpath());
380
				listenerContent.setValidationType("content");
381
				listenerContent.setInternalJobsSum(contentJobs);
382
				
383

    
384
				if (job.isCris()) {
385
					logger.debug("Submiting job for cris.");
386
					logger.debug("Total content jobs: " + contentJobs);
387
//					logger.debug("Selected content rules number: " + job.getSelectedContentRules().size());
388
					jobContent = new Job(jobIdStored, 4, rulesContent, props);
389
// acz					validator.submitJobForCris(jobContent, entityChosenRulesMap, entityChosenRulesMapReferential, listenerContent, compTestListener);
390
// send cris validation to Guideline team member. Could be moved into MemoryThreadValidator.submitJobForCris method
391
                                        List<String> recipientsMailAddr = new ArrayList<String>();
392
                                        recipientsMailAddr.add("andreas.czerniak@uni-bielefeld.de");
393
                                        emailer.sendMail( recipientsMailAddr, "CrisJob submitting", "baseUrl: " + job.getBaseUrl() , false, recipientsMailAddr);
394
                                } else {
395
					
396
					logger.debug("Selected content rules number: " + job.getSelectedContentRules().size());
397
					for (Integer ruleId : job.getSelectedContentRules()){
398
						
399
						eu.dnetlib.domain.functionality.validator.Rule tempRule=rulesDao.get(ruleId);
400
						
401
						//special behaviour type of rule is chain
402
						if(tempRule.getType().equals("ChainRule")) {
403
							ChainRule<Rule> chainRule = this.handleChain(tempRule);
404
							rulesContent.add(chainRule);
405
						}
406
						else {
407
							rulesContent.add((Rule) this.getRuleClassInstanceByType(tempRule.getType(), tempRule.getConfiguration(), tempRule.getId()));
408
						}
409
					}
410
					
411
					jobContent = new Job(jobIdStored, 1, rulesContent, props);
412
					
413
					if (job.isRegistration()) {
414
						validator.submitJob(jobContent, 1, listenerContent, regListener);
415
					} else {
416
						validator.submitJob(jobContent, 1, listenerContent, compTestListener);
417
					}	
418
				}
419
			}
420
			
421
			//USAGE	
422
			if (job.getSelectedUsageRules() != null) {
423
			
424
				ValidatorJobListener listenerUsage = listenersManager.createListener();
425
				listenerUsage.setJobSubmittedId(jobIdStored);
426
				listenerUsage.setValidationType("usage");
427
				listenerUsage.setJobSubmittedUser(job.getUserEmail());
428
				listenerUsage.setInternalJobsSum(usageJobs);
429
				List <Job> jobsUsage = new ArrayList<Job>();
430
				for (Map.Entry<String, Set<Integer>> entry : verbRuleMap.entrySet()) {
431
					Properties pros = new Properties();
432
					pros.setProperty(OAIPMHSinglePageVerbProvider.VERB,entry.getKey());
433
					pros.setProperty(OAIPMHSinglePageVerbProvider.BASEURL, job.getBaseUrl());
434
					Set<Rule> rulesUsage = new HashSet<Rule>();
435
					for (Integer ruleId : entry.getValue()){
436
						eu.dnetlib.domain.functionality.validator.Rule tempRule = rulesDao.get(ruleId);
437
						logger.debug("prepare to add rule to registry with regexp: "+tempRule.getConfiguration().getProperty("regexp"));
438
						rulesUsage.add((Rule)this.getRuleClassInstanceByType(tempRule.getType(), tempRule.getConfiguration(), tempRule.getId()));
439
					}
440
					jobsUsage.add(new Job(jobIdStored, 2, rulesUsage, pros));
441
				}
442
				for (Job jobUsage : jobsUsage ) {
443
					if (job.isRegistration()) {
444
						validator.submitJob(jobUsage, 1, listenerUsage, regListener);
445
					} else {
446
						validator.submitJob(jobUsage, 1, listenerUsage, compTestListener);
447
					}
448
				}
449
			}			
450
			
451
			
452
		} catch (Exception e) {
453
			logger.error("error submitting job ", e);
454
			throw new ValidatorException(e);
455
		}
456
		
457
	}
458
	
459
	private void prepareCrisJobs(JobForValidation job,
460
			Map<String, Set<Rule>> entityChosenRulesMap,
461
			Map<String, Set<Rule>> entityChosenRulesMapReferential) throws ValidatorException, DaoException {
462
		//getting rules per entity and leave only chosen ones
463
		logger.debug("Selected Entities: " + job.getSelectedCrisEntities());
464
		for (String entity : RuleTypes.getEntities().keySet()) {
465
			
466
			logger.debug("checking entity: " + entity);
467
			Set<Rule> rulesBasic = new HashSet<Rule>();
468
			Set<Rule> rulesReferential = new HashSet<Rule>();
469
			if (job.getSelectedCrisEntities().contains(entity)) {
470
				logger.debug("entity: " + entity + " is selected");
471
				for (eu.dnetlib.domain.functionality.validator.Rule rule : rulesDao.getAllRulesByJobTypeEntityType("content", entity)) {
472
					if (job.getSelectedContentRules().contains(rule.getId())) {
473
						eu.dnetlib.domain.functionality.validator.Rule tempRule=rulesDao.get(rule.getId());
474
						if (rule.getName().contains("Relationship")) {
475
							if (job.isCrisReferentialChecks()) {
476
								rulesReferential.add((Rule) this.getRuleClassInstanceByType(tempRule.getType(), tempRule.getConfiguration(), tempRule.getId()));
477
							} 
478
						} else {
479
							rulesBasic.add((Rule) this.getRuleClassInstanceByType(tempRule.getType(), tempRule.getConfiguration(), tempRule.getId()));
480
						}
481
					}
482
				}
483
				logger.debug("Basic rules: " + rulesBasic.size());
484
				logger.debug("Referential rules: " + rulesReferential.size());
485
				entityChosenRulesMap.put(RuleTypes.getSetOfEntity(entity), rulesBasic);
486
				if (job.isCrisReferentialChecks() && !rulesReferential.isEmpty())
487
					entityChosenRulesMapReferential.put(RuleTypes.getSetOfEntity(entity), rulesReferential);
488
			} else {
489
				logger.debug("entity: " + entity + " is not selected");
490
			}
491
		}
492
		logger.debug("Return entities: " + entityChosenRulesMap.keySet());
493

    
494
		
495
	}
496

    
497

    
498
	public Rule getRuleClassInstanceByType(String type, CustomProperties pros, int id) throws ValidatorException {
499
		logger.debug("getting rule object of type "+type);
500
		String classname = RuleTypes.getClassOfType(type);
501
		if (classname == null){
502
			logger.debug("error getting rule object of type "+type+" classname=null");
503
			return null;
504
		}
505
		else {
506
			try {
507
				Class<?> clazz = Class.forName(classname);
508
				logger.debug("classname: "+clazz.getName());
509
				Properties properties = new Properties();
510
				properties.putAll(pros.getProperties());
511
				return (Rule) clazz.getConstructor(new Class[]{Properties.class,Integer.TYPE}).newInstance(properties,id);
512
				
513
			} catch (Exception e) {
514
				logger.debug("error getting rule object: "+e);
515
				return null;
516
			} 
517
		}
518
	}
519
	
520
	
521
	private ChainRule<Rule> handleChain(eu.dnetlib.domain.functionality.validator.Rule tempRule) throws ValidatorException, DaoException {
522
		logger.debug("chain rule found");
523
		List<Rule> rules_chain = new ArrayList<Rule>();
524
		eu.dnetlib.domain.functionality.validator.Rule tempRuleChain1=rulesDao.get(Integer.parseInt(tempRule.getConfiguration().getProperty("rule_1")));
525
		if(tempRuleChain1.getType().equals("ChainRule")) {
526
			ChainRule<Rule> chainRule1 = this.handleChain(tempRuleChain1);
527
			rules_chain.add(chainRule1);
528
		} else {
529
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain1.getType(), tempRuleChain1.getConfiguration(),tempRuleChain1.getId()));
530
		}
531
		eu.dnetlib.domain.functionality.validator.Rule tempRuleChain2=rulesDao.get(Integer.parseInt(tempRule.getConfiguration().getProperty("rule_2")));
532
		if(tempRuleChain2.getType().equals("ChainRule")) {
533
			ChainRule<Rule> chainRule2 = this.handleChain(tempRuleChain2);
534
			rules_chain.add(chainRule2);
535
		} else {
536
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain2.getType(), tempRuleChain2.getConfiguration(), tempRuleChain2.getId()));
537
		}
538
		Properties chainPros = new Properties();
539
		chainPros.setProperty(ChainRule.TYPE,tempRule.getConfiguration().getProperty(ChainRule.TYPE));
540
		ChainRule<Rule> chainRule = new ChainRule<Rule>(chainPros, tempRule.getId(), rules_chain);
541
		return chainRule;
542
	}
543

    
544
	public Validator getValidator() {
545
		return validator;
546
	}
547

    
548
	public ListenersManager getListenersManager() {
549
		return listenersManager;
550
	}
551

    
552
	public void setListenersManager(ListenersManager listenersManager) {
553
		this.listenersManager = listenersManager;
554
	}
555

    
556
	public void setValidator(Validator validator) {
557
		this.validator = validator;
558
	}
559

    
560
	public JobsDAO getJobsDao() {
561
		return jobsDao;
562
	}
563

    
564
	public void setJobsDao(JobsDAO jobsDao) {
565
		this.jobsDao = jobsDao;
566
	}
567

    
568
	public RulesetsDAO getRulesetsDao() {
569
		return rulesetsDao;
570
	}
571

    
572
	public void setRulesetsDao(RulesetsDAO rulesetsDao) {
573
		this.rulesetsDao = rulesetsDao;
574
	}
575

    
576
	public RulesDAO getRulesDao() {
577
		return rulesDao;
578
	}
579

    
580
	public void setRulesDao(RulesDAO rulesDao) {
581
		this.rulesDao = rulesDao;
582
	}
583

    
584
	public ValidatorRestore getValRestore() {
585
		return valRestore;
586
	}
587

    
588
	public void setValRestore(ValidatorRestore valRestore) {
589
		this.valRestore = valRestore;
590
	}
591
	
592
}
(3-3/4)