add TaxonDescriptionMedia methods to description service
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationController.java
index 5e19e47e08525710619f1a10098d94ecc8b3691b..7dc5377d7101f2f0d210ff6d6f385afc0ceea213 100644 (file)
@@ -19,39 +19,42 @@ import org.hibernate.SessionFactory;
 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.ITaxonTreeService;\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.common.IProgressMonitor;\r
-import eu.etaxonomy.cdm.common.NullProgressMonitor;\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
@@ -60,7 +63,6 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.CdmMetaData;\r
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
 import eu.etaxonomy.cdm.model.common.User;\r
-import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;\r
 \r
 \r
 /**\r
@@ -78,151 +80,188 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
 \r
        private IProgressMonitor progressMonitor;\r
        \r
-       final static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;\r
+       final protected static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;\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
+        * @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 CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\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
+               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) \r
-       throws DataSourceNotFoundException, TermNotFoundException{\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) \r
-       throws DataSourceNotFoundException, TermNotFoundException{\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
-       throws DataSourceNotFoundException, TermNotFoundException{\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
-       throws DataSourceNotFoundException, TermNotFoundException{\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
-       throws DataSourceNotFoundException, TermNotFoundException{\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
-               return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor);\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(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){\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
                \r
                if (dbSchemaValidation == null){\r
                        dbSchemaValidation = defaultDbSchemaValidation;\r
                }\r
-               \r
-               this.applicationContextResource = applicationContextResource != null ? applicationContextResource : new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);\r
+               this.applicationContextResource = applicationContextResource != null ? applicationContextResource : getClasspathResource();\r
                this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();\r
                \r
-               setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading);\r
+               setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);\r
        }\r
-               \r
+\r
        \r
        /**\r
         * 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, boolean omitTermLoading){\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
-               progressMonitor.subTask("Connecting to '" + dataSource.getName() + "'");\r
-               progressMonitor.worked(1);\r
-\r
-               GenericApplicationContext appContext;\r
-               appContext = new EclipseRcpSaveGenericApplicationContext();\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
                BeanDefinition datasourceBean = dataSource.getDatasourceBean();\r
                datasourceBean.setAttribute("isLazy", false);\r
                progressMonitor.subTask("Registering datasource.");\r
+               applicationContext.registerBeanDefinition("dataSource", datasourceBean);\r
                progressMonitor.worked(1);\r
-               appContext.registerBeanDefinition("dataSource", datasourceBean);\r
                \r
                BeanDefinition hibernatePropBean= dataSource.getHibernatePropertiesBean(dbSchemaValidation);\r
-               appContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);\r
+               applicationContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);\r
                \r
-               XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(appContext);\r
-               progressMonitor.subTask("Registering context resources.");\r
+               XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);\r
+               progressMonitor.subTask("Registering resources.");\r
+               xmlReader.loadBeanDefinitions(applicationContextResource);\r
                progressMonitor.worked(1);\r
-               xmlReader.loadBeanDefinitions(this.applicationContextResource);          \r
                \r
                //omitTerms\r
-               String initializerName = "persistentTermInitializer";\r
-               BeanDefinition beanDef = appContext.getBeanDefinition(initializerName);\r
-               MutablePropertyValues values = beanDef.getPropertyValues();\r
-               values.addPropertyValue("omit", omitTermLoading);\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
-               progressMonitor.subTask("Starting context. This might take a while...");\r
-               progressMonitor.worked(1);\r
-               appContext.refresh();\r
-               appContext.start();\r
+               if (listeners != null){\r
+                       for(ApplicationListener listener : listeners){\r
+                               applicationContext.addApplicationListener(listener);\r
+                       }\r
+               }\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("Setting application context.");\r
+               progressMonitor.subTask("Cleaning up.");\r
+               setApplicationContext(applicationContext);\r
                progressMonitor.worked(1);\r
-               setApplicationContext(appContext);\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
-                       progressMonitor.worked(1);\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
-                       progressMonitor.worked(1);\r
                        createMetadata();\r
                }\r
-               \r
+               progressMonitor.worked(1);\r
+\r
+               progressMonitor.done();\r
                return true;\r
        }\r
 \r
-       private void createAdminUser(){\r
-               User firstUser = User.NewInstance("admin", "0000");\r
+       protected void createAdminUser(){\r
+               User firstUser = User.NewInstance("admin", "00000");\r
                getUserService().save(firstUser);\r
                logger.info("Admin user created.");\r
        }\r
        \r
-       private void createMetadata(){\r
+       protected void createMetadata(){\r
                List<CdmMetaData> metaData = CdmMetaData.defaultMetaData();\r
                getCommonService().saveAllMetaData(metaData);\r
                logger.info("Metadata created.");\r
@@ -235,7 +274,7 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
         */\r
        public boolean testDefinedTermsAreMissing(){\r
                UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");\r
-               DefinedTermBase<?> english = this.getTermService().getByUri(englishUuid.toString());\r
+               DefinedTermBase<?> english = this.getTermService().load(englishUuid);\r
                if ( english == null || ! english.getUuid().equals(englishUuid)){\r
                        return true;\r
                }else{\r
@@ -250,7 +289,7 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
         */\r
        public boolean changeDataSource(ICdmDataSource dataSource){\r
                //logger.info("Change datasource to : " + dataSource);\r
-               return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false);\r
+               return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false, null);\r
        }\r
        \r
        /**\r
@@ -260,7 +299,7 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
         */\r
        public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){\r
                //logger.info("Change datasource to : " + dataSource);\r
-               return setNewDataSource(dataSource, dbSchemaValidation, false);\r
+               return setNewDataSource(dataSource, dbSchemaValidation, false, null);\r
        }\r
        \r
        /**\r
@@ -271,7 +310,18 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
         */\r
        public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){\r
                logger.info("Change datasource to : " + dataSource);\r
-               return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading);\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(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, List<ApplicationListener> listeners){\r
+               logger.info("Change datasource to : " + dataSource);\r
+               return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);\r
        }\r
        \r
        /**\r
@@ -302,24 +352,22 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
        /**\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
-                       progressMonitor.subTask("Registered Beans: ");\r
                        String[] beanNames = applicationContext.getBeanDefinitionNames();\r
                        for (String beanName : beanNames){\r
                                logger.info(beanName);\r
-                               progressMonitor.subTask(beanName);\r
                        }\r
                }\r
                configuration = (ICdmApplicationConfiguration)applicationContext.getBean("cdmApplicationDefaultConfiguration");\r
@@ -337,8 +385,8 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
                return configuration.getTaxonService();\r
        }\r
        \r
-       public final ITaxonTreeService getTaxonTreeService(){\r
-               return configuration.getTaxonTreeService();\r
+       public final IClassificationService getClassificationService(){\r
+               return configuration.getClassificationService();\r
        }\r
        \r
        public final ITaxonNodeService getTaxonNodeService(){\r
@@ -384,6 +432,10 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
        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
@@ -399,12 +451,28 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
        \r
        public final IVocabularyService getVocabularyService(){\r
                return configuration.getVocabularyService();\r
-       }       \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
@@ -440,32 +508,11 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
        }\r
        \r
        public TransactionStatus startTransaction() {\r
-               \r
                return startTransaction(false);\r
        }\r
        \r
        public TransactionStatus startTransaction(Boolean readOnly) {\r
-               \r
-               PlatformTransactionManager txManager = configuration.getTransactionManager();\r
-               \r
-               DefaultTransactionDefinition defaultTxDef = new DefaultTransactionDefinition();\r
-               defaultTxDef.setReadOnly(readOnly);\r
-               TransactionDefinition txDef = defaultTxDef;\r
-\r
-               // Log some transaction-related debug information.\r
-               if (logger.isDebugEnabled()) {\r
-                       logger.debug("Transaction name = " + txDef.getName());\r
-                       logger.debug("Transaction facets:");\r
-                       logger.debug("Propagation behavior = " + txDef.getPropagationBehavior());\r
-                       logger.debug("Isolation level = " + txDef.getIsolationLevel());\r
-                       logger.debug("Timeout = " + txDef.getTimeout());\r
-                       logger.debug("Read Only = " + txDef.isReadOnly());\r
-                       // org.springframework.orm.hibernate3.HibernateTransactionManager\r
-                       // provides more transaction/session-related debug information.\r
-               }\r
-               \r
-               TransactionStatus txStatus = txManager.getTransaction(txDef);\r
-               return txStatus;\r
+               return configuration.startTransaction(readOnly);\r
        }\r
 \r
        public void commitTransaction(TransactionStatus txStatus){\r
@@ -474,4 +521,6 @@ public class CdmApplicationController implements ICdmApplicationConfiguration{
                return;\r
        }\r
 \r
+\r
+\r
 }\r