Minor cleanup
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationController.java
index 9064ecfdc8df7e54b1f093b5b37cec7a8d993c56..6eab5f37cd241697f53d485fbd7258addc602a91 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
-\r
-package eu.etaxonomy.cdm.api.application;\r
-\r
-import java.util.EnumSet;\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.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.core.io.ClassPathResource;\r
-import org.springframework.core.io.Resource;\r
-import org.springframework.security.authentication.ProviderManager;\r
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\r
-import org.springframework.security.core.Authentication;\r
-import org.springframework.security.core.context.SecurityContext;\r
-import org.springframework.security.core.context.SecurityContextHolder;\r
-import org.springframework.transaction.PlatformTransactionManager;\r
-import org.springframework.transaction.TransactionStatus;\r
-\r
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
-import eu.etaxonomy.cdm.api.service.IAgentService;\r
-import eu.etaxonomy.cdm.api.service.IAnnotationService;\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.IEntityConstraintViolationService;\r
-import eu.etaxonomy.cdm.api.service.IEntityValidationService;\r
-import eu.etaxonomy.cdm.api.service.IFeatureNodeService;\r
-import eu.etaxonomy.cdm.api.service.IFeatureTreeService;\r
-import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;\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.api.service.molecular.IAmplificationService;\r
-import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;\r
-import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;\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.database.ICdmDataSource;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
-import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;\r
-import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;\r
-\r
-/**\r
- * @author a.mueller\r
- */\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
-       protected ICdmApplicationConfiguration configuration;\r
-       private final Resource applicationContextResource;\r
-\r
-       private final IProgressMonitor progressMonitor;\r
-\r
-       final protected static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;\r
-\r
-\r
-       /**\r
-        * Constructor, opens a spring ApplicationContext by using the default data source\r
-        *\r
-        * @throws DataSourceNotFoundException\r
-        */\r
-       public static CdmApplicationController NewInstance() throws DataSourceNotFoundException{\r
-               logger.info("Start CdmApplicationController with default data source");\r
-               CdmPersistentDataSource dataSource = getDefaultDatasource();\r
-               DbSchemaValidation dbSchemaValidation = defaultDbSchemaValidation;\r
-               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
-       }\r
-\r
-\r
-       /**\r
-        * Constructor, opens a spring ApplicationContext by using the default data source\r
-        *\r
-        * @param dbSchemaValidation\r
-        *            validation type for database schema\r
-        * @throws DataSourceNotFoundException\r
-        */\r
-       public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException{\r
-               logger.info("Start CdmApplicationController with default data source");\r
-               CdmPersistentDataSource dataSource = getDefaultDatasource();\r
-               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
-       }\r
-\r
-\r
-       /**\r
-        * Constructor, opens an spring ApplicationContext by using the according data source\r
-        * and the default database schema validation type\r
-        *\r
-        * @param dataSource\r
-        */\r
-       public static CdmApplicationController NewInstance(ICdmDataSource dataSource){\r
-               return CdmApplicationController.NewInstance(null, dataSource, defaultDbSchemaValidation, false);\r
-       }\r
-\r
-\r
-       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){\r
-               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
-       }\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,\r
-                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){\r
-               return CdmApplicationController.NewInstance(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, null);\r
-       }\r
-\r
-       public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,\r
-                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){\r
-               return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor, null);\r
-       }\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\r
-        */\r
-       protected static ClassPathResource getClasspathResource(){\r
-               return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);\r
-       }\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
-        *\r
-        * FIXME:Remoting this constructor is added only to allow extension of this cntroller\r
-        * class. and should be removed after refactoring\r
-        */\r
-       protected CdmApplicationController(){\r
-               applicationContextResource = null;\r
-               progressMonitor = null;\r
-       }\r
-\r
-\r
-       /**\r
-        * Constructor, opens an spring 2.5 ApplicationContext by using the according data\r
-        * source\r
-        *\r
-        * @param dataSource\r
-        * @param dbSchemaValidation\r
-        * @param omitTermLoading\r
-        */\r
-       protected CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation,\r
-                       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
-               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
-       /**\r
-        * Sets the application context to a new spring ApplicationContext by using the\r
-        * according data source and initializes the Controller.\r
-        *\r
-        * @param dataSource\r
-        */\r
-       private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,\r
-                       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
-               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
-               }\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
-               progressMonitor.done();\r
-               return true;\r
-       }\r
-\r
-\r
-       /**\r
-        * Tests if some DefinedTermsAreMissing.\r
-        *\r
-        * @return true, if at least one is missing, else false\r
-        */\r
-       public boolean testDefinedTermsAreMissing(){\r
-               UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");\r
-               DefinedTermBase<?> english = this.getTermService().load(englishUuid);\r
-               if (english == null || !english.getUuid().equals(englishUuid)) {\r
-                       return true;\r
-               }\r
-               else {\r
-                       return false;\r
-               }\r
-       }\r
-\r
-\r
-       /**\r
-        * Changes the ApplicationContext to the new dataSource\r
-        *\r
-        * @param dataSource\r
-        */\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
-       /**\r
-        * Changes the ApplicationContext to the new dataSource\r
-        *\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
-       /**\r
-        * Changes the ApplicationContext to the new dataSource\r
-        *\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, omitTermLoading, null);\r
-       }\r
-\r
-\r
-       /**\r
-        * Changes the ApplicationContext to the new dataSource\r
-        *\r
-        * @param dataSource\r
-        * @param dbSchemaValidation\r
-        * @param omitTermLoading\r
-        */\r
-       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,\r
-                       List<ApplicationListener> listeners){\r
-               logger.info("Change datasource to : " + dataSource);\r
-               return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);\r
-       }\r
-\r
-\r
-       /**\r
-        * Sets a new application Context.\r
-        *\r
-        * @param ac\r
-        */\r
-       public void setApplicationContext(AbstractApplicationContext ac){\r
-               closeApplicationContext(); //closes old application context if necessary\r
-               applicationContext = ac;\r
-               applicationContext.registerShutdownHook();\r
-               init();\r
-       }\r
-\r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        *\r
-        * @see java.lang.Object#finalize()\r
-        */\r
-       @Override\r
-       public void finalize(){\r
-               close();\r
-       }\r
-\r
-\r
-       /**\r
-        * closes the application\r
-        */\r
-       public void close(){\r
-               closeApplicationContext();\r
-       }\r
-\r
-\r
-       /**\r
-        * closes the application context\r
-        */\r
-       protected void closeApplicationContext(){\r
-               if (applicationContext != null) {\r
-                       logger.info("Close ApplicationContext");\r
-                       applicationContext.close();\r
-               }\r
-       }\r
-\r
-\r
-       protected void init(){\r
-               logger.debug("Init " + this.getClass().getName() + " ... ");\r
-               if (logger.isDebugEnabled()) {\r
-                       for (String beanName : applicationContext.getBeanDefinitionNames()) {\r
-                               logger.debug(beanName);\r
-                       }\r
-               }\r
-               //TODO delete next row (was just for testing)\r
-               if (logger.isInfoEnabled()) {\r
-                       logger.info("Registered Beans: ");\r
-                       String[] beanNames = applicationContext.getBeanDefinitionNames();\r
-                       for (String beanName : beanNames) {\r
-                               logger.info(beanName);\r
-                       }\r
-               }\r
-               configuration = (ICdmApplicationConfiguration) applicationContext.getBean("cdmApplicationDefaultConfiguration");\r
-               try {\r
-                       //FIXME:Remoting catching exection to allow for remoting\r
-                       getDatabaseService().setApplicationController(this);\r
-               }\r
-               catch (UnsupportedOperationException uoe) {\r
-                       logger.warn("getDatabaseService() is not implmented for current application context");\r
-               }\r
-       }\r
-\r
-\r
-       /* ****** Services ******** */\r
-       @Override\r
-       public final IAnnotationService getAnnotationService(){\r
-           return configuration.getAnnotationService();\r
-       }\r
-\r
-       @Override\r
-       public final INameService getNameService(){\r
-           return configuration.getNameService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final ITaxonService getTaxonService(){\r
-               return configuration.getTaxonService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IClassificationService getClassificationService(){\r
-               return configuration.getClassificationService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final ITaxonNodeService getTaxonNodeService(){\r
-               return configuration.getTaxonNodeService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IReferenceService getReferenceService(){\r
-               return configuration.getReferenceService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IAgentService getAgentService(){\r
-               return configuration.getAgentService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IDatabaseService getDatabaseService(){\r
-               return configuration.getDatabaseService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final ITermService getTermService(){\r
-               return configuration.getTermService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IDescriptionService getDescriptionService(){\r
-               return configuration.getDescriptionService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IOccurrenceService getOccurrenceService(){\r
-               return configuration.getOccurrenceService();\r
-       }\r
-\r
-       @Override\r
-       public IAmplificationService getAmplificationService(){\r
-               return configuration.getAmplificationService();\r
-       }\r
-\r
-       @Override\r
-       public ISequenceService getSequenceService(){\r
-               return configuration.getSequenceService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IPrimerService getPrimerService(){\r
-               return configuration.getPrimerService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IMediaService getMediaService(){\r
-               return configuration.getMediaService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final ICommonService getCommonService(){\r
-               return configuration.getCommonService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final ILocationService getLocationService(){\r
-               return configuration.getLocationService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IUserService getUserService(){\r
-               return configuration.getUserService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IGrantedAuthorityService getGrantedAuthorityService(){\r
-               return configuration.getGrantedAuthorityService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public IGroupService getGroupService(){\r
-               return configuration.getGroupService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final ICollectionService getCollectionService(){\r
-               return configuration.getCollectionService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IFeatureTreeService getFeatureTreeService(){\r
-               return configuration.getFeatureTreeService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IFeatureNodeService getFeatureNodeService(){\r
-               return configuration.getFeatureNodeService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IVocabularyService getVocabularyService(){\r
-               return configuration.getVocabularyService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IIdentificationKeyService getIdentificationKeyService(){\r
-               return configuration.getIdentificationKeyService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IPolytomousKeyService getPolytomousKeyService(){\r
-               return configuration.getPolytomousKeyService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){\r
-               return configuration.getPolytomousKeyNodeService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public IEntityValidationService getEntityValidationService(){\r
-               return configuration.getEntityValidationService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public IEntityConstraintViolationService getEntityConstraintViolationService(){\r
-               return configuration.getEntityConstraintViolationService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IService<CdmBase> getMainService(){\r
-               return configuration.getMainService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final IWorkingSetService getWorkingSetService(){\r
-               return configuration.getWorkingSetService();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final ConversationHolder NewConversation(){\r
-               //return (ConversationHolder)applicationContext.getBean("conversationHolder");\r
-               return configuration.NewConversation();\r
-       }\r
-\r
-\r
-       /* **** Security ***** */\r
-\r
-       @Override\r
-       public void authenticate(String username, String password){\r
-               UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);\r
-               Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);\r
-               SecurityContext context = SecurityContextHolder.getContext();\r
-               context.setAuthentication(authentication);\r
-       }\r
-\r
-       @Override\r
-       public final ProviderManager getAuthenticationManager(){\r
-               return configuration.getAuthenticationManager();\r
-       }\r
-\r
-\r
-       @Override\r
-       public ICdmPermissionEvaluator getPermissionEvaluator(){\r
-               return configuration.getPermissionEvaluator();\r
-       }\r
-\r
-\r
-       /**\r
-        * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication,\r
-        *      java.lang.Object, java.lang.Object)\r
-        *\r
-        * @param targetDomainObject\r
-        * @param permission\r
-        * @return\r
-        */\r
-       public boolean currentAuthentiationHasPermissions(CdmBase targetDomainObject, EnumSet<CRUD> permission){\r
-               SecurityContext context = SecurityContextHolder.getContext();\r
-               return getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject, permission);\r
-       }\r
-\r
-\r
-       @Override\r
-       public final PlatformTransactionManager getTransactionManager(){\r
-               return configuration.getTransactionManager();\r
-       }\r
-\r
-\r
-       @Override\r
-       public final Object getBean(String name){\r
-               return this.applicationContext.getBean(name);\r
-       }\r
-\r
-\r
-       /*\r
-        * OLD TRANSACTION STUFF\r
-        */\r
-\r
-       /* **** flush ********** */\r
-       public void flush(){\r
-               SessionFactory sf = (SessionFactory) applicationContext.getBean("sessionFactory");\r
-               sf.getCurrentSession().flush();\r
-       }\r
-\r
-\r
-       public SessionFactory getSessionFactory(){\r
-               return (SessionFactory) applicationContext.getBean("sessionFactory");\r
-       }\r
-\r
-\r
-       @Override\r
-       public TransactionStatus startTransaction(){\r
-               return startTransaction(false);\r
-       }\r
-\r
-\r
-       @Override\r
-       public TransactionStatus startTransaction(Boolean readOnly){\r
-               return configuration.startTransaction(readOnly);\r
-       }\r
-\r
-       @Override\r
-       public void commitTransaction(TransactionStatus txStatus){\r
-               PlatformTransactionManager txManager = configuration.getTransactionManager();\r
-               txManager.commit(txStatus);\r
-               return;\r
-       }\r
-}\r
+// $Id$
+/**
+ * Copyright (C) 2007 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+
+package eu.etaxonomy.cdm.api.application;
+
+import java.util.EnumSet;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.MutablePropertyValues;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
+
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.IAgentService;
+import eu.etaxonomy.cdm.api.service.IAnnotationService;
+import eu.etaxonomy.cdm.api.service.IClassificationService;
+import eu.etaxonomy.cdm.api.service.ICollectionService;
+import eu.etaxonomy.cdm.api.service.ICommonService;
+import eu.etaxonomy.cdm.api.service.IDatabaseService;
+import eu.etaxonomy.cdm.api.service.IDescriptionService;
+import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;
+import eu.etaxonomy.cdm.api.service.IEntityValidationService;
+import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
+import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
+import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;
+import eu.etaxonomy.cdm.api.service.IGroupService;
+import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;
+import eu.etaxonomy.cdm.api.service.ILocationService;
+import eu.etaxonomy.cdm.api.service.IMediaService;
+import eu.etaxonomy.cdm.api.service.INameService;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
+import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
+import eu.etaxonomy.cdm.api.service.IReferenceService;
+import eu.etaxonomy.cdm.api.service.IService;
+import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
+import eu.etaxonomy.cdm.api.service.ITaxonService;
+import eu.etaxonomy.cdm.api.service.ITermService;
+import eu.etaxonomy.cdm.api.service.IUserService;
+import eu.etaxonomy.cdm.api.service.IVocabularyService;
+import eu.etaxonomy.cdm.api.service.IWorkingSetService;
+import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
+import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
+import eu.etaxonomy.cdm.common.monitor.NullProgressMonitor;
+import eu.etaxonomy.cdm.common.monitor.SubProgressMonitor;
+import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
+import eu.etaxonomy.cdm.database.DataSourceNotFoundException;
+import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.database.ICdmDataSource;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
+import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
+
+/**
+ * @author a.mueller
+ */
+public class CdmApplicationController implements ICdmApplicationConfiguration {
+       private static final Logger logger = Logger.getLogger(CdmApplicationController.class);
+
+       public static final String DEFAULT_APPLICATION_CONTEXT_RESOURCE = "/eu/etaxonomy/cdm/defaultApplicationContext.xml";
+
+       public AbstractApplicationContext applicationContext;
+       protected ICdmApplicationConfiguration configuration;
+       private final Resource applicationContextResource;
+
+       private final IProgressMonitor progressMonitor;
+
+       final protected static DbSchemaValidation defaultDbSchemaValidation = DbSchemaValidation.VALIDATE;
+
+
+       /**
+        * Constructor, opens a spring ApplicationContext by using the default data source
+        *
+        * @throws DataSourceNotFoundException
+        */
+       public static CdmApplicationController NewInstance() throws DataSourceNotFoundException{
+               logger.info("Start CdmApplicationController with default data source");
+               CdmPersistentDataSource dataSource = getDefaultDatasource();
+               DbSchemaValidation dbSchemaValidation = defaultDbSchemaValidation;
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
+       }
+
+
+       /**
+        * Constructor, opens a spring ApplicationContext by using the default data source
+        *
+        * @param dbSchemaValidation
+        *            validation type for database schema
+        * @throws DataSourceNotFoundException
+        */
+       public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException{
+               logger.info("Start CdmApplicationController with default data source");
+               CdmPersistentDataSource dataSource = getDefaultDatasource();
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
+       }
+
+
+       /**
+        * Constructor, opens an spring ApplicationContext by using the according data source
+        * and the default database schema validation type
+        *
+        * @param dataSource
+        */
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource){
+               return CdmApplicationController.NewInstance(null, dataSource, defaultDbSchemaValidation, false);
+       }
+
+
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);
+       }
+
+
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
+               return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, omitTermLoading);
+       }
+
+       public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,
+                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
+               return CdmApplicationController.NewInstance(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, null);
+       }
+
+       public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,
+                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){
+               return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor, null);
+       }
+
+
+       //TODO discuss need for listeners before commit to trunk
+       //      public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners) {
+       //              return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor,listeners);
+       //      }
+
+       /**
+        * @return
+        */
+       protected static ClassPathResource getClasspathResource(){
+               return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);
+       }
+
+
+       /**
+        * @return
+        * @throws DataSourceNotFoundException
+        */
+       protected static CdmPersistentDataSource getDefaultDatasource() throws DataSourceNotFoundException{
+               CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();
+               return dataSource;
+       }
+
+
+       /**
+        *
+        * FIXME:Remoting this constructor is added only to allow extension of this cntroller
+        * class. and should be removed after refactoring
+        */
+       protected CdmApplicationController(){
+               applicationContextResource = null;
+               progressMonitor = null;
+       }
+
+
+       /**
+        * Constructor, opens an spring 2.5 ApplicationContext by using the according data
+        * source
+        *
+        * @param dataSource
+        * @param dbSchemaValidation
+        * @param omitTermLoading
+        */
+       protected CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation,
+                       boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners){
+               logger.info("Start CdmApplicationController with datasource: " + dataSource.getName());
+
+               if (dbSchemaValidation == null) {
+                       dbSchemaValidation = defaultDbSchemaValidation;
+               }
+               this.applicationContextResource = applicationContextResource != null ? applicationContextResource : getClasspathResource();
+               this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor();
+
+               setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);
+       }
+
+
+       /**
+        * Sets the application context to a new spring ApplicationContext by using the
+        * according data source and initializes the Controller.
+        *
+        * @param dataSource
+        */
+       private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,
+                       List<ApplicationListener> listeners){
+
+               if (dbSchemaValidation == null) {
+                       dbSchemaValidation = defaultDbSchemaValidation;
+               }
+               logger.info("Connecting to '" + dataSource.getName() + "'");
+
+               MonitoredGenericApplicationContext applicationContext = new MonitoredGenericApplicationContext();
+               int refreshTasks = 45;
+               int nTasks = 5 + refreshTasks;
+               //              nTasks += applicationContext.countTasks();
+               progressMonitor.beginTask("Connecting to '" + dataSource.getName() + "'", nTasks);
+
+               //              progressMonitor.worked(1);
+
+               BeanDefinition datasourceBean = dataSource.getDatasourceBean();
+               datasourceBean.setAttribute("isLazy", false);
+               progressMonitor.subTask("Registering datasource.");
+               applicationContext.registerBeanDefinition("dataSource", datasourceBean);
+               progressMonitor.worked(1);
+
+               BeanDefinition hibernatePropBean = dataSource.getHibernatePropertiesBean(dbSchemaValidation);
+               applicationContext.registerBeanDefinition("hibernateProperties", hibernatePropBean);
+
+               XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext);
+               progressMonitor.subTask("Registering resources.");
+               xmlReader.loadBeanDefinitions(applicationContextResource);
+               progressMonitor.worked(1);
+
+               //omitTerms
+               if (omitTermLoading == true) {
+                       String initializerName = "persistentTermInitializer";
+                       BeanDefinition beanDef = applicationContext.getBeanDefinition(initializerName);
+                       MutablePropertyValues values = beanDef.getPropertyValues();
+                       values.addPropertyValue("omit", omitTermLoading);
+               }
+
+               if (listeners != null) {
+                       for (ApplicationListener listener : listeners) {
+                               applicationContext.addApplicationListener(listener);
+                       }
+               }
+
+               //              String message = "Start application context. This might take a while ...";
+               ////            progressMonitor.subTask(message);
+               //              SubProgressMonitor subMonitor= new SubProgressMonitor(progressMonitor, 10);
+               //              subMonitor.beginTask(message, 2);
+               //              applicationContext.setProgressMonitor(subMonitor);
+
+               applicationContext.refresh(new SubProgressMonitor(progressMonitor, refreshTasks));
+               applicationContext.start();
+               //              progressMonitor.worked(1);
+
+               progressMonitor.subTask("Cleaning up.");
+               setApplicationContext(applicationContext);
+               progressMonitor.worked(1);
+
+               progressMonitor.done();
+               return true;
+       }
+
+
+       /**
+        * Tests if some DefinedTermsAreMissing.
+        *
+        * @return true, if at least one is missing, else false
+        */
+       public boolean testDefinedTermsAreMissing(){
+               UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
+               DefinedTermBase<?> english = this.getTermService().load(englishUuid);
+               if (english == null || !english.getUuid().equals(englishUuid)) {
+                       return true;
+               }
+               else {
+                       return false;
+               }
+       }
+
+
+       /**
+        * Changes the ApplicationContext to the new dataSource
+        *
+        * @param dataSource
+        */
+       public boolean changeDataSource(ICdmDataSource dataSource){
+               //logger.info("Change datasource to : " + dataSource);
+               return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false, null);
+       }
+
+
+       /**
+        * Changes the ApplicationContext to the new dataSource
+        *
+        * @param dataSource
+        * @param dbSchemaValidation
+        */
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){
+               //logger.info("Change datasource to : " + dataSource);
+               return setNewDataSource(dataSource, dbSchemaValidation, false, null);
+       }
+
+
+       /**
+        * Changes the ApplicationContext to the new dataSource
+        *
+        * @param dataSource
+        * @param dbSchemaValidation
+        * @param omitTermLoading
+        */
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){
+               logger.info("Change datasource to : " + dataSource);
+               return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, null);
+       }
+
+
+       /**
+        * Changes the ApplicationContext to the new dataSource
+        *
+        * @param dataSource
+        * @param dbSchemaValidation
+        * @param omitTermLoading
+        */
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,
+                       List<ApplicationListener> listeners){
+               logger.info("Change datasource to : " + dataSource);
+               return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);
+       }
+
+
+       /**
+        * Sets a new application Context.
+        *
+        * @param ac
+        */
+       public void setApplicationContext(AbstractApplicationContext ac){
+               closeApplicationContext(); //closes old application context if necessary
+               applicationContext = ac;
+               applicationContext.registerShutdownHook();
+               init();
+       }
+
+
+       /*
+        * (non-Javadoc)
+        *
+        * @see java.lang.Object#finalize()
+        */
+       @Override
+       public void finalize(){
+               close();
+       }
+
+
+       /**
+        * closes the application
+        */
+       public void close(){
+               closeApplicationContext();
+       }
+
+
+       /**
+        * closes the application context
+        */
+       protected void closeApplicationContext(){
+               if (applicationContext != null) {
+                       logger.info("Close ApplicationContext");
+                       applicationContext.close();
+               }
+       }
+
+
+       protected void init(){
+               logger.debug("Init " + this.getClass().getName() + " ... ");
+               if (logger.isDebugEnabled()) {
+                       for (String beanName : applicationContext.getBeanDefinitionNames()) {
+                               logger.debug(beanName);
+                       }
+               }
+               //TODO delete next row (was just for testing)
+               if (logger.isInfoEnabled()) {
+                       logger.info("Registered Beans: ");
+                       String[] beanNames = applicationContext.getBeanDefinitionNames();
+                       for (String beanName : beanNames) {
+                               logger.info(beanName);
+                       }
+               }
+               configuration = (ICdmApplicationConfiguration) applicationContext.getBean("cdmApplicationDefaultConfiguration");
+               try {
+                       //FIXME:Remoting catching exection to allow for remoting
+                       getDatabaseService().setApplicationController(this);
+               }
+               catch (UnsupportedOperationException uoe) {
+                       logger.warn("getDatabaseService() is not implmented for current application context");
+               }
+       }
+
+
+       /* ****** Services ******** */
+       @Override
+       public final IAnnotationService getAnnotationService(){
+           return configuration.getAnnotationService();
+       }
+
+       @Override
+       public final INameService getNameService(){
+           return configuration.getNameService();
+       }
+
+
+       @Override
+       public final ITaxonService getTaxonService(){
+               return configuration.getTaxonService();
+       }
+
+
+       @Override
+       public final IClassificationService getClassificationService(){
+               return configuration.getClassificationService();
+       }
+
+
+       @Override
+       public final ITaxonNodeService getTaxonNodeService(){
+           return configuration.getTaxonNodeService();
+       }
+
+
+       @Override
+       public final IReferenceService getReferenceService(){
+               return configuration.getReferenceService();
+       }
+
+
+       @Override
+       public final IAgentService getAgentService(){
+               return configuration.getAgentService();
+       }
+
+
+       @Override
+       public final IDatabaseService getDatabaseService(){
+               return configuration.getDatabaseService();
+       }
+
+
+       @Override
+       public final ITermService getTermService(){
+               return configuration.getTermService();
+       }
+
+
+       @Override
+       public final IDescriptionService getDescriptionService(){
+               return configuration.getDescriptionService();
+       }
+
+
+       @Override
+       public final IOccurrenceService getOccurrenceService(){
+               return configuration.getOccurrenceService();
+       }
+
+       @Override
+       public IAmplificationService getAmplificationService(){
+               return configuration.getAmplificationService();
+       }
+
+       @Override
+       public ISequenceService getSequenceService(){
+               return configuration.getSequenceService();
+       }
+
+
+       @Override
+       public final IPrimerService getPrimerService(){
+               return configuration.getPrimerService();
+       }
+
+
+       @Override
+       public final IMediaService getMediaService(){
+               return configuration.getMediaService();
+       }
+
+
+       @Override
+       public final ICommonService getCommonService(){
+               return configuration.getCommonService();
+       }
+
+
+       @Override
+       public final ILocationService getLocationService(){
+               return configuration.getLocationService();
+       }
+
+
+       @Override
+       public final IUserService getUserService(){
+               return configuration.getUserService();
+       }
+
+
+       @Override
+       public final IGrantedAuthorityService getGrantedAuthorityService(){
+               return configuration.getGrantedAuthorityService();
+       }
+
+
+       @Override
+       public IGroupService getGroupService(){
+               return configuration.getGroupService();
+       }
+
+
+       @Override
+       public final ICollectionService getCollectionService(){
+               return configuration.getCollectionService();
+       }
+
+
+       @Override
+       public final IFeatureTreeService getFeatureTreeService(){
+               return configuration.getFeatureTreeService();
+       }
+
+
+       @Override
+       public final IFeatureNodeService getFeatureNodeService(){
+               return configuration.getFeatureNodeService();
+       }
+
+
+       @Override
+       public final IVocabularyService getVocabularyService(){
+               return configuration.getVocabularyService();
+       }
+
+
+       @Override
+       public final IIdentificationKeyService getIdentificationKeyService(){
+               return configuration.getIdentificationKeyService();
+       }
+
+
+       @Override
+       public final IPolytomousKeyService getPolytomousKeyService(){
+               return configuration.getPolytomousKeyService();
+       }
+
+
+       @Override
+       public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){
+               return configuration.getPolytomousKeyNodeService();
+       }
+
+
+       @Override
+       public IEntityValidationService getEntityValidationService(){
+               return configuration.getEntityValidationService();
+       }
+
+
+       @Override
+       public IEntityConstraintViolationService getEntityConstraintViolationService(){
+               return configuration.getEntityConstraintViolationService();
+       }
+
+
+       @Override
+       public final IService<CdmBase> getMainService(){
+               return configuration.getMainService();
+       }
+
+
+       @Override
+       public final IWorkingSetService getWorkingSetService(){
+               return configuration.getWorkingSetService();
+       }
+
+
+       @Override
+       public final ConversationHolder NewConversation(){
+               //return (ConversationHolder)applicationContext.getBean("conversationHolder");
+               return configuration.NewConversation();
+       }
+
+
+       /* **** Security ***** */
+
+       @Override
+       public void authenticate(String username, String password){
+               UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);
+               Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);
+               SecurityContext context = SecurityContextHolder.getContext();
+               context.setAuthentication(authentication);
+       }
+
+       @Override
+       public final ProviderManager getAuthenticationManager(){
+               return configuration.getAuthenticationManager();
+       }
+
+
+       @Override
+       public ICdmPermissionEvaluator getPermissionEvaluator(){
+               return configuration.getPermissionEvaluator();
+       }
+
+
+       /**
+        * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication,
+        *      java.lang.Object, java.lang.Object)
+        *
+        * @param targetDomainObject
+        * @param permission
+        * @return
+        */
+       public boolean currentAuthentiationHasPermissions(CdmBase targetDomainObject, EnumSet<CRUD> permission){
+               SecurityContext context = SecurityContextHolder.getContext();
+               return getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject, permission);
+       }
+
+
+       @Override
+       public final PlatformTransactionManager getTransactionManager(){
+               return configuration.getTransactionManager();
+       }
+
+
+       @Override
+       public final Object getBean(String name){
+               return this.applicationContext.getBean(name);
+       }
+
+
+       /*
+        * OLD TRANSACTION STUFF
+        */
+
+       /* **** flush ********** */
+       public void flush(){
+               SessionFactory sf = (SessionFactory) applicationContext.getBean("sessionFactory");
+               sf.getCurrentSession().flush();
+       }
+
+
+       public SessionFactory getSessionFactory(){
+               return (SessionFactory) applicationContext.getBean("sessionFactory");
+       }
+
+
+       @Override
+       public TransactionStatus startTransaction(){
+               return startTransaction(false);
+       }
+
+
+       @Override
+       public TransactionStatus startTransaction(Boolean readOnly){
+               return configuration.startTransaction(readOnly);
+       }
+
+       @Override
+       public void commitTransaction(TransactionStatus txStatus){
+               PlatformTransactionManager txManager = configuration.getTransactionManager();
+               txManager.commit(txStatus);
+               return;
+       }
+}