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

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

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

    
201
			dnetListener.initOutputs();
202

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

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

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

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

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

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

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

    
484
		
485
	}
486

    
487

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

    
534
	public Validator getValidator() {
535
		return validator;
536
	}
537

    
538
	public ListenersManager getListenersManager() {
539
		return listenersManager;
540
	}
541

    
542
	public void setListenersManager(ListenersManager listenersManager) {
543
		this.listenersManager = listenersManager;
544
	}
545

    
546
	public void setValidator(Validator validator) {
547
		this.validator = validator;
548
	}
549

    
550
	public JobsDAO getJobsDao() {
551
		return jobsDao;
552
	}
553

    
554
	public void setJobsDao(JobsDAO jobsDao) {
555
		this.jobsDao = jobsDao;
556
	}
557

    
558
	public RulesetsDAO getRulesetsDao() {
559
		return rulesetsDao;
560
	}
561

    
562
	public void setRulesetsDao(RulesetsDAO rulesetsDao) {
563
		this.rulesetsDao = rulesetsDao;
564
	}
565

    
566
	public RulesDAO getRulesDao() {
567
		return rulesDao;
568
	}
569

    
570
	public void setRulesDao(RulesDAO rulesDao) {
571
		this.rulesDao = rulesDao;
572
	}
573

    
574
	public ValidatorRestore getValRestore() {
575
		return valRestore;
576
	}
577

    
578
	public void setValRestore(ValidatorRestore valRestore) {
579
		this.valRestore = valRestore;
580
	}
581
	
582
}
(3-3/4)