Project

General

Profile

Download (24.7 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9

    
10
package eu.etaxonomy.cdm.api.application;
11

    
12
import java.util.EnumSet;
13
import java.util.List;
14
import java.util.Properties;
15
import java.util.UUID;
16

    
17
import org.apache.log4j.Logger;
18
import org.hibernate.SessionFactory;
19
import org.springframework.beans.MutablePropertyValues;
20
import org.springframework.beans.factory.config.BeanDefinition;
21
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
22
import org.springframework.context.ApplicationListener;
23
import org.springframework.context.support.AbstractApplicationContext;
24
import org.springframework.core.io.ClassPathResource;
25
import org.springframework.core.io.Resource;
26
import org.springframework.security.authentication.ProviderManager;
27
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
28
import org.springframework.security.core.Authentication;
29
import org.springframework.security.core.context.SecurityContext;
30
import org.springframework.security.core.context.SecurityContextHolder;
31
import org.springframework.transaction.PlatformTransactionManager;
32
import org.springframework.transaction.TransactionStatus;
33

    
34
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
35
import eu.etaxonomy.cdm.api.service.IAgentService;
36
import eu.etaxonomy.cdm.api.service.IAnnotationService;
37
import eu.etaxonomy.cdm.api.service.IClassificationService;
38
import eu.etaxonomy.cdm.api.service.ICollectionService;
39
import eu.etaxonomy.cdm.api.service.ICommonService;
40
import eu.etaxonomy.cdm.api.service.IDatabaseService;
41
import eu.etaxonomy.cdm.api.service.IDescriptionService;
42
import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
43
import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
44
import eu.etaxonomy.cdm.api.service.IEntityValidationService;
45
import eu.etaxonomy.cdm.api.service.IEventBaseService;
46
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
47
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
48
import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
49
import eu.etaxonomy.cdm.api.service.IGroupService;
50
import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
51
import eu.etaxonomy.cdm.api.service.ILocationService;
52
import eu.etaxonomy.cdm.api.service.IMediaService;
53
import eu.etaxonomy.cdm.api.service.IMetadataService;
54
import eu.etaxonomy.cdm.api.service.INameService;
55
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
56
import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
57
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
58
import eu.etaxonomy.cdm.api.service.IPreferenceService;
59
import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
60
import eu.etaxonomy.cdm.api.service.IReferenceService;
61
import eu.etaxonomy.cdm.api.service.IRegistrationService;
62
import eu.etaxonomy.cdm.api.service.IRightsService;
63
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
64
import eu.etaxonomy.cdm.api.service.ITaxonService;
65
import eu.etaxonomy.cdm.api.service.ITermService;
66
import eu.etaxonomy.cdm.api.service.IUserService;
67
import eu.etaxonomy.cdm.api.service.IVocabularyService;
68
import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
69
import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
70
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
71
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
72
import eu.etaxonomy.cdm.common.monitor.NullProgressMonitor;
73
import eu.etaxonomy.cdm.common.monitor.SubProgressMonitor;
74
import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
75
import eu.etaxonomy.cdm.database.DataSourceNotFoundException;
76
import eu.etaxonomy.cdm.database.DbSchemaValidation;
77
import eu.etaxonomy.cdm.database.ICdmDataSource;
78
import eu.etaxonomy.cdm.model.common.CdmBase;
79
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
80
import eu.etaxonomy.cdm.persistence.hibernate.HibernateConfiguration;
81
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
82
import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
83

    
84
/**
85
 * @author a.mueller
86
 */
87
public class CdmApplicationController implements ICdmRepository {
88
	private static final Logger logger = Logger.getLogger(CdmApplicationController.class);
89

    
90
	public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE = "/eu/etaxonomy/cdm/defaultApplicationContext.xml";
91

    
92
	public AbstractApplicationContext applicationContext;
93
	protected ICdmRepository configuration;
94
	private final Resource applicationContextResource;
95

    
96
	private final IProgressMonitor progressMonitor;
97

    
98
	final protected static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;
99

    
100

    
101
	/**
102
	 * Constructor, opens a spring ApplicationContext by using the default data source
103
	 *
104
	 * @throws DataSourceNotFoundException
105
	 */
106
	public static CdmApplicationController NewInstance() throws DataSourceNotFoundException{
107
		logger.info("Start CdmApplicationController with default data source");
108
		CdmPersistentDataSource dataSource = getDefaultDatasource();
109
		DbSchemaValidation dbSchemaValidation = defaultDbSchemaValidation;
110
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
111
	}
112

    
113

    
114
	/**
115
	 * Constructor, opens a spring ApplicationContext by using the default data source
116
	 *
117
	 * @param dbSchemaValidation
118
	 *            validation type for database schema
119
	 * @throws DataSourceNotFoundException
120
	 */
121
	public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException{
122
		logger.info("Start CdmApplicationController with default data source");
123
		CdmPersistentDataSource dataSource = getDefaultDatasource();
124
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
125
	}
126

    
127

    
128
	/**
129
	 * Constructor, opens an spring ApplicationContext by using the according data source
130
	 * and the default database schema validation type
131
	 *
132
	 * @param dataSource
133
	 */
134
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource){
135
		return CdmApplicationController.NewInstance(null, dataSource, defaultDbSchemaValidation, false);
136
	}
137

    
138

    
139
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
140
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
141
	}
142

    
143

    
144
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
145
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, omitTermLoading);
146
	}
147

    
148
	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,
149
			DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
150
		return CdmApplicationController.NewInstance(applicationContextResource, dataSource, dbSchemaValidation,
151
		        null, omitTermLoading, null);
152
	}
153
    public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,
154
            DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){
155
        return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation,
156
                null, omitTermLoading, progressMonitor, null);
157
    }
158
	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,
159
			DbSchemaValidation dbSchemaValidation, HibernateConfiguration hibernateConfig,
160
			boolean omitTermLoading, IProgressMonitor progressMonitor){
161
		return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation,
162
		        hibernateConfig, omitTermLoading, progressMonitor, null);
163
	}
164

    
165

    
166
	//TODO discuss need for listeners before commit to trunk
167
	//	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners) {
168
	//		return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor,listeners);
169
	//	}
170

    
171
	/**
172
	 * @return
173
	 */
174
	protected static ClassPathResource getClasspathResource(){
175
		return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);
176
	}
177

    
178

    
179
	/**
180
	 * @return
181
	 * @throws DataSourceNotFoundException
182
	 */
183
	protected static CdmPersistentDataSource getDefaultDatasource() throws DataSourceNotFoundException{
184
		CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();
185
		return dataSource;
186
	}
187

    
188

    
189
	/**
190
	 *
191
	 * FIXME:Remoting this constructor is added only to allow extension of this cntroller
192
	 * class. and should be removed after refactoring
193
	 */
194
	protected CdmApplicationController(){
195
		applicationContextResource = null;
196
		progressMonitor = null;
197
	}
198

    
199

    
200
	/**
201
	 * Constructor, opens an spring 2.5 ApplicationContext by using the according data
202
	 * source
203
	 *
204
	 * @param dataSource
205
	 * @param dbSchemaValidation
206
	 * @param omitTermLoading
207
	 */
208
	protected CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation,
209
	        HibernateConfiguration hibernateConfig,
210
	        boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners){
211
		logger.info("Start CdmApplicationController with datasource: " + dataSource.getName());
212

    
213
		if (dbSchemaValidation == null) {
214
			dbSchemaValidation = defaultDbSchemaValidation;
215
		}
216
		this.applicationContextResource = applicationContextResource != null ? applicationContextResource : getClasspathResource();
217
		this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();
218

    
219
		setNewDataSource(dataSource, dbSchemaValidation, hibernateConfig, omitTermLoading, listeners);
220
	}
221

    
222

    
223
	/**
224
	 * Sets the application context to a new spring ApplicationContext by using the
225
	 * according data source and initializes the Controller.
226
	 *
227
	 * @param dataSource
228
	 */
229
	private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation,
230
	        HibernateConfiguration hibernateConfig,
231
	        boolean omitTermLoading, List<ApplicationListener> listeners){
232

    
233
		if (dbSchemaValidation == null) {
234
			dbSchemaValidation = defaultDbSchemaValidation;
235
		}
236
		logger.info("Connecting to '" + dataSource.getName() + "'");
237

    
238
		MonitoredGenericApplicationContext applicationContext = new MonitoredGenericApplicationContext();
239
		int refreshTasks = 45;
240
		int nTasks = 5 + refreshTasks;
241
		//		nTasks += applicationContext.countTasks();
242
		progressMonitor.beginTask("Connecting to '" + dataSource.getName() + "'", nTasks);
243

    
244
		//		progressMonitor.worked(1);
245

    
246
		BeanDefinition datasourceBean = dataSource.getDatasourceBean();
247
		datasourceBean.setAttribute("isLazy", false);
248
		progressMonitor.subTask("Registering datasource.");
249
		applicationContext.registerBeanDefinition("dataSource", datasourceBean);
250
		progressMonitor.worked(1);
251

    
252
		BeanDefinition hibernatePropBean = dataSource.getHibernatePropertiesBean(dbSchemaValidation, hibernateConfig);
253
		applicationContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);
254

    
255
		XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);
256
		progressMonitor.subTask("Registering resources.");
257
		xmlReader.loadBeanDefinitions(applicationContextResource);
258
		progressMonitor.worked(1);
259

    
260
		//omitTerms
261
		if (omitTermLoading == true) {
262
			String initializerName = "persistentTermInitializer";
263
			BeanDefinition beanDef = applicationContext.getBeanDefinition(initializerName);
264
			MutablePropertyValues values = beanDef.getPropertyValues();
265
			values.addPropertyValue("omit", omitTermLoading);
266
		}
267

    
268
		if (listeners != null) {
269
			for (ApplicationListener<?> listener : listeners) {
270
				applicationContext.addApplicationListener(listener);
271
			}
272
		}
273

    
274
		//		String message = "Start application context. This might take a while ...";
275
		////		progressMonitor.subTask(message);
276
		//		SubProgressMonitor subMonitor= new SubProgressMonitor(progressMonitor, 10);
277
		//		subMonitor.beginTask(message, 2);
278
		//		applicationContext.setProgressMonitor(subMonitor);
279

    
280
		applicationContext.refresh(new SubProgressMonitor(progressMonitor, refreshTasks));
281
		applicationContext.start();
282
		//		progressMonitor.worked(1);
283

    
284
		progressMonitor.subTask("Cleaning up.");
285
		setApplicationContext(applicationContext);
286
		progressMonitor.worked(1);
287

    
288
		progressMonitor.done();
289
		return true;
290
	}
291

    
292
	/**
293
     * Overrides all default with values in hibernate config, if defined
294
     * @param hibernatePropBean
295
     * @param hibernateConfig
296
     */
297
    private void registerHibernateConfig(BeanDefinition hibernatePropBean, HibernateConfiguration hibernateConfig) {
298
        setHibernateProperty(hibernatePropBean, HibernateConfiguration.REGISTER_ENVERS,
299
                hibernateConfig.getRegisterEnvers());
300
        setHibernateProperty(hibernatePropBean, HibernateConfiguration.REGISTER_SEARCH,
301
                hibernateConfig.getRegisterSearch());
302
        setHibernateProperty(hibernatePropBean, HibernateConfiguration.SHOW_SQL,
303
                hibernateConfig.getShowSql());
304
        setHibernateProperty(hibernatePropBean, HibernateConfiguration.FORMAT_SQL,
305
                hibernateConfig.getFormatSql());
306
    }
307

    
308

    
309
    private void setHibernateProperty(BeanDefinition hibernatePropBean, String key, Boolean value) {
310
	    if (value != null){
311
	        setHibernateProperty(hibernatePropBean, key, String.valueOf(value));
312
	    }
313
	}
314
    private void setHibernateProperty(BeanDefinition hibernatePropBean, String key, String value) {
315
        if (value != null){
316
            Properties props = (Properties)hibernatePropBean.getPropertyValues().get("properties");
317
            props.setProperty(key, value);
318
        }
319
    }
320

    
321

    
322
	/**
323
	 * Tests if some DefinedTermsAreMissing.
324
	 *
325
	 * @return true, if at least one is missing, else false
326
	 */
327
	public boolean testDefinedTermsAreMissing(){
328
		UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
329
		DefinedTermBase<?> english = this.getTermService().load(englishUuid);
330
		if (english == null || !english.getUuid().equals(englishUuid)) {
331
			return true;
332
		}
333
		else {
334
			return false;
335
		}
336
	}
337

    
338

    
339
	/**
340
	 * Changes the ApplicationContext to the new dataSource
341
	 *
342
	 * @param dataSource
343
	 */
344
	public boolean changeDataSource(ICdmDataSource dataSource){
345
		//logger.info("Change datasource to : " + dataSource);
346
		return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, null, false, null);
347
	}
348

    
349

    
350
	/**
351
	 * Changes the ApplicationContext to the new dataSource
352
	 *
353
	 * @param dataSource
354
	 * @param dbSchemaValidation
355
	 */
356
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
357
		//logger.info("Change datasource to : " + dataSource);
358
		return setNewDataSource(dataSource, dbSchemaValidation, null, false, null);
359
	}
360

    
361

    
362
	/**
363
	 * Changes the ApplicationContext to the new dataSource
364
	 *
365
	 * @param dataSource
366
	 * @param dbSchemaValidation
367
	 * @param omitTermLoading
368
	 */
369
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
370
		logger.info("Change datasource to : " + dataSource);
371
		return setNewDataSource(dataSource, dbSchemaValidation, null, omitTermLoading, null);
372
	}
373

    
374

    
375
	/**
376
	 * Changes the ApplicationContext to the new dataSource
377
	 *
378
	 * @param dataSource
379
	 * @param dbSchemaValidation
380
	 * @param omitTermLoading
381
	 */
382
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,
383
			List<ApplicationListener> listeners){
384
		logger.info("Change datasource to : " + dataSource);
385
		return setNewDataSource(dataSource, dbSchemaValidation, null, omitTermLoading, listeners);
386
	}
387

    
388

    
389
	/**
390
	 * Sets a new application Context.
391
	 *
392
	 * @param ac
393
	 */
394
	public void setApplicationContext(AbstractApplicationContext ac){
395
		closeApplicationContext(); //closes old application context if necessary
396
		applicationContext = ac;
397
		applicationContext.registerShutdownHook();
398
		init();
399
	}
400

    
401
	@Override
402
	public void finalize(){
403
		close();
404
	}
405

    
406
	/**
407
	 * closes the application
408
	 */
409
	public void close(){
410
		closeApplicationContext();
411
	}
412

    
413

    
414
	/**
415
	 * closes the application context
416
	 */
417
	protected void closeApplicationContext(){
418
		if (applicationContext != null) {
419
			logger.info("Close ApplicationContext");
420
			applicationContext.close();
421
		}
422
	}
423

    
424

    
425
	protected void init(){
426
		logger.debug("Init " + this.getClass().getName() + " ... ");
427
		if (logger.isDebugEnabled()) {
428
			for (String beanName : applicationContext.getBeanDefinitionNames()) {
429
				logger.debug(beanName);
430
			}
431
		}
432
		//TODO delete next row (was just for testing)
433
		if (logger.isInfoEnabled()) {
434
			logger.info("Registered Beans: ");
435
			String[] beanNames = applicationContext.getBeanDefinitionNames();
436
			for (String beanName : beanNames) {
437
				logger.info(beanName);
438
			}
439
		}
440
		configuration = (ICdmRepository) applicationContext.getBean("cdmRepository");
441
		try {
442
			//FIXME:Remoting catching exection to allow for remoting
443
			getDatabaseService().setApplicationController(this);
444
		}
445
		catch (UnsupportedOperationException uoe) {
446
			logger.warn("getDatabaseService() is not implmented for current application context");
447
		}
448
	}
449

    
450

    
451
	/* ****** Services ******** */
452
	@Override
453
	public final IAnnotationService getAnnotationService(){
454
	    return configuration.getAnnotationService();
455
	}
456

    
457
	@Override
458
	public final INameService getNameService(){
459
	    return configuration.getNameService();
460
	}
461

    
462

    
463
	@Override
464
	public final ITaxonService getTaxonService(){
465
		return configuration.getTaxonService();
466
	}
467

    
468

    
469
	@Override
470
	public final IClassificationService getClassificationService(){
471
		return configuration.getClassificationService();
472
	}
473

    
474

    
475
	@Override
476
	public final ITaxonNodeService getTaxonNodeService(){
477
	    try{
478
	        return configuration.getTaxonNodeService();
479
	    } catch (Exception e){
480
	        e.printStackTrace();
481
	    }
482
	    return null;
483
	}
484

    
485

    
486
	@Override
487
	public final IReferenceService getReferenceService(){
488
		return configuration.getReferenceService();
489
	}
490

    
491

    
492
	@Override
493
	public final IAgentService getAgentService(){
494
		return configuration.getAgentService();
495
	}
496

    
497

    
498
	@Override
499
	public final IDatabaseService getDatabaseService(){
500
		return configuration.getDatabaseService();
501
	}
502

    
503

    
504
	@Override
505
	public final ITermService getTermService(){
506
		return configuration.getTermService();
507
	}
508

    
509

    
510
	@Override
511
	public final IDescriptionService getDescriptionService(){
512
		return configuration.getDescriptionService();
513
	}
514

    
515

    
516
	@Override
517
	public final IOccurrenceService getOccurrenceService(){
518
		return configuration.getOccurrenceService();
519
	}
520

    
521
	@Override
522
	public IAmplificationService getAmplificationService(){
523
		return configuration.getAmplificationService();
524
	}
525

    
526
	@Override
527
	public ISequenceService getSequenceService(){
528
		return configuration.getSequenceService();
529
	}
530

    
531
	@Override
532
	public IEventBaseService getEventBaseService() {
533
	    return configuration.getEventBaseService();
534
	}
535

    
536

    
537

    
538
	@Override
539
	public final IPrimerService getPrimerService(){
540
		return configuration.getPrimerService();
541
	}
542

    
543

    
544
	@Override
545
	public final IMediaService getMediaService(){
546
		return configuration.getMediaService();
547
	}
548

    
549

    
550
    @Override
551
    public final IMetadataService getMetadataService(){
552
        return configuration.getMetadataService();
553
    }
554

    
555

    
556
	@Override
557
	public final ICommonService getCommonService(){
558
		return configuration.getCommonService();
559
	}
560

    
561

    
562
	@Override
563
	public final ILocationService getLocationService(){
564
		return configuration.getLocationService();
565
	}
566

    
567

    
568
	@Override
569
	public final IUserService getUserService(){
570
		return configuration.getUserService();
571
	}
572

    
573

    
574
	@Override
575
	public final IGrantedAuthorityService getGrantedAuthorityService(){
576
		return configuration.getGrantedAuthorityService();
577
	}
578

    
579

    
580
	@Override
581
	public IGroupService getGroupService(){
582
		return configuration.getGroupService();
583
	}
584

    
585

    
586
	@Override
587
	public final ICollectionService getCollectionService(){
588
		return configuration.getCollectionService();
589
	}
590

    
591

    
592
	@Override
593
	public final IFeatureTreeService getFeatureTreeService(){
594
		return configuration.getFeatureTreeService();
595
	}
596

    
597
	@Override
598
	public final IPreferenceService getPreferenceService(){
599
	    return configuration.getPreferenceService();
600
	}
601

    
602

    
603
	@Override
604
	public final IFeatureNodeService getFeatureNodeService(){
605
		return configuration.getFeatureNodeService();
606
	}
607

    
608

    
609
	@Override
610
	public final IVocabularyService getVocabularyService(){
611
		return configuration.getVocabularyService();
612
	}
613

    
614

    
615
	@Override
616
	public final IIdentificationKeyService getIdentificationKeyService(){
617
		return configuration.getIdentificationKeyService();
618
	}
619

    
620

    
621
	@Override
622
	public final IPolytomousKeyService getPolytomousKeyService(){
623
		return configuration.getPolytomousKeyService();
624
	}
625

    
626

    
627
	@Override
628
	public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){
629
		return configuration.getPolytomousKeyNodeService();
630
	}
631

    
632

    
633
    /**
634
     * {@inheritDoc}
635
     */
636
    @Override
637
    public IProgressMonitorService getProgressMonitorService() {
638
        return configuration.getProgressMonitorService();
639
    }
640

    
641

    
642
	@Override
643
	public IEntityValidationService getEntityValidationService(){
644
		return configuration.getEntityValidationService();
645
	}
646

    
647

    
648
	@Override
649
	public IEntityConstraintViolationService getEntityConstraintViolationService(){
650
		return configuration.getEntityConstraintViolationService();
651
	}
652

    
653
	@Override
654
	public final IDescriptiveDataSetService getDescriptiveDataSetService(){
655
		return configuration.getDescriptiveDataSetService();
656
	}
657

    
658

    
659
	@Override
660
	public final ConversationHolder NewConversation(){
661
		//return (ConversationHolder)applicationContext.getBean("conversationHolder");
662
		return configuration.NewConversation();
663
	}
664

    
665

    
666
	/* **** Security ***** */
667

    
668
	@Override
669
	public void authenticate(String username, String password){
670
		UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
671
		Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
672
		SecurityContext context = SecurityContextHolder.getContext();
673
		context.setAuthentication(authentication);
674
	}
675

    
676
	@Override
677
	public final ProviderManager getAuthenticationManager(){
678
		return configuration.getAuthenticationManager();
679
	}
680

    
681

    
682
	@Override
683
	public ICdmPermissionEvaluator getPermissionEvaluator(){
684
		return configuration.getPermissionEvaluator();
685
	}
686

    
687
	/**
688
	 * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication,
689
	 *      java.lang.Object, java.lang.Object)
690
	 *
691
	 * @param targetDomainObject
692
	 * @param permission
693
	 * @return
694
	 */
695
	public boolean currentAuthentiationHasPermissions(CdmBase targetDomainObject, EnumSet<CRUD> permission){
696
		SecurityContext context = SecurityContextHolder.getContext();
697
		return getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject, permission);
698
	}
699

    
700

    
701
	@Override
702
	public final PlatformTransactionManager getTransactionManager(){
703
		return configuration.getTransactionManager();
704
	}
705

    
706

    
707
	@Override
708
	public final Object getBean(String name){
709
		return this.applicationContext.getBean(name);
710
	}
711

    
712

    
713
	/*
714
	 * OLD TRANSACTION STUFF
715
	 */
716

    
717
	/* **** flush ********** */
718
	public void flush(){
719
		SessionFactory sf = (SessionFactory) applicationContext.getBean("sessionFactory");
720
		sf.getCurrentSession().flush();
721
	}
722

    
723

    
724
	public SessionFactory getSessionFactory(){
725
		return (SessionFactory) applicationContext.getBean("sessionFactory");
726
	}
727

    
728

    
729
	@Override
730
	public TransactionStatus startTransaction(){
731
		return startTransaction(false);
732
	}
733

    
734

    
735
	@Override
736
	public TransactionStatus startTransaction(Boolean readOnly){
737
		return configuration.startTransaction(readOnly);
738
	}
739

    
740
	@Override
741
	public void commitTransaction(TransactionStatus txStatus){
742
		PlatformTransactionManager txManager = configuration.getTransactionManager();
743
		txManager.commit(txStatus);
744
		return;
745
	}
746

    
747

    
748
    /**
749
     * {@inheritDoc}
750
     */
751
    @Override
752
    public IRightsService getRightsService() {
753
        return configuration.getRightsService();
754
    }
755

    
756

    
757
    /**
758
     * {@inheritDoc}
759
     */
760
    @Override
761
    public IRegistrationService getRegistrationService() {
762
        return configuration.getRegistrationService();
763
    }
764

    
765
}
766

    
(3-3/12)