Project

General

Profile

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

    
3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.HashSet;
6
import java.util.List;
7
import java.util.Map;
8
import java.util.Properties;
9
import java.util.Set;
10

    
11
import org.apache.log4j.Logger;
12
import org.springframework.transaction.annotation.Propagation;
13
import org.springframework.transaction.annotation.Transactional;
14

    
15
import eu.dnetlib.domain.functionality.validator.JobForValidation;
16
import eu.dnetlib.domain.functionality.validator.RuleSet;
17
import eu.dnetlib.domain.functionality.validator.StoredJob;
18
import eu.dnetlib.enabling.tools.blackboard.BlackboardJob;
19
import eu.dnetlib.enabling.tools.blackboard.BlackboardNotificationHandler;
20
import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler;
21
import eu.dnetlib.validator.commons.dao.DaoException;
22
import eu.dnetlib.validator.commons.dao.jobs.JobsDAO;
23
import eu.dnetlib.validator.commons.dao.rules.RulesDAO;
24
import eu.dnetlib.validator.commons.dao.rules.RulesetsDAO;
25
import eu.dnetlib.validator.engine.Validator;
26
import eu.dnetlib.validator.engine.ValidatorException;
27
import eu.dnetlib.validator.engine.data.Rule;
28
import eu.dnetlib.validator.engine.execution.Job;
29
import eu.dnetlib.validator.service.impls.ValidatorRestore;
30
import eu.dnetlib.validator.service.impls.listeners.CompatibilityTestListener;
31
import eu.dnetlib.validator.service.impls.listeners.DnetListener;
32
import eu.dnetlib.validator.service.impls.listeners.ListenersManager;
33
import eu.dnetlib.validator.service.impls.listeners.RegistrationListener;
34
import eu.dnetlib.validator.service.impls.listeners.ValidatorJobListener;
35
import eu.dnetlib.validator.service.impls.providers.DnetProvider;
36
import eu.dnetlib.validator.service.impls.providers.OAIPMHRecordProvider;
37
import eu.dnetlib.validator.service.impls.providers.OAIPMHSinglePageVerbProvider;
38
import eu.dnetlib.validator.service.impls.rules.ChainRule;
39
import eu.dnetlib.validator.service.impls.rules.RuleTypes;
40

    
41
@Transactional
42
public class ValidatorManagerImpl implements ValidatorManager {
43

    
44
	private Validator validator;
45
	private JobsDAO jobsDao;
46
	private RulesetsDAO rulesetsDao;
47
	private RulesDAO rulesDao;
48
	private ValidatorRestore valRestore;
49
	
50
	
51
	private static Logger logger = Logger.getLogger(ValidatorManagerImpl.class);
52

    
53
	private ListenersManager listenersManager;
54
//	this.restartJobs();
55
	public void start() {
56
		logger.info("Initializing Validator Manager module");
57
		if (valRestore.isAutoRestoreOnStartup()) {
58
			logger.info("auto-restoring OpenAire Validator is enabled..");
59
			List<StoredJob> jobs = valRestore.deleteUncompleted();
60
			valRestore.restartJobs(jobs);
61
			logger.info("finished restoring OpenAire Validator..");
62
		} else {
63
			logger.info("auto-restoring OpenAire Validator is disabled..");
64
		}
65
	}
66
	
67
	public StoredJob getStoredJob(int jobId, String groupBy)
68
			throws ValidatorException {
69
		try {
70
			logger.info("Getting job summary for job " + jobId +" with groupBy: "+groupBy);
71
			return jobsDao.getJobSummary(jobId,groupBy);
72
		} catch (Exception e) {
73
			logger.error("error getting job summary for job " + jobId, e);
74
			throw new ValidatorException(e);
75
		}
76
	}
77
	
78
	public List<StoredJob> getStoredJobs(String userMail, String jobType,
79
			Integer offset, Integer limit, String dateFrom, String dateTo)
80
			throws ValidatorException {
81
		try {
82
			logger.debug("Getting jobs of user " + userMail);
83
			return jobsDao.getJobs(userMail, jobType, offset, limit, dateFrom, dateTo);
84
		} catch (Exception e) {
85
			logger.error("error Getting jobs of user " + userMail, e);
86
			throw new ValidatorException(e);
87
		}
88
	}
89

    
90
	public int getStoredJobsTotalNumber(String userMail, String jobType)
91
			throws ValidatorException {
92
		try {
93
			logger.debug("Getting jobs total sum of user " + userMail);
94
			return jobsDao.getJobsTotalNumber(userMail, jobType);
95
		} catch (Exception e) {
96
			logger.error("error Getting jobs sum of user " + userMail, e);
97
			throw new ValidatorException(e);
98
		}
99
	}
100

    
101
	
102
	public List<RuleSet> getRuleSets() throws ValidatorException {
103
		try {
104
			logger.info("Getting rulesets");
105
			return rulesetsDao.getRuleSets();
106
		} catch (Exception e) {
107
			logger.error("error Getting rulesets ", e);
108
			throw new ValidatorException(e);
109
		}
110
	}
111

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

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

    
175
			DnetListener dnetListener = listenersManager.createDnetListener();
176
			dnetListener.setJob(bJob);
177
			dnetListener.setBlackboardHandler(blackboardHandler);
178
			dnetListener.setInternalJobsSum(workers);
179
			dnetListener.setValidationJobId(jobIdStored);
180
			dnetListener.setJobStatusUpdateInterval(jobStatusUpdateInterval);
181

    
182
			validator.submitJob(jobContent, workers, listenerContent, dnetListener);
183

    
184
			return newJob;
185
			
186
			
187
		} catch (Exception e) {
188
			logger.error("Error Submitting content job", e);
189
			throw new ValidatorException(e);
190
		}
191
	}
192
	
193
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
194
	public void submitJob(JobForValidation job) throws ValidatorException {
195

    
196
		try {
197
			logger.info("Submiting validation job requested by user: " + job.getUserEmail());
198

    
199
			if (job.isRegistration()) {
200
				logger.debug("initiating preregistration validations on repo " + job.getBaseUrl() + " for user " + job.getUserEmail() + "and desired compatibility: " + job.getDesiredCompatibilityLevel());
201
				for (RuleSet ruleset : rulesetsDao.getRuleSets()) {
202
					if (ruleset.getGuidelinesAcronym().equals(job.getDesiredCompatibilityLevel())) {
203
						job.setSelectedContentRules(ruleset.getContentRulesIds());
204
						job.setSelectedUsageRules(ruleset.getUsageRulesIds());
205
					}	
206
				}	
207
			}
208
			
209
			if ( job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire2.0") || 
210
					job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire3.0") || 
211
					job.getDesiredCompatibilityLevel().equalsIgnoreCase("driver") ) {
212
				logger.debug("Chosen set: OpenAIRE For Literature Repositories");
213
				logger.debug("Setting METADATA_PREFIX to: oai_dc");
214
				job.setMetadataPrefix("oai_dc");
215
			} else if ( job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire2.0_data")) {
216
				logger.debug("Chosen set: OpenAIRE For Data Archives");
217
				logger.debug("Setting METADATA_PREFIX to: oai_datacite");
218
				job.setMetadataPrefix("oai_datacite");			
219
			} else if ( job.getDesiredCompatibilityLevel().equalsIgnoreCase("openaire3.0_cris")) {
220
				logger.debug("Chosen set: OpenAIRE For Cris");
221
				logger.debug("Setting METADATA_PREFIX to: oai_CERIF_openaire");
222
				job.setMetadataPrefix("oai_CERIF_openaire");			
223
			}
224
			
225
			
226
			StoredJob newJob = new StoredJob(job);
227

    
228
			int usageJobs = 0;
229
			int contentJobs = 0;
230
			Set<Integer> totalRules = new HashSet<Integer>();
231
			Map<String,Set<Integer>> verbRuleMap = null;
232
			String validationType = "";
233
			
234
			if (job.getSelectedContentRules() != null) {
235
				contentJobs = 1;
236
				validationType +="C";
237
				totalRules.addAll(job.getSelectedContentRules());
238
				newJob.setContentJobStatus("ongoing");
239
			} else {
240
				newJob.setContentJobStatus("none");
241
			}
242
			if (job.getSelectedUsageRules() != null) {
243
				logger.debug("Creating map for provider information");
244
				verbRuleMap= new HashMap<String,Set<Integer>>();
245
				Set<Integer> old,temp = null;
246
				for (Integer id : job.getSelectedUsageRules()){
247
					eu.dnetlib.domain.functionality.validator.Rule ruleStored = rulesDao.get(id);
248
					logger.debug("Checking for verb : "+ruleStored.getProvider_information());
249
			        if((old=verbRuleMap.get(ruleStored.getProvider_information())) == null){
250
			        	logger.debug("Verb doesn't exist");
251
			            temp = new HashSet<Integer>();
252
			            temp.add(ruleStored.getId());
253
			            verbRuleMap.put(ruleStored.getProvider_information(),temp);
254
			        }else{
255
			        	logger.debug("Verb exists");
256
			            old.add(ruleStored.getId());
257
			        }
258
				}
259
				usageJobs = verbRuleMap.size();
260
				validationType +="U";
261
				totalRules.addAll(job.getSelectedUsageRules());
262
				newJob.setUsageJobStatus("ongoing");
263
			} else {
264
				newJob.setUsageJobStatus("none");
265
			}
266
			
267
			
268
			Map<String, Set<Rule>> entityChosenRulesMap = null;
269
			Map<String, Set<Rule>> entityChosenRulesMapReferential = null;
270
			
271
			if (job.isCris()) {
272
				entityChosenRulesMap = new HashMap<String, Set<Rule>>();
273
				entityChosenRulesMapReferential = new HashMap<String, Set<Rule>>();
274
				this.prepareCrisJobs(job, entityChosenRulesMap, entityChosenRulesMapReferential);
275
				newJob.setGroupByXpath("//header/setSpec");
276
				contentJobs = entityChosenRulesMap.keySet().size() + entityChosenRulesMapReferential.keySet().size();
277
			}
278
			
279
			newJob.setValidationType(validationType);
280
			if (job.isRegistration()) {
281
				newJob.setJobType("Registration Request");
282
				newJob.setActivationId(job.getActivationId());
283
			} else
284
				newJob.setJobType("Compatibility Test");
285
			
286
			newJob.setDuration("--");
287
			newJob.setRules(totalRules);
288
			newJob.setId(-1);
289
	
290
			int jobIdStored = jobsDao.save(newJob);
291
			
292

    
293
			RegistrationListener regListener = null;
294
			if (job.isRegistration()) {
295
				regListener = listenersManager.createRegListener();
296
				regListener.setActivationId(job.getActivationId());
297
				regListener.setBaseUrl(job.getBaseUrl());
298
				regListener.setActivationId(job.getActivationId());
299
				regListener.setAdminEmails(job.getAdminEmails());
300
				regListener.setOfficialName(job.getOfficialName());
301
				regListener.setUserMail(job.getUserEmail());
302
				regListener.setDatasourceId(job.getDatasourceId());
303
				regListener.setInterfaceId(job.getInterfaceId());
304
				regListener.setValidationSet(job.getValidationSet());
305
				regListener.setDesiredCompLevel(job.getDesiredCompatibilityLevel());
306
				regListener.setRepoType(job.getRepoType());
307
				regListener.setInterfaceIdOld(job.getInterfaceIdOld());
308
				regListener.setUpdateExisting(job.isUpdateExisting());	
309
				regListener.setTotalJobs(usageJobs + contentJobs);
310
			}
311
			
312
			CompatibilityTestListener compTestListener = listenersManager.createCompTestListener();
313
			compTestListener.setValidationSet(job.getValidationSet());
314
			compTestListener.setGuidelines(job.getDesiredCompatibilityLevel());
315
			compTestListener.setTotalJobs(usageJobs + contentJobs);
316

    
317
			
318
//CONTENT
319
			if (job.getSelectedContentRules() != null) {
320
			
321
				Set<Rule> rulesContent = new HashSet<Rule>();
322
				
323
				Properties props = new Properties();
324
				props.setProperty(OAIPMHRecordProvider.BASEURL, job.getBaseUrl());
325
				props.setProperty(OAIPMHRecordProvider.METADATA_PREFIX, newJob.getMetadataPrefix());
326
				props.setProperty(OAIPMHRecordProvider.RECORDS,Integer.toString(job.getRecords()));
327
				props.setProperty(OAIPMHRecordProvider.SET,job.getValidationSet());
328
				
329
		
330
				Job jobContent = null;
331
				
332
				ValidatorJobListener listenerContent = listenersManager.createListener();
333
				listenerContent.setJobSubmittedId(jobIdStored);
334
				listenerContent.setJobSubmittedUser(job.getUserEmail());
335
				listenerContent.setGroupBy_xpath(newJob.getGroupByXpath());
336
				listenerContent.setValidationType("content");
337
				listenerContent.setInternalJobsSum(contentJobs);
338
				
339

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

    
446
		
447
	}
448

    
449

    
450
	public Rule getRuleClassInstanceByType(String type, Properties pros, int id) throws ValidatorException {
451
		logger.debug("getting rule object of type "+type);
452
		String classname = RuleTypes.getClassOfType(type);
453
		if (classname == null){
454
			logger.debug("error getting rule object of type "+type+" classname=null");
455
			return null;
456
		}
457
		else {
458
			try {
459
				Class<?> clazz = Class.forName(classname);
460
				logger.debug("classname: "+clazz.getName());
461
				return (Rule) clazz.getConstructor(new Class[]{Properties.class,Integer.TYPE}).newInstance(pros,id);
462
				
463
			} catch (Exception e) {
464
				logger.debug("error getting rule object: "+e);
465
				return null;
466
			} 
467
		}
468
	}
469
	
470
	
471
	private ChainRule<Rule> handleChain(eu.dnetlib.domain.functionality.validator.Rule tempRule) throws ValidatorException, DaoException {
472
		logger.debug("chain rule found");
473
		List<Rule> rules_chain = new ArrayList<Rule>();
474
		eu.dnetlib.domain.functionality.validator.Rule tempRuleChain1=rulesDao.get(Integer.parseInt(tempRule.getConfiguration().getProperty("rule_1")));
475
		if(tempRuleChain1.getType().equals("ChainRule")) {
476
			ChainRule<Rule> chainRule1 = this.handleChain(tempRuleChain1);
477
			rules_chain.add(chainRule1);
478
		} else {
479
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain1.getType(), tempRuleChain1.getConfiguration(),tempRuleChain1.getId()));
480
		}
481
		eu.dnetlib.domain.functionality.validator.Rule tempRuleChain2=rulesDao.get(Integer.parseInt(tempRule.getConfiguration().getProperty("rule_2")));
482
		if(tempRuleChain2.getType().equals("ChainRule")) {
483
			ChainRule<Rule> chainRule2 = this.handleChain(tempRuleChain2);
484
			rules_chain.add(chainRule2);
485
		} else {
486
			rules_chain.add((Rule) this.getRuleClassInstanceByType(tempRuleChain2.getType(), tempRuleChain2.getConfiguration(), tempRuleChain2.getId()));
487
		}
488
		Properties chainPros = new Properties();
489
		chainPros.setProperty(ChainRule.TYPE,tempRule.getConfiguration().getProperty(ChainRule.TYPE));
490
		ChainRule<Rule> chainRule = new ChainRule<Rule>(chainPros, tempRule.getId(), rules_chain);
491
		return chainRule;
492
	}
493

    
494
	public Validator getValidator() {
495
		return validator;
496
	}
497

    
498
	public ListenersManager getListenersManager() {
499
		return listenersManager;
500
	}
501

    
502
	public void setListenersManager(ListenersManager listenersManager) {
503
		this.listenersManager = listenersManager;
504
	}
505

    
506
	public void setValidator(Validator validator) {
507
		this.validator = validator;
508
	}
509

    
510
	public JobsDAO getJobsDao() {
511
		return jobsDao;
512
	}
513

    
514
	public void setJobsDao(JobsDAO jobsDao) {
515
		this.jobsDao = jobsDao;
516
	}
517

    
518
	public RulesetsDAO getRulesetsDao() {
519
		return rulesetsDao;
520
	}
521

    
522
	public void setRulesetsDao(RulesetsDAO rulesetsDao) {
523
		this.rulesetsDao = rulesetsDao;
524
	}
525

    
526
	public RulesDAO getRulesDao() {
527
		return rulesDao;
528
	}
529

    
530
	public void setRulesDao(RulesDAO rulesDao) {
531
		this.rulesDao = rulesDao;
532
	}
533

    
534
	public ValidatorRestore getValRestore() {
535
		return valRestore;
536
	}
537

    
538
	public void setValRestore(ValidatorRestore valRestore) {
539
		this.valRestore = valRestore;
540
	}
541
	
542
}
(3-3/4)