Project

General

Profile

Download (17.3 KB) Statistics
| Branch: | Tag: | Revision:
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

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

    
14
import java.util.List;
15
import java.util.UUID;
16

    
17
import org.apache.log4j.Logger;
18
import org.hibernate.SessionFactory;
19
import org.springframework.beans.factory.config.BeanDefinition;
20
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
21
import org.springframework.context.support.AbstractApplicationContext;
22
import org.springframework.context.support.GenericApplicationContext;
23
import org.springframework.core.io.ClassPathResource;
24
import org.springframework.core.io.Resource;
25
import org.springframework.security.authentication.ProviderManager;
26
import org.springframework.transaction.PlatformTransactionManager;
27
import org.springframework.transaction.TransactionDefinition;
28
import org.springframework.transaction.TransactionStatus;
29
import org.springframework.transaction.support.DefaultTransactionDefinition;
30

    
31
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
32
import eu.etaxonomy.cdm.api.service.IAgentService;
33
import eu.etaxonomy.cdm.api.service.ICollectionService;
34
import eu.etaxonomy.cdm.api.service.ICommonService;
35
import eu.etaxonomy.cdm.api.service.IDatabaseService;
36
import eu.etaxonomy.cdm.api.service.IDescriptionService;
37
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
38
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
39
import eu.etaxonomy.cdm.api.service.IGroupService;
40
import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
41
import eu.etaxonomy.cdm.api.service.ILocationService;
42
import eu.etaxonomy.cdm.api.service.IMediaService;
43
import eu.etaxonomy.cdm.api.service.INameService;
44
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
45
import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
46
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
47
import eu.etaxonomy.cdm.api.service.IReferenceService;
48
import eu.etaxonomy.cdm.api.service.IService;
49
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
50
import eu.etaxonomy.cdm.api.service.ITaxonService;
51
import eu.etaxonomy.cdm.api.service.IClassificationService;
52
import eu.etaxonomy.cdm.api.service.ITermService;
53
import eu.etaxonomy.cdm.api.service.IUserService;
54
import eu.etaxonomy.cdm.api.service.IVocabularyService;
55
import eu.etaxonomy.cdm.api.service.IWorkingSetService;
56
import eu.etaxonomy.cdm.common.IProgressMonitor;
57
import eu.etaxonomy.cdm.common.NullProgressMonitor;
58
import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
59
import eu.etaxonomy.cdm.database.DbSchemaValidation;
60
import eu.etaxonomy.cdm.database.ICdmDataSource;
61
import eu.etaxonomy.cdm.model.common.CdmBase;
62
import eu.etaxonomy.cdm.model.common.CdmMetaData;
63
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
64
import eu.etaxonomy.cdm.model.common.User;
65

    
66

    
67
/**
68
 * @author a.mueller
69
 *
70
 */
71
public class CdmApplicationController implements ICdmApplicationLocalConfiguration{
72
	private static final Logger logger = Logger.getLogger(CdmApplicationController.class);
73
	
74
	public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE = "/eu/etaxonomy/cdm/defaultApplicationContext.xml";
75
	
76
	public AbstractApplicationContext applicationContext;
77
	private ICdmApplicationLocalConfiguration configuration; 
78
	private Resource applicationContextResource;
79

    
80
	private IProgressMonitor progressMonitor;
81
	
82
	final static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;
83
	
84
	
85
	
86
	/**
87
	 * Constructor, opens a spring ApplicationContext by using the default data source
88
	 */
89
	public static CdmApplicationController NewInstance() {
90
		logger.info("Start CdmApplicationController with default data source");
91
		CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();
92
		DbSchemaValidation dbSchemaValidation = defaultDbSchemaValidation;
93
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
94
	}
95
	
96
	/**
97
	 * Constructor, opens a spring ApplicationContext by using the default data source
98
	 * @param dbSchemaValidation validation type for database schema
99
	 */
100
	public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation) {
101
		logger.info("Start CdmApplicationController with default data source");
102
		CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();
103
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
104
	}
105

    
106
	
107
	/**
108
	 * Constructor, opens an spring ApplicationContext by using the according data source and the
109
	 * default database schema validation type
110
	 * @param dataSource
111
	 */
112
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource) {
113
		return CdmApplicationController.NewInstance(null, dataSource, defaultDbSchemaValidation, false);
114
	}
115
	
116
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation) {
117
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
118
	}
119

    
120
	public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading) {
121
		return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, omitTermLoading);
122
	}
123
	
124
	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading) {
125
		return CdmApplicationController.NewInstance(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, null);
126
	}
127
	
128
	public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor) {
129
		return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor);
130
	}
131

    
132
	/**
133
	 * Constructor, opens an spring 2.5 ApplicationContext by using the according data source
134
	 * @param dataSource
135
	 * @param dbSchemaValidation
136
	 * @param omitTermLoading
137
	 */
138
	private CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){
139
		logger.info("Start CdmApplicationController with datasource: " + dataSource.getName());
140
		
141
		if (dbSchemaValidation == null){
142
			dbSchemaValidation = defaultDbSchemaValidation;
143
		}
144
		
145
		this.applicationContextResource = applicationContextResource != null ? applicationContextResource : new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);
146
		this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();
147
		
148
		setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading);
149
	}
150
		
151
	
152
	/**
153
	 * Sets the application context to a new spring ApplicationContext by using the according data source and initializes the Controller.
154
	 * @param dataSource
155
	 */
156
	private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
157
		if (dbSchemaValidation == null){
158
			dbSchemaValidation = defaultDbSchemaValidation;
159
		}
160
		logger.info("Connecting to '" + dataSource.getName() + "'");
161
		progressMonitor.beginTask("Connecting to '" + dataSource.getName() + "'", 6);
162
		progressMonitor.worked(1);
163

    
164
		GenericApplicationContext applicationContext =  new GenericApplicationContext();
165
		
166
		BeanDefinition datasourceBean = dataSource.getDatasourceBean();
167
		datasourceBean.setAttribute("isLazy", false);
168
		progressMonitor.subTask("Registering datasource.");
169
		applicationContext.registerBeanDefinition("dataSource", datasourceBean);
170
		progressMonitor.worked(1);
171
		
172
		BeanDefinition hibernatePropBean= dataSource.getHibernatePropertiesBean(dbSchemaValidation);
173
		applicationContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);
174
		
175
		XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);
176
		progressMonitor.subTask("Registering resources.");
177
		xmlReader.loadBeanDefinitions(applicationContextResource);
178
		progressMonitor.worked(1);
179
		
180
		//omitTerms
181
		/*String initializerName = "persistentTermInitializer";
182
		BeanDefinition beanDef = applicationContext.getBeanDefinition(initializerName);
183
		MutablePropertyValues values = beanDef.getPropertyValues();
184
		values.addPropertyValue("omit", omitTermLoading);*/
185
		
186
		progressMonitor.subTask("This might take a while ...");
187
		applicationContext.refresh();
188
		applicationContext.start();
189
		progressMonitor.worked(1);
190
		
191
		progressMonitor.subTask("Cleaning up.");
192
		setApplicationContext(applicationContext);
193
		progressMonitor.worked(1);
194
		
195
		//initialize user and metaData for new databases
196
		int userCount = getUserService().count(User.class);
197
		if (userCount == 0 ){
198
			progressMonitor.subTask("Creating Admin User");
199
			createAdminUser();
200
			progressMonitor.worked(1);
201
		}
202
		int metaDataCount = getCommonService().getCdmMetaData().size();
203
		if (metaDataCount == 0){
204
			progressMonitor.subTask("Creating Meta Data");
205
			createMetadata();
206
			progressMonitor.worked(1);
207
		}
208
		progressMonitor.done();
209
		return true;
210
	}
211

    
212
	private void createAdminUser(){
213
		User firstUser = User.NewInstance("admin", "0000");
214
		getUserService().save(firstUser);
215
		logger.info("Admin user created.");
216
	}
217
	
218
	private void createMetadata(){
219
		List<CdmMetaData> metaData = CdmMetaData.defaultMetaData();
220
		getCommonService().saveAllMetaData(metaData);
221
		logger.info("Metadata created.");
222
	}
223
	
224
	
225
	/**
226
	 * Tests if some DefinedTermsAreMissing.
227
	 * @return true, if at least one is missing, else false
228
	 */
229
	public boolean testDefinedTermsAreMissing(){
230
		UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
231
		DefinedTermBase<?> english = this.getTermService().getByUri(englishUuid.toString());
232
		if ( english == null || ! english.getUuid().equals(englishUuid)){
233
			return true;
234
		}else{
235
			return false;
236
		}
237
	}
238
	
239

    
240
	/**
241
	 * Changes the ApplicationContext to the new dataSource
242
	 * @param dataSource
243
	 */
244
	public boolean changeDataSource(ICdmDataSource dataSource){
245
		//logger.info("Change datasource to : " + dataSource);
246
		return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false);
247
	}
248
	
249
	/**
250
	 * Changes the ApplicationContext to the new dataSource
251
	 * @param dataSource
252
	 * @param dbSchemaValidation
253
	 */
254
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
255
		//logger.info("Change datasource to : " + dataSource);
256
		return setNewDataSource(dataSource, dbSchemaValidation, false);
257
	}
258
	
259
	/**
260
	 * Changes the ApplicationContext to the new dataSource
261
	 * @param dataSource
262
	 * @param dbSchemaValidation
263
	 * @param omitTermLoading
264
	 */
265
	public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
266
		logger.info("Change datasource to : " + dataSource);
267
		return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading);
268
	}
269
	
270
	/**
271
	 * Sets a new application Context.
272
	 * @param ac
273
	 */
274
	public void setApplicationContext(AbstractApplicationContext ac){
275
		closeApplicationContext(); //closes old application context if necessary
276
		applicationContext = ac;
277
		applicationContext.registerShutdownHook();
278
		init();
279
	}
280
	
281
	/* (non-Javadoc)
282
	 * @see java.lang.Object#finalize()
283
	 */
284
	public void finalize(){
285
		close();
286
	}
287
	
288
	/**
289
	 * closes the application
290
	 */
291
	public void close(){
292
		closeApplicationContext();
293
	}
294
	
295
	/**
296
	 * closes the application context
297
	 */
298
	private void closeApplicationContext(){
299
		if (applicationContext != null){
300
			logger.info("Close ApplicationContext");
301
			applicationContext.close();
302
		}
303
	}
304
	
305
	private void init(){
306
		logger.debug("Init " +  this.getClass().getName() + " ... ");
307
		if (logger.isDebugEnabled()){for (String beanName : applicationContext.getBeanDefinitionNames()){ logger.debug(beanName);}}
308
		//TODO delete next row (was just for testing)
309
		if (logger.isInfoEnabled()){
310
			logger.info("Registered Beans: ");
311
			String[] beanNames = applicationContext.getBeanDefinitionNames();
312
			for (String beanName : beanNames){
313
				logger.info(beanName);
314
			}
315
		}
316
		configuration = (ICdmApplicationLocalConfiguration)applicationContext.getBean("cdmApplicationDefaultConfiguration");
317
//		getDatabaseService().setApplicationController(this);
318
	}
319
	
320

    
321
	
322
	/* ******  Services *********/
323
	public final INameService getNameService(){
324
		return configuration.getNameService();
325
	}
326

    
327
	public final ITaxonService getTaxonService(){
328
		return configuration.getTaxonService();
329
	}
330
	
331
	public final IClassificationService getClassificationService(){
332
		return configuration.getClassificationService();
333
	}
334
	
335
	public final ITaxonNodeService getTaxonNodeService(){
336
		return configuration.getTaxonNodeService();
337
	}
338

    
339
	public final IReferenceService getReferenceService(){
340
		return configuration.getReferenceService();
341
	}
342
	
343
	public final IAgentService getAgentService(){
344
		return configuration.getAgentService();
345
	}
346
	
347
	public final IDatabaseService getDatabaseService(){
348
		return configuration.getDatabaseService();
349
	}
350
	
351
	public final ITermService getTermService(){
352
		return configuration.getTermService();
353
	}
354

    
355
	public final IDescriptionService getDescriptionService(){
356
		return configuration.getDescriptionService();
357
	}
358
	
359
	public final IOccurrenceService getOccurrenceService(){
360
		return configuration.getOccurrenceService();
361
	}
362

    
363
	public final IMediaService getMediaService(){
364
		return configuration.getMediaService();
365
	}
366

    
367
	public final ICommonService getCommonService(){
368
		return configuration.getCommonService();
369
	}
370
	
371
	public final ILocationService getLocationService(){
372
		return configuration.getLocationService();
373
	}
374
	
375
	public final IUserService getUserService(){
376
		return configuration.getUserService();
377
	}
378

    
379
	public IGroupService getGroupService() {
380
		return configuration.getGroupService();
381
	}
382
	
383
	public final ICollectionService getCollectionService(){
384
		return configuration.getCollectionService();
385
	}
386
	
387
	public final IFeatureTreeService getFeatureTreeService(){
388
		return configuration.getFeatureTreeService();
389
	}
390
	
391
	public final IFeatureNodeService getFeatureNodeService(){
392
		return configuration.getFeatureNodeService();
393
	}
394
	
395
	public final IVocabularyService getVocabularyService(){
396
		return configuration.getVocabularyService();
397
	}
398
	
399
	public final IIdentificationKeyService getIdentificationKeyService(){
400
		return configuration.getIdentificationKeyService();
401
	}
402

    
403
	public final IPolytomousKeyService getPolytomousKeyService(){
404
		return configuration.getPolytomousKeyService();
405
	}
406

    
407
	public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){
408
		return configuration.getPolytomousKeyNodeService();
409
	}
410
	
411
	public final IService<CdmBase> getMainService(){
412
		return configuration.getMainService();
413
	}
414
	
415
	public final IWorkingSetService getWorkingSetService(){
416
		return configuration.getWorkingSetService();
417
	}
418
	
419
	public final ConversationHolder NewConversation(){
420
		//return (ConversationHolder)applicationContext.getBean("conversationHolder");
421
		return configuration.NewConversation();
422
	}
423
	
424
	
425
	public final ProviderManager getAuthenticationManager(){
426
		return configuration.getAuthenticationManager();
427
	}
428
	
429
	@Override
430
	public final PlatformTransactionManager getTransactionManager() {
431
		return configuration.getTransactionManager();
432
	}
433
	
434
	public final Object getBean(String name){
435
		return this.applicationContext.getBean(name);
436
	}
437
	
438
	/*
439
	 * OLD TRANSACTION STUFF 
440
	 */
441
	
442
	/* **** flush ***********/
443
	public void flush() {
444
		SessionFactory sf = (SessionFactory)applicationContext.getBean("sessionFactory");
445
		sf.getCurrentSession().flush();
446
	}
447
	
448
	public SessionFactory getSessionFactory(){
449
		return (SessionFactory)applicationContext.getBean("sessionFactory");
450
	}
451
	
452
	public TransactionStatus startTransaction() {
453
		
454
		return startTransaction(false);
455
	}
456
	
457
	public TransactionStatus startTransaction(Boolean readOnly) {
458
		
459
		PlatformTransactionManager txManager = configuration.getTransactionManager();
460
		
461
		DefaultTransactionDefinition defaultTxDef = new DefaultTransactionDefinition();
462
		defaultTxDef.setReadOnly(readOnly);
463
		TransactionDefinition txDef = defaultTxDef;
464

    
465
		// Log some transaction-related debug information.
466
		if (logger.isDebugEnabled()) {
467
			logger.debug("Transaction name = " + txDef.getName());
468
			logger.debug("Transaction facets:");
469
			logger.debug("Propagation behavior = " + txDef.getPropagationBehavior());
470
			logger.debug("Isolation level = " + txDef.getIsolationLevel());
471
			logger.debug("Timeout = " + txDef.getTimeout());
472
			logger.debug("Read Only = " + txDef.isReadOnly());
473
			// org.springframework.orm.hibernate3.HibernateTransactionManager
474
			// provides more transaction/session-related debug information.
475
		}
476
		
477
		TransactionStatus txStatus = txManager.getTransaction(txDef);
478
		return txStatus;
479
	}
480

    
481
	public void commitTransaction(TransactionStatus txStatus){
482
		PlatformTransactionManager txManager = configuration.getTransactionManager();
483
		txManager.commit(txStatus);
484
		return;
485
	}
486

    
487

    
488

    
489
}
(1-1/7)