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
.ArrayList
;
15 import java
.util
.List
;
16 import java
.util
.UUID
;
18 import org
.apache
.log4j
.Logger
;
19 import org
.hibernate
.SessionFactory
;
20 import org
.springframework
.beans
.MutablePropertyValues
;
21 import org
.springframework
.beans
.factory
.config
.BeanDefinition
;
22 import org
.springframework
.beans
.factory
.xml
.XmlBeanDefinitionReader
;
23 import org
.springframework
.context
.support
.AbstractApplicationContext
;
24 import org
.springframework
.context
.support
.GenericApplicationContext
;
25 import org
.springframework
.core
.io
.ClassPathResource
;
26 import org
.springframework
.core
.io
.Resource
;
27 import org
.springframework
.security
.providers
.ProviderManager
;
28 import org
.springframework
.transaction
.PlatformTransactionManager
;
29 import org
.springframework
.transaction
.TransactionDefinition
;
30 import org
.springframework
.transaction
.TransactionStatus
;
31 import org
.springframework
.transaction
.support
.DefaultTransactionDefinition
;
33 import eu
.etaxonomy
.cdm
.api
.application
.eclipse
.EclipseRcpSaveGenericApplicationContext
;
34 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
35 import eu
.etaxonomy
.cdm
.api
.service
.IAgentService
;
36 import eu
.etaxonomy
.cdm
.api
.service
.ICollectionService
;
37 import eu
.etaxonomy
.cdm
.api
.service
.ICommonService
;
38 import eu
.etaxonomy
.cdm
.api
.service
.IDatabaseService
;
39 import eu
.etaxonomy
.cdm
.api
.service
.IDescriptionService
;
40 import eu
.etaxonomy
.cdm
.api
.service
.IFeatureTreeService
;
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
.IReferenceService
;
46 import eu
.etaxonomy
.cdm
.api
.service
.IService
;
47 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
48 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonTreeService
;
49 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
50 import eu
.etaxonomy
.cdm
.api
.service
.IUserService
;
51 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
52 import eu
.etaxonomy
.cdm
.database
.CdmPersistentDataSource
;
53 import eu
.etaxonomy
.cdm
.database
.DataSourceNotFoundException
;
54 import eu
.etaxonomy
.cdm
.database
.DbSchemaValidation
;
55 import eu
.etaxonomy
.cdm
.database
.ICdmDataSource
;
56 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
57 import eu
.etaxonomy
.cdm
.model
.common
.CdmMetaData
;
58 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
59 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
60 import eu
.etaxonomy
.cdm
.model
.common
.User
;
61 import eu
.etaxonomy
.cdm
.model
.common
.VocabularyEnum
;
62 import eu
.etaxonomy
.cdm
.model
.common
.init
.TermNotFoundException
;
63 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
64 import eu
.etaxonomy
.cdm
.model
.description
.FeatureTree
;
71 public class CdmApplicationController
{
72 private static final Logger logger
= Logger
.getLogger(CdmApplicationController
.class);
74 public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE
= "/eu/etaxonomy/cdm/defaultApplicationContext.xml";
76 public AbstractApplicationContext applicationContext
;
77 private ICdmApplicationConfiguration configuration
;
78 private Resource applicationContextResource
;
80 final static DbSchemaValidation defaultDbSchemaValidation
= DbSchemaValidation
.VALIDATE
;
85 * Constructor, opens an spring 2.5 ApplicationContext by using the default data source
87 public static CdmApplicationController
NewInstance() throws DataSourceNotFoundException
, TermNotFoundException
{
88 logger
.info("Start CdmApplicationController with default data source");
89 CdmPersistentDataSource dataSource
= CdmPersistentDataSource
.NewDefaultInstance();
90 DbSchemaValidation dbSchemaValidation
= defaultDbSchemaValidation
;
91 return new CdmApplicationController(null, dataSource
, dbSchemaValidation
, false);
97 * Constructor, opens an spring 2.5 ApplicationContext by using the default data source
98 * @param dbSchemaValidation validation type for database schema
100 public static CdmApplicationController
NewInstance(DbSchemaValidation dbSchemaValidation
) throws DataSourceNotFoundException
, TermNotFoundException
{
101 logger
.info("Start CdmApplicationController with default data source");
102 CdmPersistentDataSource dataSource
= CdmPersistentDataSource
.NewDefaultInstance();
103 if (dbSchemaValidation
== null){
104 dbSchemaValidation
= defaultDbSchemaValidation
;
106 return new CdmApplicationController(null, dataSource
, dbSchemaValidation
, false);
111 * Constructor, opens an spring 2.5 ApplicationContext by using the according data source and the
112 * default database schema validation type
115 public static CdmApplicationController
NewInstance(ICdmDataSource dataSource
)
116 throws DataSourceNotFoundException
, TermNotFoundException
{
117 return new CdmApplicationController(null, dataSource
, defaultDbSchemaValidation
, false);
120 public static CdmApplicationController
NewInstance(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
)
121 throws DataSourceNotFoundException
, TermNotFoundException
{
122 return new CdmApplicationController(null, dataSource
, dbSchemaValidation
, false);
125 public static CdmApplicationController
NewInstance(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
)
126 throws DataSourceNotFoundException
, TermNotFoundException
{
127 return new CdmApplicationController(null, dataSource
, dbSchemaValidation
, omitTermLoading
);
130 public static CdmApplicationController
NewInstance(Resource applicationContextResource
, ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
)
131 throws DataSourceNotFoundException
, TermNotFoundException
{
132 return new CdmApplicationController(applicationContextResource
, dataSource
, dbSchemaValidation
, omitTermLoading
);
136 * Constructor, opens an spring 2.5 ApplicationContext by using the according data source
138 * @param dbSchemaValidation
139 * @param omitTermLoading
141 private CdmApplicationController(Resource applicationContextResource
, ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
){
142 logger
.info("Start CdmApplicationController with datasource: " + dataSource
.getName());
143 if (applicationContextResource
!= null){
144 this.applicationContextResource
= applicationContextResource
;
146 this.applicationContextResource
= new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE
);
149 setNewDataSource(dataSource
, dbSchemaValidation
, omitTermLoading
);
151 // if (setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading) == false){
152 // throw new DataSourceNotFoundException("Wrong datasource: " + dataSource );
158 * Sets the application context to a new spring ApplicationContext by using the according data source and initializes the Controller.
161 private boolean setNewDataSource(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
){
162 if (dbSchemaValidation
== null){
163 dbSchemaValidation
= defaultDbSchemaValidation
;
165 logger
.info("Connecting to '" + dataSource
.getName() + "'");
168 GenericApplicationContext appContext
;
170 appContext
= new EclipseRcpSaveGenericApplicationContext();
172 BeanDefinition datasourceBean
= dataSource
.getDatasourceBean();
173 datasourceBean
.setAttribute("isLazy", false);
174 appContext
.registerBeanDefinition("dataSource", datasourceBean
);
176 BeanDefinition hibernatePropBean
= dataSource
.getHibernatePropertiesBean(dbSchemaValidation
);
177 appContext
.registerBeanDefinition("hibernateProperties", hibernatePropBean
);
179 XmlBeanDefinitionReader xmlReader
= new XmlBeanDefinitionReader(appContext
);
180 xmlReader
.loadBeanDefinitions(this.applicationContextResource
);
183 String initializerName
= "persistentTermInitializer";
184 BeanDefinition beanDef
= appContext
.getBeanDefinition(initializerName
);
185 MutablePropertyValues values
= beanDef
.getPropertyValues();
186 values
.addPropertyValue("omit", omitTermLoading
);
188 appContext
.refresh();
191 setApplicationContext(appContext
);
193 //initialize user and metaData for new databases
194 int userCount
= getUserService().count(User
.class);
195 if (userCount
== 0 ){
198 int metaDataCount
= getCommonService().getCdmMetaData().size();
199 if (metaDataCount
== 0){
206 private void createAdminUser(){
207 User firstUser
= User
.NewInstance("admin", "0000");
208 getUserService().save(firstUser
);
209 logger
.info("Admin user created.");
212 private void createMetadata(){
213 List
<CdmMetaData
> metaData
= CdmMetaData
.defaultMetaData();
214 getCommonService().saveAllMetaData(metaData
);
215 logger
.info("Metadata created.");
220 * Tests if some DefinedTermsAreMissing.
221 * @return true, if at least one is missing, else false
223 public boolean testDefinedTermsAreMissing(){
224 UUID englishUuid
= UUID
.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
225 DefinedTermBase
<?
> english
= this.getTermService().getByUri(englishUuid
.toString());
226 if ( english
== null || ! english
.getUuid().equals(englishUuid
)){
235 * Changes the ApplicationContext to the new dataSource
238 public boolean changeDataSource(ICdmDataSource dataSource
){
239 //logger.info("Change datasource to : " + dataSource);
240 return setNewDataSource(dataSource
, DbSchemaValidation
.VALIDATE
, false);
244 * Changes the ApplicationContext to the new dataSource
246 * @param dbSchemaValidation
248 public boolean changeDataSource(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
){
249 //logger.info("Change datasource to : " + dataSource);
250 return setNewDataSource(dataSource
, dbSchemaValidation
, false);
254 * Changes the ApplicationContext to the new dataSource
256 * @param dbSchemaValidation
257 * @param omitTermLoading
259 public boolean changeDataSource(ICdmDataSource dataSource
, DbSchemaValidation dbSchemaValidation
, boolean omitTermLoading
){
260 logger
.info("Change datasource to : " + dataSource
);
261 return setNewDataSource(dataSource
, dbSchemaValidation
, omitTermLoading
);
265 * Sets a new application Context.
268 public void setApplicationContext(AbstractApplicationContext ac
){
269 closeApplicationContext(); //closes old application context if necessary
270 applicationContext
= ac
;
271 applicationContext
.registerShutdownHook();
276 * @see java.lang.Object#finalize()
278 public void finalize(){
283 * closes the application
286 closeApplicationContext();
290 * closes the application context
292 private void closeApplicationContext(){
293 if (applicationContext
!= null){
294 logger
.info("Close ApplicationContext");
295 applicationContext
.close();
300 logger
.debug("Init " + this.getClass().getName() + " ... ");
301 if (logger
.isDebugEnabled()){for (String beanName
: applicationContext
.getBeanDefinitionNames()){ logger
.debug(beanName
);}}
302 //TODO delete next row (was just for testing)
303 if (logger
.isInfoEnabled()){
304 logger
.info("Registered Beans: ");
305 String
[] beans
= applicationContext
.getBeanDefinitionNames();
306 for (String bean
:beans
){
310 configuration
= (ICdmApplicationConfiguration
)applicationContext
.getBean("cdmApplicationDefaultConfiguration");
311 getDatabaseService().setApplicationController(this);
316 /* ****** Services *********/
317 public final INameService
getNameService(){
318 return configuration
.getNameService();
321 public final ITaxonService
getTaxonService(){
322 return configuration
.getTaxonService();
325 public final ITaxonTreeService
getTaxonTreeService(){
326 return configuration
.getTaxonTreeService();
329 public final IReferenceService
getReferenceService(){
330 return configuration
.getReferenceService();
333 public final IAgentService
getAgentService(){
334 return configuration
.getAgentService();
337 public final IDatabaseService
getDatabaseService(){
338 return configuration
.getDatabaseService();
341 public final ITermService
getTermService(){
342 return configuration
.getTermService();
345 public final IDescriptionService
getDescriptionService(){
346 return configuration
.getDescriptionService();
349 public final IOccurrenceService
getOccurrenceService(){
350 return configuration
.getOccurrenceService();
353 public final IMediaService
getMediaService(){
354 return configuration
.getMediaService();
357 public final ICommonService
getCommonService(){
358 return configuration
.getCommonService();
361 public final ILocationService
getLocationService(){
362 return configuration
.getLocationService();
365 public final IUserService
getUserService(){
366 return configuration
.getUserService();
369 public final ICollectionService
getCollectionService(){
370 return configuration
.getCollectionService();
373 public final IFeatureTreeService
getFeatureTreeService(){
374 return configuration
.getFeatureTreeService();
377 public final IVocabularyService
getVocabularyService(){
378 return configuration
.getVocabularyService();
381 public final IService
<CdmBase
> getMainService(){
382 return configuration
.getMainService();
385 public final ConversationHolder
NewConversation(){
386 //return (ConversationHolder)applicationContext.getBean("conversationHolder");
387 return configuration
.NewConversation();
391 public final ProviderManager
getAuthenticationManager(){
392 return configuration
.getAuthenticationManager();
395 public final Object
getBean(String name
){
396 return this.applicationContext
.getBean(name
);
400 * OLD TRANSACTION STUFF
403 /* **** flush ***********/
404 public void flush() {
405 SessionFactory sf
= (SessionFactory
)applicationContext
.getBean("sessionFactory");
406 sf
.getCurrentSession().flush();
409 public SessionFactory
getSessionFactory(){
410 return (SessionFactory
)applicationContext
.getBean("sessionFactory");
413 public TransactionStatus
startTransaction() {
415 return startTransaction(false);
418 public TransactionStatus
startTransaction(Boolean readOnly
) {
420 PlatformTransactionManager txManager
= configuration
.getTransactionManager();
422 DefaultTransactionDefinition defaultTxDef
= new DefaultTransactionDefinition();
423 defaultTxDef
.setReadOnly(readOnly
);
424 TransactionDefinition txDef
= defaultTxDef
;
426 // Log some transaction-related debug information.
427 if (logger
.isDebugEnabled()) {
428 logger
.debug("Transaction name = " + txDef
.getName());
429 logger
.debug("Transaction facets:");
430 logger
.debug("Propagation behavior = " + txDef
.getPropagationBehavior());
431 logger
.debug("Isolation level = " + txDef
.getIsolationLevel());
432 logger
.debug("Timeout = " + txDef
.getTimeout());
433 logger
.debug("Read Only = " + txDef
.isReadOnly());
434 // org.springframework.orm.hibernate3.HibernateTransactionManager
435 // provides more transaction/session-related debug information.
438 TransactionStatus txStatus
= txManager
.getTransaction(txDef
);
442 public void commitTransaction(TransactionStatus txStatus
){
443 PlatformTransactionManager txManager
= configuration
.getTransactionManager();
444 txManager
.commit(txStatus
);