Project

General

Profile

Download (16.2 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.TransactionStatus;
28

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

    
64

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

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

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

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

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

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

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

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

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

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

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

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

    
361
	public final IMediaService getMediaService(){
362
		return configuration.getMediaService();
363
	}
364

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

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

    
401
	public final IPolytomousKeyService getPolytomousKeyService(){
402
		return configuration.getPolytomousKeyService();
403
	}
404

    
405
	public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){
406
		return configuration.getPolytomousKeyNodeService();
407
	}
408
	
409
	public final IService<CdmBase> getMainService(){
410
		return configuration.getMainService();
411
	}
412
	
413
	public final IWorkingSetService getWorkingSetService(){
414
		return configuration.getWorkingSetService();
415
	}
416
	
417
	public final ConversationHolder NewConversation(){
418
		//return (ConversationHolder)applicationContext.getBean("conversationHolder");
419
		return configuration.NewConversation();
420
	}
421
	
422
	
423
	public final ProviderManager getAuthenticationManager(){
424
		return configuration.getAuthenticationManager();
425
	}
426
	
427

    
428
	@Override
429
	public final PlatformTransactionManager getTransactionManager() {
430
		return configuration.getTransactionManager();
431
	}
432
	
433
	public final Object getBean(String name){
434
		return this.applicationContext.getBean(name);
435
	}
436
	
437
	/*
438
	 * OLD TRANSACTION STUFF 
439
	 */
440
	
441
	/* **** flush ***********/
442
	public void flush() {
443
		SessionFactory sf = (SessionFactory)applicationContext.getBean("sessionFactory");
444
		sf.getCurrentSession().flush();
445
	}
446
	
447
	public SessionFactory getSessionFactory(){
448
		return (SessionFactory)applicationContext.getBean("sessionFactory");
449
	}
450
	
451
	public TransactionStatus startTransaction() {
452
		return startTransaction(false);
453
	}
454
	
455
	public TransactionStatus startTransaction(Boolean readOnly) {
456
		return configuration.startTransaction(readOnly);
457
	}
458

    
459
	public void commitTransaction(TransactionStatus txStatus){
460
		PlatformTransactionManager txManager = configuration.getTransactionManager();
461
		txManager.commit(txStatus);
462
		return;
463
	}
464

    
465

    
466

    
467
}
(1-1/3)