Project

General

Profile

« Previous | Next » 

Revision 3087df1b

Added by Cherian Mathew over 8 years ago

#5297 Refactor ProgressMonitorController, Add Remoting Progress monitor

#5297 Add progress monitor service, Add test services

#5297 Add monit import method

#5297 Update no. of work units

#5297 Add new thread class for remoting monitors

#5297 Add owner field to monitor thread and user checks in service

#5297 Add javadoc

View differences:

cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationController.java
1
// $Id$
2
/**
3
 * Copyright (C) 2007 EDIT
4
 * European Distributed Institute of Taxonomy
5
 * http://www.e-taxonomy.eu
6
 *
7
 * The contents of this file are subject to the Mozilla Public License Version 1.1
8
 * See LICENSE.TXT at the top of this package for the full license terms.
9
 */
10

  
11
package eu.etaxonomy.cdm.api.application;
12 1

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

  
12
package eu.etaxonomy.cdm.api.application;
13

  
13 14
import java.util.EnumSet;
14 15
import java.util.List;
15 16
import java.util.UUID;
......
52 53
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
53 54
import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
54 55
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
56
import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
55 57
import eu.etaxonomy.cdm.api.service.IReferenceService;
56 58
import eu.etaxonomy.cdm.api.service.IService;
57 59
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
......
74 76
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
75 77
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
76 78
import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
79

  
80
/**
81
 * @author a.mueller
82
 */
83
public class CdmApplicationController implements ICdmApplicationConfiguration {
84
	private static final Logger logger = Logger.getLogger(CdmApplicationController.class);
85

  
86
	public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE = "/eu/etaxonomy/cdm/defaultApplicationContext.xml";
87

  
88
	public AbstractApplicationContext applicationContext;
89
	protected ICdmApplicationConfiguration configuration;
90
	private final Resource applicationContextResource;
91

  
92
	private final IProgressMonitor progressMonitor;
93

  
94
	final protected static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;
95

  
96

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

  
109

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

  
123

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

  
134

  
135
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
136
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
137
	}
138

  
139

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

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

  
149
	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,
150
			DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){
151
		return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor, null);
152
	}
153

  
154

  
155
	//TODO discuss need for listeners before commit to trunk
156
	//	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners) {
157
	//		return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor,listeners);
158
	//	}
159

  
160
	/**
161
	 * @return
162
	 */
163
	protected static ClassPathResource getClasspathResource(){
164
		return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);
165
	}
166

  
167

  
168
	/**
169
	 * @return
170
	 * @throws DataSourceNotFoundException
171
	 */
172
	protected static CdmPersistentDataSource getDefaultDatasource() throws DataSourceNotFoundException{
173
		CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();
174
		return dataSource;
175
	}
176

  
177

  
178
	/**
179
	 *
180
	 * FIXME:Remoting this constructor is added only to allow extension of this cntroller
181
	 * class. and should be removed after refactoring
182
	 */
183
	protected CdmApplicationController(){
184
		applicationContextResource = null;
185
		progressMonitor = null;
186
	}
187

  
188

  
189
	/**
190
	 * Constructor, opens an spring 2.5 ApplicationContext by using the according data
191
	 * source
192
	 *
193
	 * @param dataSource
194
	 * @param dbSchemaValidation
195
	 * @param omitTermLoading
196
	 */
197
	protected CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation,
198
			boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners){
199
		logger.info("Start CdmApplicationController with datasource: " + dataSource.getName());
200

  
201
		if (dbSchemaValidation == null) {
202
			dbSchemaValidation = defaultDbSchemaValidation;
203
		}
204
		this.applicationContextResource = applicationContextResource != null ? applicationContextResource : getClasspathResource();
205
		this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();
206

  
207
		setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);
208
	}
209

  
210

  
211
	/**
212
	 * Sets the application context to a new spring ApplicationContext by using the
213
	 * according data source and initializes the Controller.
214
	 *
215
	 * @param dataSource
216
	 */
217
	private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,
218
			List<ApplicationListener> listeners){
219

  
220
		if (dbSchemaValidation == null) {
221
			dbSchemaValidation = defaultDbSchemaValidation;
222
		}
223
		logger.info("Connecting to '" + dataSource.getName() + "'");
224

  
225
		MonitoredGenericApplicationContext applicationContext = new MonitoredGenericApplicationContext();
226
		int refreshTasks = 45;
227
		int nTasks = 5 + refreshTasks;
228
		//		nTasks += applicationContext.countTasks();
229
		progressMonitor.beginTask("Connecting to '" + dataSource.getName() + "'", nTasks);
230

  
231
		//		progressMonitor.worked(1);
232

  
233
		BeanDefinition datasourceBean = dataSource.getDatasourceBean();
234
		datasourceBean.setAttribute("isLazy", false);
235
		progressMonitor.subTask("Registering datasource.");
236
		applicationContext.registerBeanDefinition("dataSource", datasourceBean);
237
		progressMonitor.worked(1);
238

  
239
		BeanDefinition hibernatePropBean = dataSource.getHibernatePropertiesBean(dbSchemaValidation);
240
		applicationContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);
241

  
242
		XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);
243
		progressMonitor.subTask("Registering resources.");
244
		xmlReader.loadBeanDefinitions(applicationContextResource);
245
		progressMonitor.worked(1);
246

  
247
		//omitTerms
248
		if (omitTermLoading == true) {
249
			String initializerName = "persistentTermInitializer";
250
			BeanDefinition beanDef = applicationContext.getBeanDefinition(initializerName);
251
			MutablePropertyValues values = beanDef.getPropertyValues();
252
			values.addPropertyValue("omit", omitTermLoading);
253
		}
254

  
255
		if (listeners != null) {
256
			for (ApplicationListener listener : listeners) {
257
				applicationContext.addApplicationListener(listener);
258
			}
259
		}
260

  
261
		//		String message = "Start application context. This might take a while ...";
262
		////		progressMonitor.subTask(message);
263
		//		SubProgressMonitor subMonitor= new SubProgressMonitor(progressMonitor, 10);
264
		//		subMonitor.beginTask(message, 2);
265
		//		applicationContext.setProgressMonitor(subMonitor);
266

  
267
		applicationContext.refresh(new SubProgressMonitor(progressMonitor, refreshTasks));
268
		applicationContext.start();
269
		//		progressMonitor.worked(1);
270

  
271
		progressMonitor.subTask("Cleaning up.");
272
		setApplicationContext(applicationContext);
273
		progressMonitor.worked(1);
274

  
275
		progressMonitor.done();
276
		return true;
277
	}
278

  
279

  
280
	/**
281
	 * Tests if some DefinedTermsAreMissing.
282
	 *
283
	 * @return true, if at least one is missing, else false
284
	 */
285
	public boolean testDefinedTermsAreMissing(){
286
		UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
287
		DefinedTermBase<?> english = this.getTermService().load(englishUuid);
288
		if (english == null || !english.getUuid().equals(englishUuid)) {
289
			return true;
290
		}
291
		else {
292
			return false;
293
		}
294
	}
295

  
296

  
297
	/**
298
	 * Changes the ApplicationContext to the new dataSource
299
	 *
300
	 * @param dataSource
301
	 */
302
	public boolean changeDataSource(ICdmDataSource dataSource){
303
		//logger.info("Change datasource to : " + dataSource);
304
		return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false, null);
305
	}
306

  
307

  
308
	/**
309
	 * Changes the ApplicationContext to the new dataSource
310
	 *
311
	 * @param dataSource
312
	 * @param dbSchemaValidation
313
	 */
314
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
315
		//logger.info("Change datasource to : " + dataSource);
316
		return setNewDataSource(dataSource, dbSchemaValidation, false, null);
317
	}
318

  
319

  
320
	/**
321
	 * Changes the ApplicationContext to the new dataSource
322
	 *
323
	 * @param dataSource
324
	 * @param dbSchemaValidation
325
	 * @param omitTermLoading
326
	 */
327
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
328
		logger.info("Change datasource to : " + dataSource);
329
		return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, null);
330
	}
331

  
332

  
333
	/**
334
	 * Changes the ApplicationContext to the new dataSource
335
	 *
336
	 * @param dataSource
337
	 * @param dbSchemaValidation
338
	 * @param omitTermLoading
339
	 */
340
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,
341
			List<ApplicationListener> listeners){
342
		logger.info("Change datasource to : " + dataSource);
343
		return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);
344
	}
345

  
346

  
347
	/**
348
	 * Sets a new application Context.
349
	 *
350
	 * @param ac
351
	 */
352
	public void setApplicationContext(AbstractApplicationContext ac){
353
		closeApplicationContext(); //closes old application context if necessary
354
		applicationContext = ac;
355
		applicationContext.registerShutdownHook();
356
		init();
357
	}
358

  
359

  
360
	/*
361
	 * (non-Javadoc)
362
	 *
363
	 * @see java.lang.Object#finalize()
364
	 */
365
	@Override
366
	public void finalize(){
367
		close();
368
	}
369

  
370

  
371
	/**
372
	 * closes the application
373
	 */
374
	public void close(){
375
		closeApplicationContext();
376
	}
377

  
378

  
379
	/**
380
	 * closes the application context
381
	 */
382
	protected void closeApplicationContext(){
383
		if (applicationContext != null) {
384
			logger.info("Close ApplicationContext");
385
			applicationContext.close();
386
		}
387
	}
388

  
389

  
390
	protected void init(){
391
		logger.debug("Init " + this.getClass().getName() + " ... ");
392
		if (logger.isDebugEnabled()) {
393
			for (String beanName : applicationContext.getBeanDefinitionNames()) {
394
				logger.debug(beanName);
395
			}
396
		}
397
		//TODO delete next row (was just for testing)
398
		if (logger.isInfoEnabled()) {
399
			logger.info("Registered Beans: ");
400
			String[] beanNames = applicationContext.getBeanDefinitionNames();
401
			for (String beanName : beanNames) {
402
				logger.info(beanName);
403
			}
404
		}
405
		configuration = (ICdmApplicationConfiguration) applicationContext.getBean("cdmApplicationDefaultConfiguration");
406
		try {
407
			//FIXME:Remoting catching exection to allow for remoting
408
			getDatabaseService().setApplicationController(this);
409
		}
410
		catch (UnsupportedOperationException uoe) {
411
			logger.warn("getDatabaseService() is not implmented for current application context");
412
		}
413
	}
414

  
415

  
416
	/* ****** Services ******** */
417
	@Override
418
	public final IAnnotationService getAnnotationService(){
419
	    return configuration.getAnnotationService();
420
	}
421

  
422
	@Override
423
	public final INameService getNameService(){
424
	    return configuration.getNameService();
425
	}
426

  
427

  
428
	@Override
429
	public final ITaxonService getTaxonService(){
430
		return configuration.getTaxonService();
431
	}
432

  
433

  
434
	@Override
435
	public final IClassificationService getClassificationService(){
436
		return configuration.getClassificationService();
437
	}
438

  
439

  
440
	@Override
441
	public final ITaxonNodeService getTaxonNodeService(){
442
		return configuration.getTaxonNodeService();
443
	}
444

  
445

  
446
	@Override
447
	public final IReferenceService getReferenceService(){
448
		return configuration.getReferenceService();
449
	}
450

  
451

  
452
	@Override
453
	public final IAgentService getAgentService(){
454
		return configuration.getAgentService();
455
	}
456

  
457

  
458
	@Override
459
	public final IDatabaseService getDatabaseService(){
460
		return configuration.getDatabaseService();
461
	}
462

  
463

  
464
	@Override
465
	public final ITermService getTermService(){
466
		return configuration.getTermService();
467
	}
468

  
469

  
470
	@Override
471
	public final IDescriptionService getDescriptionService(){
472
		return configuration.getDescriptionService();
473
	}
474

  
475

  
476
	@Override
477
	public final IOccurrenceService getOccurrenceService(){
478
		return configuration.getOccurrenceService();
479
	}
480

  
481
	@Override
482
	public IAmplificationService getAmplificationService(){
483
		return configuration.getAmplificationService();
484
	}
485

  
486
	@Override
487
	public ISequenceService getSequenceService(){
488
		return configuration.getSequenceService();
489
	}
490

  
491

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

  
497

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

  
503

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

  
509

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

  
515

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

  
521

  
522
	@Override
523
	public final IGrantedAuthorityService getGrantedAuthorityService(){
524
		return configuration.getGrantedAuthorityService();
525
	}
526

  
527

  
528
	@Override
529
	public IGroupService getGroupService(){
530
		return configuration.getGroupService();
531
	}
532

  
533

  
534
	@Override
535
	public final ICollectionService getCollectionService(){
536
		return configuration.getCollectionService();
537
	}
538

  
539

  
540
	@Override
541
	public final IFeatureTreeService getFeatureTreeService(){
542
		return configuration.getFeatureTreeService();
543
	}
544

  
545

  
546
	@Override
547
	public final IFeatureNodeService getFeatureNodeService(){
548
		return configuration.getFeatureNodeService();
549
	}
550

  
551

  
552
	@Override
553
	public final IVocabularyService getVocabularyService(){
554
		return configuration.getVocabularyService();
555
	}
556

  
557

  
558
	@Override
559
	public final IIdentificationKeyService getIdentificationKeyService(){
560
		return configuration.getIdentificationKeyService();
561
	}
562

  
563

  
564
	@Override
565
	public final IPolytomousKeyService getPolytomousKeyService(){
566
		return configuration.getPolytomousKeyService();
567
	}
568

  
569

  
570
	@Override
571
	public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){
572
		return configuration.getPolytomousKeyNodeService();
573
	}
574

  
575

  
576
    /**
577
     * {@inheritDoc}
578
     */
579
    @Override
580
    public IProgressMonitorService getProgressMonitorService() {
581
        return configuration.getProgressMonitorService();
582
    }
583

  
584

  
585
	@Override
586
	public IEntityValidationService getEntityValidationService(){
587
		return configuration.getEntityValidationService();
588
	}
589

  
590

  
591
	@Override
592
	public IEntityConstraintViolationService getEntityConstraintViolationService(){
593
		return configuration.getEntityConstraintViolationService();
594
	}
595

  
596

  
597
	@Override
598
	public final IService<CdmBase> getMainService(){
599
		return configuration.getMainService();
600
	}
601

  
602

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

  
608

  
609
	@Override
610
	public final ConversationHolder NewConversation(){
611
		//return (ConversationHolder)applicationContext.getBean("conversationHolder");
612
		return configuration.NewConversation();
613
	}
614

  
615

  
616
	/* **** Security ***** */
617

  
618
	@Override
619
	public void authenticate(String username, String password){
620
		UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
621
		Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
622
		SecurityContext context = SecurityContextHolder.getContext();
623
		context.setAuthentication(authentication);
624
	}
625

  
626
	@Override
627
	public final ProviderManager getAuthenticationManager(){
628
		return configuration.getAuthenticationManager();
629
	}
630

  
631

  
632
	@Override
633
	public ICdmPermissionEvaluator getPermissionEvaluator(){
634
		return configuration.getPermissionEvaluator();
635
	}
636

  
637
	/**
638
	 * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication,
639
	 *      java.lang.Object, java.lang.Object)
640
	 *
641
	 * @param targetDomainObject
642
	 * @param permission
643
	 * @return
644
	 */
645
	public boolean currentAuthentiationHasPermissions(CdmBase targetDomainObject, EnumSet<CRUD> permission){
646
		SecurityContext context = SecurityContextHolder.getContext();
647
		return getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject, permission);
648
	}
649

  
650

  
651
	@Override
652
	public final PlatformTransactionManager getTransactionManager(){
653
		return configuration.getTransactionManager();
654
	}
655

  
656

  
657
	@Override
658
	public final Object getBean(String name){
659
		return this.applicationContext.getBean(name);
660
	}
661

  
662

  
663
	/*
664
	 * OLD TRANSACTION STUFF
665
	 */
666

  
667
	/* **** flush ********** */
668
	public void flush(){
669
		SessionFactory sf = (SessionFactory) applicationContext.getBean("sessionFactory");
670
		sf.getCurrentSession().flush();
671
	}
672

  
673

  
674
	public SessionFactory getSessionFactory(){
675
		return (SessionFactory) applicationContext.getBean("sessionFactory");
676
	}
677

  
678

  
679
	@Override
680
	public TransactionStatus startTransaction(){
681
		return startTransaction(false);
682
	}
683

  
684

  
685
	@Override
686
	public TransactionStatus startTransaction(Boolean readOnly){
687
		return configuration.startTransaction(readOnly);
688
	}
689

  
690
	@Override
691
	public void commitTransaction(TransactionStatus txStatus){
692
		PlatformTransactionManager txManager = configuration.getTransactionManager();
693
		txManager.commit(txStatus);
694
		return;
695
	}
696

  
697
}
77 698

  
78
/**
79
 * @author a.mueller
80
 */
81
public class CdmApplicationController implements ICdmApplicationConfiguration {
82
	private static final Logger logger = Logger.getLogger(CdmApplicationController.class);
83

  
84
	public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE = "/eu/etaxonomy/cdm/defaultApplicationContext.xml";
85

  
86
	public AbstractApplicationContext applicationContext;
87
	protected ICdmApplicationConfiguration configuration;
88
	private final Resource applicationContextResource;
89

  
90
	private final IProgressMonitor progressMonitor;
91

  
92
	final protected static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;
93

  
94

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

  
107

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

  
121

  
122
	/**
123
	 * Constructor, opens an spring ApplicationContext by using the according data source
124
	 * and the default database schema validation type
125
	 *
126
	 * @param dataSource
127
	 */
128
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource){
129
		return CdmApplicationController.NewInstance(null, dataSource, defaultDbSchemaValidation, false);
130
	}
131

  
132

  
133
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
134
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
135
	}
136

  
137

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

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

  
147
	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,
148
			DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){
149
		return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor, null);
150
	}
151

  
152

  
153
	//TODO discuss need for listeners before commit to trunk
154
	//	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners) {
155
	//		return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor,listeners);
156
	//	}
157

  
158
	/**
159
	 * @return
160
	 */
161
	protected static ClassPathResource getClasspathResource(){
162
		return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);
163
	}
164

  
165

  
166
	/**
167
	 * @return
168
	 * @throws DataSourceNotFoundException
169
	 */
170
	protected static CdmPersistentDataSource getDefaultDatasource() throws DataSourceNotFoundException{
171
		CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();
172
		return dataSource;
173
	}
174

  
175

  
176
	/**
177
	 *
178
	 * FIXME:Remoting this constructor is added only to allow extension of this cntroller
179
	 * class. and should be removed after refactoring
180
	 */
181
	protected CdmApplicationController(){
182
		applicationContextResource = null;
183
		progressMonitor = null;
184
	}
185

  
186

  
187
	/**
188
	 * Constructor, opens an spring 2.5 ApplicationContext by using the according data
189
	 * source
190
	 *
191
	 * @param dataSource
192
	 * @param dbSchemaValidation
193
	 * @param omitTermLoading
194
	 */
195
	protected CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation,
196
			boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners){
197
		logger.info("Start CdmApplicationController with datasource: " + dataSource.getName());
198

  
199
		if (dbSchemaValidation == null) {
200
			dbSchemaValidation = defaultDbSchemaValidation;
201
		}
202
		this.applicationContextResource = applicationContextResource != null ? applicationContextResource : getClasspathResource();
203
		this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();
204

  
205
		setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);
206
	}
207

  
208

  
209
	/**
210
	 * Sets the application context to a new spring ApplicationContext by using the
211
	 * according data source and initializes the Controller.
212
	 *
213
	 * @param dataSource
214
	 */
215
	private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,
216
			List<ApplicationListener> listeners){
217

  
218
		if (dbSchemaValidation == null) {
219
			dbSchemaValidation = defaultDbSchemaValidation;
220
		}
221
		logger.info("Connecting to '" + dataSource.getName() + "'");
222

  
223
		MonitoredGenericApplicationContext applicationContext = new MonitoredGenericApplicationContext();
224
		int refreshTasks = 45;
225
		int nTasks = 5 + refreshTasks;
226
		//		nTasks += applicationContext.countTasks();
227
		progressMonitor.beginTask("Connecting to '" + dataSource.getName() + "'", nTasks);
228

  
229
		//		progressMonitor.worked(1);
230

  
231
		BeanDefinition datasourceBean = dataSource.getDatasourceBean();
232
		datasourceBean.setAttribute("isLazy", false);
233
		progressMonitor.subTask("Registering datasource.");
234
		applicationContext.registerBeanDefinition("dataSource", datasourceBean);
235
		progressMonitor.worked(1);
236

  
237
		BeanDefinition hibernatePropBean = dataSource.getHibernatePropertiesBean(dbSchemaValidation);
238
		applicationContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);
239

  
240
		XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);
241
		progressMonitor.subTask("Registering resources.");
242
		xmlReader.loadBeanDefinitions(applicationContextResource);
243
		progressMonitor.worked(1);
244

  
245
		//omitTerms
246
		if (omitTermLoading == true) {
247
			String initializerName = "persistentTermInitializer";
248
			BeanDefinition beanDef = applicationContext.getBeanDefinition(initializerName);
249
			MutablePropertyValues values = beanDef.getPropertyValues();
250
			values.addPropertyValue("omit", omitTermLoading);
251
		}
252

  
253
		if (listeners != null) {
254
			for (ApplicationListener listener : listeners) {
255
				applicationContext.addApplicationListener(listener);
256
			}
257
		}
258

  
259
		//		String message = "Start application context. This might take a while ...";
260
		////		progressMonitor.subTask(message);
261
		//		SubProgressMonitor subMonitor= new SubProgressMonitor(progressMonitor, 10);
262
		//		subMonitor.beginTask(message, 2);
263
		//		applicationContext.setProgressMonitor(subMonitor);
264

  
265
		applicationContext.refresh(new SubProgressMonitor(progressMonitor, refreshTasks));
266
		applicationContext.start();
267
		//		progressMonitor.worked(1);
268

  
269
		progressMonitor.subTask("Cleaning up.");
270
		setApplicationContext(applicationContext);
271
		progressMonitor.worked(1);
272

  
273
		progressMonitor.done();
274
		return true;
275
	}
276

  
277

  
278
	/**
279
	 * Tests if some DefinedTermsAreMissing.
280
	 *
281
	 * @return true, if at least one is missing, else false
282
	 */
283
	public boolean testDefinedTermsAreMissing(){
284
		UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
285
		DefinedTermBase<?> english = this.getTermService().load(englishUuid);
286
		if (english == null || !english.getUuid().equals(englishUuid)) {
287
			return true;
288
		}
289
		else {
290
			return false;
291
		}
292
	}
293

  
294

  
295
	/**
296
	 * Changes the ApplicationContext to the new dataSource
297
	 *
298
	 * @param dataSource
299
	 */
300
	public boolean changeDataSource(ICdmDataSource dataSource){
301
		//logger.info("Change datasource to : " + dataSource);
302
		return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false, null);
303
	}
304

  
305

  
306
	/**
307
	 * Changes the ApplicationContext to the new dataSource
308
	 *
309
	 * @param dataSource
310
	 * @param dbSchemaValidation
311
	 */
312
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
313
		//logger.info("Change datasource to : " + dataSource);
314
		return setNewDataSource(dataSource, dbSchemaValidation, false, null);
315
	}
316

  
317

  
318
	/**
319
	 * Changes the ApplicationContext to the new dataSource
320
	 *
321
	 * @param dataSource
322
	 * @param dbSchemaValidation
323
	 * @param omitTermLoading
324
	 */
325
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
326
		logger.info("Change datasource to : " + dataSource);
327
		return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, null);
328
	}
329

  
330

  
331
	/**
332
	 * Changes the ApplicationContext to the new dataSource
333
	 *
334
	 * @param dataSource
335
	 * @param dbSchemaValidation
336
	 * @param omitTermLoading
337
	 */
338
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,
339
			List<ApplicationListener> listeners){
340
		logger.info("Change datasource to : " + dataSource);
341
		return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);
342
	}
343

  
344

  
345
	/**
346
	 * Sets a new application Context.
347
	 *
348
	 * @param ac
349
	 */
350
	public void setApplicationContext(AbstractApplicationContext ac){
351
		closeApplicationContext(); //closes old application context if necessary
352
		applicationContext = ac;
353
		applicationContext.registerShutdownHook();
354
		init();
355
	}
356

  
357

  
358
	/*
359
	 * (non-Javadoc)
360
	 *
361
	 * @see java.lang.Object#finalize()
362
	 */
363
	@Override
364
	public void finalize(){
365
		close();
366
	}
367

  
368

  
369
	/**
370
	 * closes the application
371
	 */
372
	public void close(){
373
		closeApplicationContext();
374
	}
375

  
376

  
377
	/**
378
	 * closes the application context
379
	 */
380
	protected void closeApplicationContext(){
381
		if (applicationContext != null) {
382
			logger.info("Close ApplicationContext");
383
			applicationContext.close();
384
		}
385
	}
386

  
387

  
388
	protected void init(){
389
		logger.debug("Init " + this.getClass().getName() + " ... ");
390
		if (logger.isDebugEnabled()) {
391
			for (String beanName : applicationContext.getBeanDefinitionNames()) {
392
				logger.debug(beanName);
393
			}
394
		}
395
		//TODO delete next row (was just for testing)
396
		if (logger.isInfoEnabled()) {
397
			logger.info("Registered Beans: ");
398
			String[] beanNames = applicationContext.getBeanDefinitionNames();
399
			for (String beanName : beanNames) {
400
				logger.info(beanName);
401
			}
402
		}
403
		configuration = (ICdmApplicationConfiguration) applicationContext.getBean("cdmApplicationDefaultConfiguration");
404
		try {
405
			//FIXME:Remoting catching exection to allow for remoting
406
			getDatabaseService().setApplicationController(this);
407
		}
408
		catch (UnsupportedOperationException uoe) {
409
			logger.warn("getDatabaseService() is not implmented for current application context");
410
		}
411
	}
412

  
413

  
414
	/* ****** Services ******** */
415
	@Override
416
	public final IAnnotationService getAnnotationService(){
417
	    return configuration.getAnnotationService();
418
	}
419

  
420
	@Override
421
	public final INameService getNameService(){
422
	    return configuration.getNameService();
423
	}
424

  
425

  
426
	@Override
427
	public final ITaxonService getTaxonService(){
428
		return configuration.getTaxonService();
429
	}
430

  
431

  
432
	@Override
433
	public final IClassificationService getClassificationService(){
434
		return configuration.getClassificationService();
435
	}
436

  
437

  
438
	@Override
439
	public final ITaxonNodeService getTaxonNodeService(){
440
	    return configuration.getTaxonNodeService();
441
	}
442

  
443

  
444
	@Override
445
	public final IReferenceService getReferenceService(){
446
		return configuration.getReferenceService();
447
	}
448

  
449

  
450
	@Override
451
	public final IAgentService getAgentService(){
452
		return configuration.getAgentService();
453
	}
454

  
455

  
456
	@Override
457
	public final IDatabaseService getDatabaseService(){
458
		return configuration.getDatabaseService();
459
	}
460

  
461

  
462
	@Override
463
	public final ITermService getTermService(){
464
		return configuration.getTermService();
465
	}
466

  
467

  
468
	@Override
469
	public final IDescriptionService getDescriptionService(){
470
		return configuration.getDescriptionService();
471
	}
472

  
473

  
474
	@Override
475
	public final IOccurrenceService getOccurrenceService(){
476
		return configuration.getOccurrenceService();
477
	}
478

  
479
	@Override
480
	public IAmplificationService getAmplificationService(){
481
		return configuration.getAmplificationService();
482
	}
483

  
484
	@Override
485
	public ISequenceService getSequenceService(){
486
		return configuration.getSequenceService();
487
	}
488

  
489

  
490
	@Override
491
	public final IPrimerService getPrimerService(){
492
		return configuration.getPrimerService();
493
	}
494

  
495

  
496
	@Override
497
	public final IMediaService getMediaService(){
498
		return configuration.getMediaService();
499
	}
500

  
501

  
502
	@Override
503
	public final ICommonService getCommonService(){
504
		return configuration.getCommonService();
505
	}
506

  
507

  
508
	@Override
509
	public final ILocationService getLocationService(){
510
		return configuration.getLocationService();
511
	}
512

  
513

  
514
	@Override
515
	public final IUserService getUserService(){
516
		return configuration.getUserService();
517
	}
518

  
519

  
520
	@Override
521
	public final IGrantedAuthorityService getGrantedAuthorityService(){
522
		return configuration.getGrantedAuthorityService();
523
	}
524

  
525

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

  
531

  
532
	@Override
533
	public final ICollectionService getCollectionService(){
534
		return configuration.getCollectionService();
535
	}
536

  
537

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

  
543

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

  
549

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

  
555

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

  
561

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

  
567

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

  
573

  
574
	@Override
575
	public IEntityValidationService getEntityValidationService(){
576
		return configuration.getEntityValidationService();
577
	}
578

  
579

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

  
585

  
586
	@Override
587
	public final IService<CdmBase> getMainService(){
588
		return configuration.getMainService();
589
	}
590

  
591

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

  
597

  
598
	@Override
599
	public final ConversationHolder NewConversation(){
600
		//return (ConversationHolder)applicationContext.getBean("conversationHolder");
601
		return configuration.NewConversation();
602
	}
603

  
604

  
605
	/* **** Security ***** */
606

  
607
	@Override
608
	public void authenticate(String username, String password){
609
		UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
610
		Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
611
		SecurityContext context = SecurityContextHolder.getContext();
612
		context.setAuthentication(authentication);
613
	}
614

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

  
620

  
621
	@Override
622
	public ICdmPermissionEvaluator getPermissionEvaluator(){
623
		return configuration.getPermissionEvaluator();
624
	}
625

  
626

  
627
	/**
628
	 * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication,
629
	 *      java.lang.Object, java.lang.Object)
630
	 *
631
	 * @param targetDomainObject
632
	 * @param permission
633
	 * @return
634
	 */
635
	public boolean currentAuthentiationHasPermissions(CdmBase targetDomainObject, EnumSet<CRUD> permission){
636
		SecurityContext context = SecurityContextHolder.getContext();
637
		return getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject, permission);
638
	}
639

  
640

  
641
	@Override
642
	public final PlatformTransactionManager getTransactionManager(){
643
		return configuration.getTransactionManager();
644
	}
645

  
646

  
647
	@Override
648
	public final Object getBean(String name){
649
		return this.applicationContext.getBean(name);
650
	}
651

  
652

  
653
	/*
654
	 * OLD TRANSACTION STUFF
655
	 */
656

  
657
	/* **** flush ********** */
658
	public void flush(){
659
		SessionFactory sf = (SessionFactory) applicationContext.getBean("sessionFactory");
660
		sf.getCurrentSession().flush();
661
	}
662

  
663

  
664
	public SessionFactory getSessionFactory(){
665
		return (SessionFactory) applicationContext.getBean("sessionFactory");
666
	}
667

  
668

  
669
	@Override
670
	public TransactionStatus startTransaction(){
671
		return startTransaction(false);
672
	}
673

  
674

  
675
	@Override
676
	public TransactionStatus startTransaction(Boolean readOnly){
677
		return configuration.startTransaction(readOnly);
678
	}
679

  
680
	@Override
681
	public void commitTransaction(TransactionStatus txStatus){
682
		PlatformTransactionManager txManager = configuration.getTransactionManager();
683
		txManager.commit(txStatus);
684
		return;
685
	}
686
}

Also available in: Unified diff