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

    
74
	}
75

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

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

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

    
114
	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
115
	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{
116
		try {
117
			logger.info("Submitting data job for workflow");
118
//			String desiredCompatibility = "openaire3.0";
119
			Set<Integer> ruleIdsForBlacklist = new HashSet<Integer>();
120
			Set<Integer> ruleIdsContent = new HashSet<Integer>();
121
			for (RuleSet ruleset : rulesetsDao.getRuleSets()) {
122
				if (ruleset.getGuidelinesAcronym().equals(guidelines)) {
123
					ruleIdsContent = ruleset.getContentRulesIds();
124
				}	
125
				if (blacklistedRecords && ruleset.getGuidelinesAcronym().equals(blacklistGuidelines)) {
126
					ruleIdsForBlacklist = ruleset.getContentRulesIds();
127
					ruleIdsContent.addAll(ruleIdsForBlacklist);
128
				}
129
			}
130
			
131
			Properties props = new Properties();
132

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

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

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

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

    
202
			dnetListener.initOutputs();
203

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

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

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

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

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

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

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

    
493
		
494
	}
495

    
496

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

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

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

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

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

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

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

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

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

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

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

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

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