3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
12 package eu
.etaxonomy
.cdm
.api
.application
;
14 import java
.util
.List
;
15 import java
.util
.UUID
;
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
.ApplicationListener
;
22 import org
.springframework
.context
.support
.AbstractApplicationContext
;
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
;
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
.monitor
.IProgressMonitor
;
55 import eu
.etaxonomy
.cdm
.common
.monitor
.NullProgressMonitor
;
56 import eu
.etaxonomy
.cdm
.common
.monitor
.SubProgressMonitor
;
57 import eu
.etaxonomy
.cdm
.database
.CdmPersistentDataSource
;
58 import eu
.etaxonomy
.cdm
.database
.DbSchemaValidation
;
59 import eu
.etaxonomy
.cdm
.database
.ICdmDataSource
;
60 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
61 import eu
.etaxonomy
.cdm
.model
.common
.CdmMetaData
;
62 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
63 import eu
.etaxonomy
.cdm
.model
.common
.User
;
70 public class CdmApplicationController
implements ICdmApplicationConfiguration
{
71 private static final Logger logger
= Logger
.getLogger(CdmApplicationController
.class);
73 public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE
= "/eu/etaxonomy/cdm/defaultApplicationContext.xml";
75 public AbstractApplicationContext applicationContext
;
76 private ICdmApplicationConfiguration configuration
;
77 private Resource applicationContextResource
;
79 private IProgressMonitor progressMonitor
;
81 final static DbSchemaValidation defaultDbSchemaValidation
= DbSchemaValidation
.VALIDATE
;
86 * Constructor, opens a spring ApplicationContext by using the default data source
88 public static CdmApplicationController
NewInstance() {
89 logger
.info("Start CdmApplicationController with default data source");
90 CdmPersistentDataSource dataSource
= getDefaultDatasource();
91 DbSchemaValidation dbSchemaValidation
= defaultDbSchemaValidation
;
92 return CdmApplicationController
.NewInstance(null, dataSource
, dbSchemaValidation
, false);
96 * Constructor, opens a spring ApplicationContext by using the default data source
97 * @param dbSchemaValidation validation type for database schema
99 public static CdmApplicationController
NewInstance(DbSchemaValidation dbSchemaValidation
) {
100 logger
.info("Start CdmApplicationController with default data source");
101 CdmPersistentDataSource dataSource
= getDefaultDatasource();
102 return CdmApplicationController
.NewInstance(null, dataSource
, dbSchemaValidation
, false);
107 * Constructor, opens an spring ApplicationContext by using the according data source and the
108 * default database schema validation type
111 public static CdmApplicationController
NewInstance(ICdmDataSource dataSource
) {
112 return CdmApplicationController
.NewInstance(null, dataSource
, defaultDbSchemaValidation
, false);
115 public static CdmApplicationController
NewInstance(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
) {
116 return CdmApplicationController
.NewInstance(null, dataSource
, dbSchemaValidation
, false);
119 public static CdmApplicationController
NewInstance(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
) {
120 return CdmApplicationController
.NewInstance(null, dataSource
, dbSchemaValidation
, omitTermLoading
);
123 public static CdmApplicationController
NewInstance(Resource applicationContextResource
, ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
) {
124 return CdmApplicationController
.NewInstance(applicationContextResource
, dataSource
, dbSchemaValidation
, omitTermLoading
, null);
127 public static CdmApplicationController
NewInstance(Resource applicationContextResource
, ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
, IProgressMonitor progressMonitor
) {
128 return new CdmApplicationController(applicationContextResource
, dataSource
, dbSchemaValidation
, omitTermLoading
, progressMonitor
, null);
131 //TODO discuss need for listeners before commit to trunk
132 // public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners) {
133 // return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor,listeners);
140 protected static ClassPathResource
getClasspathResource() {
141 return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE
);
147 protected static CdmPersistentDataSource
getDefaultDatasource() {
148 CdmPersistentDataSource dataSource
= CdmPersistentDataSource
.NewDefaultInstance();
154 * Constructor, opens an spring 2.5 ApplicationContext by using the according data source
156 * @param dbSchemaValidation
157 * @param omitTermLoading
159 protected CdmApplicationController(Resource applicationContextResource
, ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
, IProgressMonitor progressMonitor
, List
<ApplicationListener
> listeners
){
160 logger
.info("Start CdmApplicationController with datasource: " + dataSource
.getName());
162 if (dbSchemaValidation
== null){
163 dbSchemaValidation
= defaultDbSchemaValidation
;
165 this.applicationContextResource
= applicationContextResource
!= null ? applicationContextResource
: getClasspathResource();
166 this.progressMonitor
= progressMonitor
!= null ? progressMonitor
: new NullProgressMonitor();
168 setNewDataSource(dataSource
, dbSchemaValidation
, omitTermLoading
, listeners
);
173 * Sets the application context to a new spring ApplicationContext by using the according data source and initializes the Controller.
176 private boolean setNewDataSource(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
, List
<ApplicationListener
> listeners
){
178 if (dbSchemaValidation
== null){
179 dbSchemaValidation
= defaultDbSchemaValidation
;
181 logger
.info("Connecting to '" + dataSource
.getName() + "'");
183 MonitoredGenericApplicationContext applicationContext
= new MonitoredGenericApplicationContext();
184 int refreshTasks
= 45;
185 int nTasks
= 5 + refreshTasks
;
186 // nTasks += applicationContext.countTasks();
187 progressMonitor
.beginTask("Connecting to '" + dataSource
.getName() + "'", nTasks
);
189 // progressMonitor.worked(1);
191 BeanDefinition datasourceBean
= dataSource
.getDatasourceBean();
192 datasourceBean
.setAttribute("isLazy", false);
193 progressMonitor
.subTask("Registering datasource.");
194 applicationContext
.registerBeanDefinition("dataSource", datasourceBean
);
195 progressMonitor
.worked(1);
197 BeanDefinition hibernatePropBean
= dataSource
.getHibernatePropertiesBean(dbSchemaValidation
);
198 applicationContext
.registerBeanDefinition("hibernateProperties", hibernatePropBean
);
200 XmlBeanDefinitionReader xmlReader
= new XmlBeanDefinitionReader(applicationContext
);
201 progressMonitor
.subTask("Registering resources.");
202 xmlReader
.loadBeanDefinitions(applicationContextResource
);
203 progressMonitor
.worked(1);
206 /*String initializerName = "persistentTermInitializer";
207 BeanDefinition beanDef = applicationContext.getBeanDefinition(initializerName);
208 MutablePropertyValues values = beanDef.getPropertyValues();
209 values.addPropertyValue("omit", omitTermLoading);*/
211 if (listeners
!= null){
212 for(ApplicationListener listener
: listeners
){
213 applicationContext
.addApplicationListener(listener
);
217 // String message = "Start application context. This might take a while ...";
218 //// progressMonitor.subTask(message);
219 // SubProgressMonitor subMonitor= new SubProgressMonitor(progressMonitor, 10);
220 // subMonitor.beginTask(message, 2);
221 // applicationContext.setProgressMonitor(subMonitor);
223 applicationContext
.refresh(new SubProgressMonitor(progressMonitor
, refreshTasks
));
224 applicationContext
.start();
225 // progressMonitor.worked(1);
227 progressMonitor
.subTask("Cleaning up.");
228 setApplicationContext(applicationContext
);
229 progressMonitor
.worked(1);
231 //initialize user and metaData for new databases
232 int userCount
= getUserService().count(User
.class);
233 if (userCount
== 0 ){
234 progressMonitor
.subTask("Creating Admin User");
237 progressMonitor
.worked(1);
240 int metaDataCount
= getCommonService().getCdmMetaData().size();
241 if (metaDataCount
== 0){
242 progressMonitor
.subTask("Creating Meta Data");
245 progressMonitor
.worked(1);
247 progressMonitor
.done();
251 protected void createAdminUser(){
252 User firstUser
= User
.NewInstance("admin", "00000");
253 getUserService().save(firstUser
);
254 logger
.info("Admin user created.");
257 protected void createMetadata(){
258 List
<CdmMetaData
> metaData
= CdmMetaData
.defaultMetaData();
259 getCommonService().saveAllMetaData(metaData
);
260 logger
.info("Metadata created.");
265 * Tests if some DefinedTermsAreMissing.
266 * @return true, if at least one is missing, else false
268 public boolean testDefinedTermsAreMissing(){
269 UUID englishUuid
= UUID
.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
270 DefinedTermBase
<?
> english
= this.getTermService().load(englishUuid
);
271 if ( english
== null || ! english
.getUuid().equals(englishUuid
)){
280 * Changes the ApplicationContext to the new dataSource
283 public boolean changeDataSource(ICdmDataSource dataSource
){
284 //logger.info("Change datasource to : " + dataSource);
285 return setNewDataSource(dataSource
, DbSchemaValidation
.VALIDATE
, false, null);
289 * Changes the ApplicationContext to the new dataSource
291 * @param dbSchemaValidation
293 public boolean changeDataSource(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
){
294 //logger.info("Change datasource to : " + dataSource);
295 return setNewDataSource(dataSource
, dbSchemaValidation
, false, null);
299 * Changes the ApplicationContext to the new dataSource
301 * @param dbSchemaValidation
302 * @param omitTermLoading
304 public boolean changeDataSource(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
){
305 logger
.info("Change datasource to : " + dataSource
);
306 return setNewDataSource(dataSource
, dbSchemaValidation
, omitTermLoading
, null);
310 * Changes the ApplicationContext to the new dataSource
312 * @param dbSchemaValidation
313 * @param omitTermLoading
315 public boolean changeDataSource(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
, List
<ApplicationListener
> listeners
){
316 logger
.info("Change datasource to : " + dataSource
);
317 return setNewDataSource(dataSource
, dbSchemaValidation
, omitTermLoading
, listeners
);
321 * Sets a new application Context.
324 public void setApplicationContext(AbstractApplicationContext ac
){
325 closeApplicationContext(); //closes old application context if necessary
326 applicationContext
= ac
;
327 applicationContext
.registerShutdownHook();
332 * @see java.lang.Object#finalize()
334 public void finalize(){
339 * closes the application
342 closeApplicationContext();
346 * closes the application context
348 protected void closeApplicationContext(){
349 if (applicationContext
!= null){
350 logger
.info("Close ApplicationContext");
351 applicationContext
.close();
355 protected void init(){
356 logger
.debug("Init " + this.getClass().getName() + " ... ");
357 if (logger
.isDebugEnabled()){for (String beanName
: applicationContext
.getBeanDefinitionNames()){ logger
.debug(beanName
);}}
358 //TODO delete next row (was just for testing)
359 if (logger
.isInfoEnabled()){
360 logger
.info("Registered Beans: ");
361 String
[] beanNames
= applicationContext
.getBeanDefinitionNames();
362 for (String beanName
: beanNames
){
363 logger
.info(beanName
);
366 configuration
= (ICdmApplicationConfiguration
)applicationContext
.getBean("cdmApplicationDefaultConfiguration");
367 getDatabaseService().setApplicationController(this);
372 /* ****** Services *********/
373 public final INameService
getNameService(){
374 return configuration
.getNameService();
377 public final ITaxonService
getTaxonService(){
378 return configuration
.getTaxonService();
381 public final IClassificationService
getClassificationService(){
382 return configuration
.getClassificationService();
385 public final ITaxonNodeService
getTaxonNodeService(){
386 return configuration
.getTaxonNodeService();
389 public final IReferenceService
getReferenceService(){
390 return configuration
.getReferenceService();
393 public final IAgentService
getAgentService(){
394 return configuration
.getAgentService();
397 public final IDatabaseService
getDatabaseService(){
398 return configuration
.getDatabaseService();
401 public final ITermService
getTermService(){
402 return configuration
.getTermService();
405 public final IDescriptionService
getDescriptionService(){
406 return configuration
.getDescriptionService();
409 public final IOccurrenceService
getOccurrenceService(){
410 return configuration
.getOccurrenceService();
413 public final IMediaService
getMediaService(){
414 return configuration
.getMediaService();
417 public final ICommonService
getCommonService(){
418 return configuration
.getCommonService();
421 public final ILocationService
getLocationService(){
422 return configuration
.getLocationService();
425 public final IUserService
getUserService(){
426 return configuration
.getUserService();
429 public IGroupService
getGroupService() {
430 return configuration
.getGroupService();
433 public final ICollectionService
getCollectionService(){
434 return configuration
.getCollectionService();
437 public final IFeatureTreeService
getFeatureTreeService(){
438 return configuration
.getFeatureTreeService();
441 public final IFeatureNodeService
getFeatureNodeService(){
442 return configuration
.getFeatureNodeService();
445 public final IVocabularyService
getVocabularyService(){
446 return configuration
.getVocabularyService();
449 public final IIdentificationKeyService
getIdentificationKeyService(){
450 return configuration
.getIdentificationKeyService();
453 public final IPolytomousKeyService
getPolytomousKeyService(){
454 return configuration
.getPolytomousKeyService();
457 public final IPolytomousKeyNodeService
getPolytomousKeyNodeService(){
458 return configuration
.getPolytomousKeyNodeService();
461 public final IService
<CdmBase
> getMainService(){
462 return configuration
.getMainService();
465 public final IWorkingSetService
getWorkingSetService(){
466 return configuration
.getWorkingSetService();
469 public final ConversationHolder
NewConversation(){
470 //return (ConversationHolder)applicationContext.getBean("conversationHolder");
471 return configuration
.NewConversation();
475 public final ProviderManager
getAuthenticationManager(){
476 return configuration
.getAuthenticationManager();
481 public final PlatformTransactionManager
getTransactionManager() {
482 return configuration
.getTransactionManager();
485 public final Object
getBean(String name
){
486 return this.applicationContext
.getBean(name
);
490 * OLD TRANSACTION STUFF
493 /* **** flush ***********/
494 public void flush() {
495 SessionFactory sf
= (SessionFactory
)applicationContext
.getBean("sessionFactory");
496 sf
.getCurrentSession().flush();
499 public SessionFactory
getSessionFactory(){
500 return (SessionFactory
)applicationContext
.getBean("sessionFactory");
503 public TransactionStatus
startTransaction() {
504 return startTransaction(false);
507 public TransactionStatus
startTransaction(Boolean readOnly
) {
508 return configuration
.startTransaction(readOnly
);
511 public void commitTransaction(TransactionStatus txStatus
){
512 PlatformTransactionManager txManager
= configuration
.getTransactionManager();
513 txManager
.commit(txStatus
);