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.engine.Validator;
15
import eu.dnetlib.validator.engine.ValidatorException;
16
import eu.dnetlib.validator.engine.data.Rule;
17
import eu.dnetlib.validator.engine.execution.Job;
18
import eu.dnetlib.validator.service.impls.ValidatorRestore;
19
import eu.dnetlib.validator.service.impls.listeners.*;
20
import eu.dnetlib.validator.service.impls.providers.DnetProvider;
21
import eu.dnetlib.validator.service.impls.providers.OAIPMHRecordProvider;
22
import eu.dnetlib.validator.service.impls.providers.OAIPMHSinglePageVerbProvider;
23
import eu.dnetlib.validator.service.impls.rules.ChainRule;
24
import eu.dnetlib.validator.service.impls.rules.RuleTypes;
25
import org.apache.log4j.Logger;
26
import org.springframework.transaction.annotation.Propagation;
27
import org.springframework.transaction.annotation.Transactional;
28

    
29
import java.util.*;
30

    
31
@Transactional
32
public class ValidatorManagerImpl implements ValidatorManager {
33

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

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

    
73
	}
74

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

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

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

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

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

    
184
			DnetListener dnetListener = listenersManager.createDnetListener();
185
			dnetListener.setJob(bJob);
186
			dnetListener.setBlackboardHandler(blackboardHandler);
187
			dnetListener.setInternalJobsSum(workers);
188
			dnetListener.setValidationJobId(jobIdStored);
189
			dnetListener.setJobStatusUpdateInterval(jobStatusUpdateInterval);
190
			if (blacklistedRecords) {
191
				dnetListener.setEnableOutputToDisk(true);
192
				
193
			}
194
			if (outputEpr)
195
				dnetListener.setEnableOutputToRS(true);
196

    
197
			validator.submitJob(jobContent, workers, listenerContent, dnetListener);
198
				
199
			return newJob;
200
			
201
			
202
		} catch (Exception e) {
203
			logger.error("Error Submitting content job", e);
204
			throw new ValidatorException(e);
205
		}
206
	}
207
	
208
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
209
	public void submitJob(JobForValidation job) throws ValidatorException {
210

    
211
		try {
212
			logger.info("Submiting validation job requested by user: " + job.getUserEmail());
213

    
214
			if (job.isRegistration()) {
215
				logger.debug("initiating preregistration validations on repo " + job.getBaseUrl() + " for user " + job.getUserEmail() + "and desired compatibility: " + job.getDesiredCompatibilityLevel());
216
				for (RuleSet ruleset : rulesetsDao.getRuleSets()) {
217
					if (ruleset.getGuidelinesAcronym().equals(job.getDesiredCompatibilityLevel())) {
218
						job.setSelectedContentRules(ruleset.getContentRulesIds());
219
						job.setSelectedUsageRules(ruleset.getUsageRulesIds());
220
					}	
221
				}	
222
			}
223
			
224
			if ( job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire2.0") || 
225
					job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire3.0") || 
226
					job.getDesiredCompatibilityLevel().equalsIgnoreCase("driver") ) {
227
				logger.debug("Chosen set: OpenAIRE For Literature Repositories");
228
				logger.debug("Setting METADATA_PREFIX to: oai_dc");
229
				job.setMetadataPrefix("oai_dc");
230
			} else if ( job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire2.0_data")) {
231
				logger.debug("Chosen set: OpenAIRE For Data Archives");
232
				logger.debug("Setting METADATA_PREFIX to: oai_datacite");
233
				job.setMetadataPrefix("oai_datacite");			
234
			} else if ( job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire3.0_cris")) {
235
				logger.debug("Chosen set: OpenAIRE For Cris");
236
				logger.debug("Setting METADATA_PREFIX to: oai_CERIF_openaire");
237
				job.setMetadataPrefix("oai_CERIF_openaire");			
238
			}
239
			
240
			
241
			StoredJob newJob = new StoredJob(job);
242

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

    
320
			RegistrationListener regListener = null;
321
			if (job.isRegistration()) {
322
				regListener = listenersManager.createRegListener();
323
				regListener.setActivationId(job.getActivationId());
324
				regListener.setBaseUrl(job.getBaseUrl());
325
				regListener.setActivationId(job.getActivationId());
326
				regListener.setAdminEmails(job.getAdminEmails());
327
				regListener.setOfficialName(job.getOfficialName());
328
				regListener.setUserMail(job.getUserEmail());
329
				regListener.setDatasourceId(job.getDatasourceId());
330
				regListener.setInterfaceId(job.getInterfaceId());
331
				regListener.setValidationSet(job.getValidationSet());
332
				regListener.setDesiredCompLevel(job.getDesiredCompatibilityLevel());
333
				regListener.setRepoType(job.getRepoType());
334
				regListener.setInterfaceIdOld(job.getInterfaceIdOld());
335
				regListener.setUpdateExisting(job.isUpdateExisting());	
336
				regListener.setTotalJobs(usageJobs + contentJobs);
337
			}
338
			
339
			CompatibilityTestListener compTestListener = listenersManager.createCompTestListener();
340
			compTestListener.setValidationSet(job.getValidationSet());
341
			compTestListener.setGuidelines(job.getDesiredCompatibilityLevel());
342
			compTestListener.setTotalJobs(usageJobs + contentJobs);
343

    
344
			
345
//CONTENT
346
			if (job.getSelectedContentRules() != null) {
347
			
348
				Set<Rule> rulesContent = new HashSet<Rule>();
349
				
350
				Properties props = new Properties();
351
				props.setProperty(OAIPMHRecordProvider.BASEURL, job.getBaseUrl());
352
				props.setProperty(OAIPMHRecordProvider.METADATA_PREFIX, newJob.getMetadataPrefix());
353
				props.setProperty(OAIPMHRecordProvider.RECORDS,Integer.toString(job.getRecords()));
354
				props.setProperty(OAIPMHRecordProvider.SET,job.getValidationSet());
355
				
356
		
357
				Job jobContent = null;
358
				
359
				ValidatorJobListener listenerContent = listenersManager.createListener();
360
				listenerContent.setJobSubmittedId(jobIdStored);
361
				listenerContent.setJobSubmittedUser(job.getUserEmail());
362
				listenerContent.setGroupBy_xpath(newJob.getGroupByXpath());
363
				listenerContent.setValidationType("content");
364
				listenerContent.setInternalJobsSum(contentJobs);
365
				
366

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

    
473
		
474
	}
475

    
476

    
477
	public Rule getRuleClassInstanceByType(String type, CustomProperties pros, int id) throws ValidatorException {
478
		logger.debug("getting rule object of type "+type);
479
		String classname = RuleTypes.getClassOfType(type);
480
		if (classname == null){
481
			logger.debug("error getting rule object of type "+type+" classname=null");
482
			return null;
483
		}
484
		else {
485
			try {
486
				Class<?> clazz = Class.forName(classname);
487
				logger.debug("classname: "+clazz.getName());
488
				Properties properties = new Properties();
489
				properties.putAll(pros.getProperties());
490
				return (Rule) clazz.getConstructor(new Class[]{Properties.class,Integer.TYPE}).newInstance(properties,id);
491
				
492
			} catch (Exception e) {
493
				logger.debug("error getting rule object: "+e);
494
				return null;
495
			} 
496
		}
497
	}
498
	
499
	
500
	private ChainRule<Rule> handleChain(eu.dnetlib.domain.functionality.validator.Rule tempRule) throws ValidatorException, DaoException {
501
		logger.debug("chain rule found");
502
		List<Rule> rules_chain = new ArrayList<Rule>();
503
		eu.dnetlib.domain.functionality.validator.Rule tempRuleChain1=rulesDao.get(Integer.parseInt(tempRule.getConfiguration().getProperty("rule_1")));
504
		if(tempRuleChain1.getType().equals("ChainRule")) {
505
			ChainRule<Rule> chainRule1 = this.handleChain(tempRuleChain1);
506
			rules_chain.add(chainRule1);
507
		} else {
508
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain1.getType(), tempRuleChain1.getConfiguration(),tempRuleChain1.getId()));
509
		}
510
		eu.dnetlib.domain.functionality.validator.Rule tempRuleChain2=rulesDao.get(Integer.parseInt(tempRule.getConfiguration().getProperty("rule_2")));
511
		if(tempRuleChain2.getType().equals("ChainRule")) {
512
			ChainRule<Rule> chainRule2 = this.handleChain(tempRuleChain2);
513
			rules_chain.add(chainRule2);
514
		} else {
515
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain2.getType(), tempRuleChain2.getConfiguration(), tempRuleChain2.getId()));
516
		}
517
		Properties chainPros = new Properties();
518
		chainPros.setProperty(ChainRule.TYPE,tempRule.getConfiguration().getProperty(ChainRule.TYPE));
519
		ChainRule<Rule> chainRule = new ChainRule<Rule>(chainPros, tempRule.getId(), rules_chain);
520
		return chainRule;
521
	}
522

    
523
	public Validator getValidator() {
524
		return validator;
525
	}
526

    
527
	public ListenersManager getListenersManager() {
528
		return listenersManager;
529
	}
530

    
531
	public void setListenersManager(ListenersManager listenersManager) {
532
		this.listenersManager = listenersManager;
533
	}
534

    
535
	public void setValidator(Validator validator) {
536
		this.validator = validator;
537
	}
538

    
539
	public JobsDAO getJobsDao() {
540
		return jobsDao;
541
	}
542

    
543
	public void setJobsDao(JobsDAO jobsDao) {
544
		this.jobsDao = jobsDao;
545
	}
546

    
547
	public RulesetsDAO getRulesetsDao() {
548
		return rulesetsDao;
549
	}
550

    
551
	public void setRulesetsDao(RulesetsDAO rulesetsDao) {
552
		this.rulesetsDao = rulesetsDao;
553
	}
554

    
555
	public RulesDAO getRulesDao() {
556
		return rulesDao;
557
	}
558

    
559
	public void setRulesDao(RulesDAO rulesDao) {
560
		this.rulesDao = rulesDao;
561
	}
562

    
563
	public ValidatorRestore getValRestore() {
564
		return valRestore;
565
	}
566

    
567
	public void setValRestore(ValidatorRestore valRestore) {
568
		this.valRestore = valRestore;
569
	}
570
	
571
}
(3-3/4)