add TaxonDescriptionMedia methods to description service
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationController.java
index aa17837467482211c1b41ffbb6d32e6d80f023c2..7dc5377d7101f2f0d210ff6d6f385afc0ceea213 100644 (file)
+// $Id$\r
 /**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ * \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+\r
 \r
 package eu.etaxonomy.cdm.api.application;\r
 \r
+import java.util.List;\r
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.hibernate.SessionFactory;\r
-import org.hsqldb.Server;\r
-import org.springframework.beans.factory.BeanCreationException;\r
+import org.springframework.beans.MutablePropertyValues;\r
 import org.springframework.beans.factory.config.BeanDefinition;\r
 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;\r
+import org.springframework.context.ApplicationListener;\r
 import org.springframework.context.support.AbstractApplicationContext;\r
-import org.springframework.context.support.GenericApplicationContext;\r
 import org.springframework.core.io.ClassPathResource;\r
+import org.springframework.core.io.Resource;\r
+import org.springframework.security.authentication.ProviderManager;\r
 import org.springframework.transaction.PlatformTransactionManager;\r
-import org.springframework.transaction.TransactionDefinition;\r
 import org.springframework.transaction.TransactionStatus;\r
-import org.springframework.transaction.support.DefaultTransactionDefinition;\r
 \r
-import eu.etaxonomy.cdm.api.application.eclipse.EclipseRcpSaveGenericApplicationContext;\r
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
 import eu.etaxonomy.cdm.api.service.IAgentService;\r
+import eu.etaxonomy.cdm.api.service.IClassificationService;\r
+import eu.etaxonomy.cdm.api.service.ICollectionService;\r
+import eu.etaxonomy.cdm.api.service.ICommonService;\r
 import eu.etaxonomy.cdm.api.service.IDatabaseService;\r
+import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
+import eu.etaxonomy.cdm.api.service.IFeatureNodeService;\r
+import eu.etaxonomy.cdm.api.service.IFeatureTreeService;\r
+import eu.etaxonomy.cdm.api.service.IGroupService;\r
+import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;\r
+import eu.etaxonomy.cdm.api.service.ILocationService;\r
+import eu.etaxonomy.cdm.api.service.IMediaService;\r
 import eu.etaxonomy.cdm.api.service.INameService;\r
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;\r
+import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;\r
+import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;\r
 import eu.etaxonomy.cdm.api.service.IReferenceService;\r
+import eu.etaxonomy.cdm.api.service.IService;\r
+import eu.etaxonomy.cdm.api.service.ITaxonNodeService;\r
 import eu.etaxonomy.cdm.api.service.ITaxonService;\r
 import eu.etaxonomy.cdm.api.service.ITermService;\r
+import eu.etaxonomy.cdm.api.service.IUserService;\r
+import eu.etaxonomy.cdm.api.service.IVocabularyService;\r
+import eu.etaxonomy.cdm.api.service.IWorkingSetService;\r
+import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;\r
+import eu.etaxonomy.cdm.common.monitor.NullProgressMonitor;\r
+import eu.etaxonomy.cdm.common.monitor.SubProgressMonitor;\r
 import eu.etaxonomy.cdm.database.CdmPersistentDataSource;\r
 import eu.etaxonomy.cdm.database.DataSourceNotFoundException;\r
 import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
-import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;\r
 import eu.etaxonomy.cdm.database.ICdmDataSource;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.CdmMetaData;\r
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
+import eu.etaxonomy.cdm.model.common.User;\r
 \r
 \r
 /**\r
  * @author a.mueller\r
  *\r
  */\r
-public class CdmApplicationController {\r
+public class CdmApplicationController implements ICdmApplicationConfiguration{\r
        private static final Logger logger = Logger.getLogger(CdmApplicationController.class);\r
        \r
+       public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE = "/eu/etaxonomy/cdm/defaultApplicationContext.xml";\r
+       \r
        public AbstractApplicationContext applicationContext;\r
-       private ICdmApplicationConfiguration configuration;\r
+       private ICdmApplicationConfiguration configuration; \r
+       private Resource applicationContextResource;\r
+\r
+       private IProgressMonitor progressMonitor;\r
+       \r
+       final protected static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;\r
        \r
-       final static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;\r
        \r
        \r
        /**\r
-        * Constructor, opens an spring 2.5 ApplicationContext by using the default data source\r
+        * Constructor, opens a spring ApplicationContext by using the default data source\r
+        * @throws DataSourceNotFoundException \r
         */\r
-       public static CdmApplicationController NewInstance()  throws DataSourceNotFoundException, TermNotFoundException {\r
+       public static CdmApplicationController NewInstance() throws DataSourceNotFoundException {\r
                logger.info("Start CdmApplicationController with default data source");\r
-               CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();\r
+               CdmPersistentDataSource dataSource = getDefaultDatasource();\r
                DbSchemaValidation dbSchemaValidation = defaultDbSchemaValidation;\r
-               return new CdmApplicationController(dataSource, dbSchemaValidation);\r
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
        }\r
-\r
-       \r
        \r
        /**\r
-        * Constructor, opens an spring 2.5 ApplicationContext by using the default data source\r
+        * Constructor, opens a spring ApplicationContext by using the default data source\r
         * @param dbSchemaValidation validation type for database schema\r
+        * @throws DataSourceNotFoundException \r
         */\r
-       public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation)  throws DataSourceNotFoundException, TermNotFoundException {\r
+       public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException {\r
                logger.info("Start CdmApplicationController with default data source");\r
-               CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();\r
-               if (dbSchemaValidation == null){\r
-                       dbSchemaValidation = defaultDbSchemaValidation;\r
-               }\r
-               return new CdmApplicationController(dataSource, dbSchemaValidation);\r
+               CdmPersistentDataSource dataSource = getDefaultDatasource();\r
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
        }\r
 \r
        \r
        /**\r
-        * Constructor, opens an spring 2.5 ApplicationContext by using the according data source and the\r
+        * Constructor, opens an spring ApplicationContext by using the according data source and the\r
         * default database schema validation type\r
         * @param dataSource\r
         */\r
-       public static CdmApplicationController NewInstance(ICdmDataSource dataSource) throws DataSourceNotFoundException, TermNotFoundException{\r
-               return new CdmApplicationController(dataSource, defaultDbSchemaValidation);\r
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource) {\r
+               return CdmApplicationController.NewInstance(null, dataSource, defaultDbSchemaValidation, false);\r
        }\r
        \r
-       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException, TermNotFoundException{\r
-               return new CdmApplicationController(dataSource, dbSchemaValidation);\r
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation) {\r
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
+       }\r
+\r
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading) {\r
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, omitTermLoading);\r
+       }\r
+       \r
+       public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading) {\r
+               return CdmApplicationController.NewInstance(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, null);\r
+       }\r
+       \r
+       public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor) {\r
+               return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor, null);\r
+       }\r
+       \r
+       //TODO discuss need for listeners before commit to trunk\r
+//     public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners) {\r
+//             return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor,listeners);\r
+//     }\r
+\r
+\r
+       /**\r
+        * @return\r
+        */\r
+       protected static ClassPathResource getClasspathResource() {\r
+               return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);\r
+       }       \r
+\r
+       /**\r
+        * @return\r
+        * @throws DataSourceNotFoundException \r
+        */\r
+       protected static CdmPersistentDataSource getDefaultDatasource() throws DataSourceNotFoundException {\r
+               CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();\r
+               return dataSource;\r
        }\r
 \r
 \r
        /**\r
         * Constructor, opens an spring 2.5 ApplicationContext by using the according data source\r
         * @param dataSource\r
+        * @param dbSchemaValidation\r
+        * @param omitTermLoading\r
         */\r
-       private CdmApplicationController(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException, TermNotFoundException{\r
+       protected CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners){\r
                logger.info("Start CdmApplicationController with datasource: " + dataSource.getName());\r
-               if (setNewDataSource(dataSource, dbSchemaValidation) == false){\r
-                       throw new DataSourceNotFoundException("Wrong datasource: " + dataSource );\r
+               \r
+               if (dbSchemaValidation == null){\r
+                       dbSchemaValidation = defaultDbSchemaValidation;\r
                }\r
-       \r
+               this.applicationContextResource = applicationContextResource != null ? applicationContextResource : getClasspathResource();\r
+               this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();\r
+               \r
+               setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);\r
        }\r
 \r
        \r
@@ -110,50 +178,94 @@ public class CdmApplicationController {
         * Sets the application context to a new spring ApplicationContext by using the according data source and initializes the Controller.\r
         * @param dataSource\r
         */\r
-       private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation) throws TermNotFoundException {\r
+       private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, List<ApplicationListener> listeners){\r
+\r
                if (dbSchemaValidation == null){\r
                        dbSchemaValidation = defaultDbSchemaValidation;\r
                }\r
                logger.info("Connecting to '" + dataSource.getName() + "'");\r
+               \r
+               MonitoredGenericApplicationContext applicationContext =  new MonitoredGenericApplicationContext();\r
+               int refreshTasks = 45;\r
+               int nTasks = 5 + refreshTasks;\r
+//             nTasks += applicationContext.countTasks();\r
+               progressMonitor.beginTask("Connecting to '" + dataSource.getName() + "'", nTasks);\r
+               \r
+//             progressMonitor.worked(1);\r
 \r
-\r
-               GenericApplicationContext appContext;\r
-               try {\r
-                       appContext = new EclipseRcpSaveGenericApplicationContext();\r
-                       \r
-                       BeanDefinition datasourceBean = dataSource.getDatasourceBean();\r
-                       datasourceBean.setAttribute("isLazy", false);\r
-                       appContext.registerBeanDefinition("dataSource", datasourceBean);\r
-                       \r
-                       BeanDefinition hibernatePropBean= dataSource.getHibernatePropertiesBean(dbSchemaValidation);\r
-                       appContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);\r
-                       \r
-                       XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(appContext);\r
-                       xmlReader.loadBeanDefinitions(new ClassPathResource("/eu/etaxonomy/cdm/persistence.xml"));               \r
-                       \r
-                       appContext.refresh();\r
-                       appContext.start();\r
-               } catch (BeanCreationException e) {\r
-                       // create new schema\r
-                       if (dbSchemaValidation == DbSchemaValidation.VALIDATE) {\r
-                               logger.error("ApplicationContext could not be created. " +\r
-                                       " Maybe your database schema is not up-to-date, " +\r
-                                       " but there might be other BeanCreation problems too." +\r
-                                       " Try to run CdmApplicationController with dbSchemaValidation.CREATE or dbSchemaValidation.UPDATE option. ");\r
-                       } else {\r
-                               logger.error("BeanCreationException (CdmApplicationController startet with " + dbSchemaValidation.toString() + " option.");\r
+               BeanDefinition datasourceBean = dataSource.getDatasourceBean();\r
+               datasourceBean.setAttribute("isLazy", false);\r
+               progressMonitor.subTask("Registering datasource.");\r
+               applicationContext.registerBeanDefinition("dataSource", datasourceBean);\r
+               progressMonitor.worked(1);\r
+               \r
+               BeanDefinition hibernatePropBean= dataSource.getHibernatePropertiesBean(dbSchemaValidation);\r
+               applicationContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);\r
+               \r
+               XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);\r
+               progressMonitor.subTask("Registering resources.");\r
+               xmlReader.loadBeanDefinitions(applicationContextResource);\r
+               progressMonitor.worked(1);\r
+               \r
+               //omitTerms\r
+               if (omitTermLoading == true){\r
+                       String initializerName = "persistentTermInitializer";\r
+                       BeanDefinition beanDef = applicationContext.getBeanDefinition(initializerName);\r
+                       MutablePropertyValues values = beanDef.getPropertyValues();\r
+                       values.addPropertyValue("omit", omitTermLoading);\r
+               }\r
+               \r
+               if (listeners != null){\r
+                       for(ApplicationListener listener : listeners){\r
+                               applicationContext.addApplicationListener(listener);\r
                        }\r
-                       e.printStackTrace();\r
-                       return false;\r
                }\r
-               setApplicationContext(appContext);\r
-               // load defined terms if necessary \r
-               //TODO not necessary any more\r
-               if (testDefinedTermsAreMissing()){\r
-                       throw new TermNotFoundException("Some needed Terms are Missing.");\r
+               \r
+//             String message = "Start application context. This might take a while ...";\r
+////           progressMonitor.subTask(message);\r
+//             SubProgressMonitor subMonitor= new SubProgressMonitor(progressMonitor, 10);\r
+//             subMonitor.beginTask(message, 2);\r
+//             applicationContext.setProgressMonitor(subMonitor);\r
+               \r
+               applicationContext.refresh(new SubProgressMonitor(progressMonitor, refreshTasks));\r
+               applicationContext.start();\r
+//             progressMonitor.worked(1);\r
+               \r
+               progressMonitor.subTask("Cleaning up.");\r
+               setApplicationContext(applicationContext);\r
+               progressMonitor.worked(1);\r
+               \r
+               //initialize user and metaData for new databases\r
+               int userCount = getUserService().count(User.class);\r
+               if (userCount == 0 ){\r
+                       progressMonitor.subTask("Creating Admin User");\r
+                       createAdminUser();\r
+               }\r
+               progressMonitor.worked(1);\r
+\r
+               //CDM Meta Data\r
+               int metaDataCount = getCommonService().getCdmMetaData().size();\r
+               if (metaDataCount == 0){\r
+                       progressMonitor.subTask("Creating Meta Data");\r
+                       createMetadata();\r
                }\r
+               progressMonitor.worked(1);\r
+\r
+               progressMonitor.done();\r
                return true;\r
        }\r
+\r
+       protected void createAdminUser(){\r
+               User firstUser = User.NewInstance("admin", "00000");\r
+               getUserService().save(firstUser);\r
+               logger.info("Admin user created.");\r
+       }\r
+       \r
+       protected void createMetadata(){\r
+               List<CdmMetaData> metaData = CdmMetaData.defaultMetaData();\r
+               getCommonService().saveAllMetaData(metaData);\r
+               logger.info("Metadata created.");\r
+       }\r
        \r
        \r
        /**\r
@@ -162,7 +274,7 @@ public class CdmApplicationController {
         */\r
        public boolean testDefinedTermsAreMissing(){\r
                UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");\r
-               DefinedTermBase english = this.getTermService().getTermByUri(englishUuid.toString());\r
+               DefinedTermBase<?> english = this.getTermService().load(englishUuid);\r
                if ( english == null || ! english.getUuid().equals(englishUuid)){\r
                        return true;\r
                }else{\r
@@ -175,18 +287,41 @@ public class CdmApplicationController {
         * Changes the ApplicationContext to the new dataSource\r
         * @param dataSource\r
         */\r
-       public boolean changeDataSource(CdmPersistentDataSource dataSource) throws TermNotFoundException {\r
+       public boolean changeDataSource(ICdmDataSource dataSource){\r
+               //logger.info("Change datasource to : " + dataSource);\r
+               return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false, null);\r
+       }\r
+       \r
+       /**\r
+        * Changes the ApplicationContext to the new dataSource\r
+        * @param dataSource\r
+        * @param dbSchemaValidation\r
+        */\r
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){\r
+               //logger.info("Change datasource to : " + dataSource);\r
+               return setNewDataSource(dataSource, dbSchemaValidation, false, null);\r
+       }\r
+       \r
+       /**\r
+        * Changes the ApplicationContext to the new dataSource\r
+        * @param dataSource\r
+        * @param dbSchemaValidation\r
+        * @param omitTermLoading\r
+        */\r
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){\r
                logger.info("Change datasource to : " + dataSource);\r
-               return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE);\r
+               return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, null);\r
        }\r
        \r
        /**\r
         * Changes the ApplicationContext to the new dataSource\r
         * @param dataSource\r
+        * @param dbSchemaValidation\r
+        * @param omitTermLoading\r
         */\r
-       public boolean changeDataSource(CdmPersistentDataSource dataSource, DbSchemaValidation dbSchemaValidation)  throws TermNotFoundException {\r
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, List<ApplicationListener> listeners){\r
                logger.info("Change datasource to : " + dataSource);\r
-               return setNewDataSource(dataSource, dbSchemaValidation);\r
+               return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);\r
        }\r
        \r
        /**\r
@@ -217,22 +352,22 @@ public class CdmApplicationController {
        /**\r
         * closes the application context\r
         */\r
-       private void closeApplicationContext(){\r
+       protected void closeApplicationContext(){\r
                if (applicationContext != null){\r
                        logger.info("Close ApplicationContext");\r
                        applicationContext.close();\r
                }\r
        }\r
        \r
-       private void init(){\r
+       protected void init(){\r
                logger.debug("Init " +  this.getClass().getName() + " ... ");\r
                if (logger.isDebugEnabled()){for (String beanName : applicationContext.getBeanDefinitionNames()){ logger.debug(beanName);}}\r
                //TODO delete next row (was just for testing)\r
                if (logger.isInfoEnabled()){\r
                        logger.info("Registered Beans: ");\r
-                       String[] beans = applicationContext.getBeanDefinitionNames();\r
-                       for (String bean:beans){\r
-                               logger.info(bean);\r
+                       String[] beanNames = applicationContext.getBeanDefinitionNames();\r
+                       for (String beanName : beanNames){\r
+                               logger.info(beanName);\r
                        }\r
                }\r
                configuration = (ICdmApplicationConfiguration)applicationContext.getBean("cdmApplicationDefaultConfiguration");\r
@@ -249,6 +384,14 @@ public class CdmApplicationController {
        public final ITaxonService getTaxonService(){\r
                return configuration.getTaxonService();\r
        }\r
+       \r
+       public final IClassificationService getClassificationService(){\r
+               return configuration.getClassificationService();\r
+       }\r
+       \r
+       public final ITaxonNodeService getTaxonNodeService(){\r
+               return configuration.getTaxonNodeService();\r
+       }\r
 \r
        public final IReferenceService getReferenceService(){\r
                return configuration.getReferenceService();\r
@@ -265,6 +408,94 @@ public class CdmApplicationController {
        public final ITermService getTermService(){\r
                return configuration.getTermService();\r
        }\r
+\r
+       public final IDescriptionService getDescriptionService(){\r
+               return configuration.getDescriptionService();\r
+       }\r
+       \r
+       public final IOccurrenceService getOccurrenceService(){\r
+               return configuration.getOccurrenceService();\r
+       }\r
+\r
+       public final IMediaService getMediaService(){\r
+               return configuration.getMediaService();\r
+       }\r
+\r
+       public final ICommonService getCommonService(){\r
+               return configuration.getCommonService();\r
+       }\r
+       \r
+       public final ILocationService getLocationService(){\r
+               return configuration.getLocationService();\r
+       }\r
+       \r
+       public final IUserService getUserService(){\r
+               return configuration.getUserService();\r
+       }\r
+\r
+       public IGroupService getGroupService() {\r
+               return configuration.getGroupService();\r
+       }\r
+       \r
+       public final ICollectionService getCollectionService(){\r
+               return configuration.getCollectionService();\r
+       }\r
+       \r
+       public final IFeatureTreeService getFeatureTreeService(){\r
+               return configuration.getFeatureTreeService();\r
+       }\r
+       \r
+       public final IFeatureNodeService getFeatureNodeService(){\r
+               return configuration.getFeatureNodeService();\r
+       }\r
+       \r
+       public final IVocabularyService getVocabularyService(){\r
+               return configuration.getVocabularyService();\r
+       }\r
+       \r
+       public final IIdentificationKeyService getIdentificationKeyService(){\r
+               return configuration.getIdentificationKeyService();\r
+       }\r
+\r
+       public final IPolytomousKeyService getPolytomousKeyService(){\r
+               return configuration.getPolytomousKeyService();\r
+       }\r
+\r
+       public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){\r
+               return configuration.getPolytomousKeyNodeService();\r
+       }\r
+       \r
+       public final IService<CdmBase> getMainService(){\r
+               return configuration.getMainService();\r
+       }\r
+       \r
+       public final IWorkingSetService getWorkingSetService(){\r
+               return configuration.getWorkingSetService();\r
+       }\r
+       \r
+       public final ConversationHolder NewConversation(){\r
+               //return (ConversationHolder)applicationContext.getBean("conversationHolder");\r
+               return configuration.NewConversation();\r
+       }\r
+       \r
+       \r
+       public final ProviderManager getAuthenticationManager(){\r
+               return configuration.getAuthenticationManager();\r
+       }\r
+       \r
+\r
+       @Override\r
+       public final PlatformTransactionManager getTransactionManager() {\r
+               return configuration.getTransactionManager();\r
+       }\r
+       \r
+       public final Object getBean(String name){\r
+               return this.applicationContext.getBean(name);\r
+       }\r
+       \r
+       /*\r
+        * OLD TRANSACTION STUFF \r
+        */\r
        \r
        /* **** flush ***********/\r
        public void flush() {\r
@@ -272,18 +503,24 @@ public class CdmApplicationController {
                sf.getCurrentSession().flush();\r
        }\r
        \r
-       public TransactionStatus startTransaction(){\r
-               PlatformTransactionManager txManager = configuration.getTransactionManager();\r
-               TransactionDefinition txDef = new DefaultTransactionDefinition();\r
-               \r
-               TransactionStatus txStatus = txManager.getTransaction(txDef);\r
-               return txStatus;\r
+       public SessionFactory getSessionFactory(){\r
+               return (SessionFactory)applicationContext.getBean("sessionFactory");\r
+       }\r
+       \r
+       public TransactionStatus startTransaction() {\r
+               return startTransaction(false);\r
        }\r
        \r
+       public TransactionStatus startTransaction(Boolean readOnly) {\r
+               return configuration.startTransaction(readOnly);\r
+       }\r
+\r
        public void commitTransaction(TransactionStatus txStatus){\r
                PlatformTransactionManager txManager = configuration.getTransactionManager();\r
                txManager.commit(txStatus);\r
                return;\r
        }\r
 \r
+\r
+\r
 }\r