From: Cherian Mathew Date: Tue, 26 May 2015 16:18:12 +0000 (+0200) Subject: - corrected recursive autowiring X-Git-Tag: remoting-3.9.0~181 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/6548ea8af7ee37f5a27e70af01e8cc2909e3ab25 - corrected recursive autowiring - changed application context loading to be more performant --- diff --git a/eu.etaxonomy.taxeditor.cdmlib/.classpath b/eu.etaxonomy.taxeditor.cdmlib/.classpath index ac54ad8a8..433df8079 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/.classpath +++ b/eu.etaxonomy.taxeditor.cdmlib/.classpath @@ -128,8 +128,8 @@ - - + + diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteConfiguration.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteConfiguration.java index 20fcb506b..321df5830 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteConfiguration.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteConfiguration.java @@ -13,14 +13,55 @@ import javax.sql.DataSource; import org.apache.log4j.Logger; import org.hibernate.SessionFactory; +import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.orm.hibernate4.HibernateTransactionManager; +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.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; import eu.etaxonomy.cdm.api.conversation.ConversationHolderMock; +import eu.etaxonomy.cdm.api.service.IAgentService; +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.ext.geo.IEditGeoService; +import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator; import eu.etaxonomy.taxeditor.service.ICachedCommonService; import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; @@ -31,22 +72,116 @@ import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; * */ @Component -public class CdmApplicationRemoteConfiguration extends CdmApplicationDefaultConfiguration { +public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfiguration, ApplicationContextAware { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class); + protected ApplicationContext applicationContext; + + @Autowired + //@Qualifier("nameService") + private INameService nameService; + @Autowired + //@Qualifier("taxonService") + private ITaxonService taxonService; + @Autowired + //@Qualifier("classificationService") + private IClassificationService classificationService; + @Autowired + //@Qualifier("referenceService") + private IReferenceService referenceService; + @Autowired + //@Qualifier("agentService") + private IAgentService agentService; + @Autowired + //@Qualifier("databaseService") + private IDatabaseService databaseService; + @Autowired + //@Qualifier("termService") + private ITermService termService; + //@Autowired + private HibernateTransactionManager transactionManager; + @Autowired + //@Qualifier("descriptionService") + private IDescriptionService descriptionService; + @Autowired + //@Qualifier("occurrenceService") + private IOccurrenceService occurrenceService; + @Autowired + //@Qualifier("primerService") + private IPrimerService primerService; + @Autowired + //@Qualifier("amplificationService") + private IAmplificationService amplificationService; + @Autowired + //@Qualifier("sequenceService") + private ISequenceService sequenceService; + @Autowired + //@Qualifier("mediaService") + private IMediaService mediaService; + @Autowired + //@Qualifier("commonService") + private ICommonService commonService; + @Autowired + private ILocationService locationService; + //@Autowired + private SessionFactory sessionFactory; + //@Autowired + private DataSource dataSource; + @Autowired + private ProviderManager authenticationManager; + @Autowired + private IUserService userService; + @Autowired + private IGrantedAuthorityService grantedAuthorityService; + @Autowired + private IGroupService groupService; + @Autowired + private ICollectionService collectionService; + @Autowired + private IFeatureTreeService featureTreeService; + @Autowired + private IFeatureNodeService featureNodeService; + @Autowired + private IVocabularyService vocabularyService; @Autowired - IEditGeoService editGeoService; + private ITaxonNodeService taxonNodeService; + @Autowired + private IIdentificationKeyService identificationKeyService; + @Autowired + private IPolytomousKeyService polytomousKeyService; + @Autowired + private IPolytomousKeyNodeService polytomousKeyNodeService; + @Autowired + private IEntityValidationService entityValidationService; + @Autowired + private IEntityConstraintViolationService entityConstraintViolationService; + @Autowired + private ICdmPermissionEvaluator permissionEvaluator; + + + @Autowired + private IEditGeoService editGeoService; @Autowired private ICachedCommonService cachedCommonService; + @Autowired + private IWorkingSetService workingSetService; @Autowired protected ICdmEntitySessionManager cdmEntitySessionManager; - public CdmApplicationRemoteConfiguration() { + private IService mainService; + + public CdmApplicationRemoteConfiguration() {} + + // ****************************** APPLICATION CONTEXT *************************************************/ + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{ + this.applicationContext = applicationContext; } /* (non-Javadoc) @@ -58,77 +193,230 @@ public class CdmApplicationRemoteConfiguration extends CdmApplicationDefaultConf } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#startTransaction() + + /** + * @return + */ + public IEditGeoService getEditGeoService() { + return this.editGeoService; + } + + /** + * @return */ + public ICachedCommonService getCachedCommonService(){ + return this.cachedCommonService; + } + + + public ICdmEntitySessionManager getCdmEntitySessionManager() { + return this.cdmEntitySessionManager; + } + + + + + + + // ****************************** GETTER *************************************************/ + @Override - public TransactionStatus startTransaction() throws UnsupportedOperationException { - throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration"); + public final Object getBean(String name){ + return this.applicationContext.getBean(name); } + @Override + public IAgentService getAgentService(){ + return this.agentService; + } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#startTransaction() - */ @Override - public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException { - throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration"); + public IDatabaseService getDatabaseService(){ + return this.databaseService; } + @Override + public INameService getNameService(){ + return this.nameService; + } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#commitTransaction(org.springframework.transaction.TransactionStatus) - */ @Override - public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException { - throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration"); + public IReferenceService getReferenceService(){ + return this.referenceService; + } + + @Override + public ITaxonService getTaxonService(){ + return this.taxonService; + } + + @Override + public IClassificationService getClassificationService(){ + return this.classificationService; + } + + @Override + public ITaxonNodeService getTaxonNodeService(){ + return this.taxonNodeService; + } + + @Override + public IDescriptionService getDescriptionService(){ + return this.descriptionService; + } + + @Override + public IOccurrenceService getOccurrenceService(){ + return this.occurrenceService; } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#NewConversation() - */ + @Override + public IPrimerService getPrimerService(){ + return this.primerService; + } + + @Override + public IAmplificationService getAmplificationService(){ + return this.amplificationService; + } + + @Override + public ISequenceService getSequenceService(){ + return this.sequenceService; + } + + @Override + public IMediaService getMediaService(){ + return this.mediaService; + } + + @Override + public ITermService getTermService(){ + return this.termService; + } + + @Override + public ICommonService getCommonService(){ + return this.commonService; + } + + @Override + public ILocationService getLocationService(){ + return this.locationService; + } + + @Override + public IUserService getUserService(){ + return this.userService; + } + + @Override + public IGrantedAuthorityService getGrantedAuthorityService(){ + return this.grantedAuthorityService; + } + + @Override + public IService getMainService(){ + return this.mainService; + } + + + @Override + public ProviderManager getAuthenticationManager(){ + return this.authenticationManager; + } + + @Override public ConversationHolder NewConversation() { return new ConversationHolderMock(); } - /** - * @return - */ - public IEditGeoService getEditGeoService() { - return this.editGeoService; + @Override + public ICollectionService getCollectionService(){ + return collectionService; } - /** - * @return - */ - public ICachedCommonService getCachedCommonService(){ - return this.cachedCommonService; + @Override + public IFeatureTreeService getFeatureTreeService(){ + return featureTreeService; } + @Override + public IFeatureNodeService getFeatureNodeService(){ + return featureNodeService; + } - public ICdmEntitySessionManager getCdmEntitySessionManager() { - return this.cdmEntitySessionManager; + @Override + public IVocabularyService getVocabularyService(){ + return vocabularyService; } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#setDataSource(javax.sql.DataSource) - */ @Override - public void setDataSource(DataSource dataSource) { + public IIdentificationKeyService getIdentificationKeyService(){ + return identificationKeyService; } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#setTransactionManager(org.springframework.transaction.PlatformTransactionManager) - */ @Override - public void setTransactionManager(PlatformTransactionManager transactionManager) { + public IPolytomousKeyService getPolytomousKeyService(){ + return polytomousKeyService; + } + + + @Override + public IPolytomousKeyNodeService getPolytomousKeyNodeService(){ + return polytomousKeyNodeService; + } + + @Override + public IWorkingSetService getWorkingSetService(){ + return workingSetService; + } + + @Override + public IGroupService getGroupService(){ + return groupService; + } + + + @Override + public IEntityValidationService getEntityValidationService(){ + return entityValidationService; + } + + + @Override + public IEntityConstraintViolationService getEntityConstraintViolationService(){ + return entityConstraintViolationService; + } + + @Override + public ICdmPermissionEvaluator getPermissionEvaluator(){ + return permissionEvaluator; + } + + + @Override + public TransactionStatus startTransaction() throws UnsupportedOperationException { + throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration"); + } + + @Override + public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException { + throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration"); + } + + + @Override + public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException { + throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration"); } - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#setSessionFactory(org.hibernate.SessionFactory) - */ @Override - public void setSessionFactory(SessionFactory sessionFactory) { + 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); } } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteController.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteController.java index f3abb5b7d..7254c2de1 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteController.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationRemoteController.java @@ -1,11 +1,11 @@ /** -* Copyright (C) 2014 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. -*/ + * Copyright (C) 2014 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; @@ -16,23 +16,17 @@ import java.util.Properties; import org.apache.log4j.Logger; import org.hibernate.collection.internal.AbstractPersistentCollection; import org.hibernate.proxy.AbstractLazyInitializer; -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.GenericApplicationContext; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import eu.etaxonomy.cdm.api.application.CdmApplicationController; -import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration; -import eu.etaxonomy.cdm.api.application.RemotingMonitoredGenericApplicationContext; import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; import eu.etaxonomy.cdm.common.monitor.NullProgressMonitor; -import eu.etaxonomy.cdm.common.monitor.SubProgressMonitor; import eu.etaxonomy.taxeditor.remoting.cache.CdmModelCacher; import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource; -import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager; import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; /** @@ -47,13 +41,13 @@ public class CdmApplicationRemoteController extends CdmApplicationController { private static final Logger logger = Logger.getLogger(CdmApplicationRemoteController.class); - + public static final Resource DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE = - new ClassPathResource("/eu/etaxonomy/cdm/remotingApplicationContext.xml"); + new ClassPathResource("/eu/etaxonomy/cdm/remotingApplicationContext.xml"); private final Resource applicationContextResource; private final IProgressMonitor progressMonitor; - + /** * Creates new instance of CdmApplicationRemoteController * @@ -65,15 +59,15 @@ public class CdmApplicationRemoteController extends CdmApplicationController { * @return */ public static CdmApplicationRemoteController NewInstance(Resource applicationContextResource, - ICdmRemoteSource remoteSource, - boolean omitTermLoading, - IProgressMonitor progressMonitor, - List listeners) { - return new CdmApplicationRemoteController(applicationContextResource, - remoteSource, - omitTermLoading, - progressMonitor, - listeners); + ICdmRemoteSource remoteSource, + boolean omitTermLoading, + IProgressMonitor progressMonitor, + List listeners) { + return new CdmApplicationRemoteController(applicationContextResource, + remoteSource, + omitTermLoading, + progressMonitor, + listeners); } /** @@ -87,40 +81,40 @@ public class CdmApplicationRemoteController extends CdmApplicationController { * @return */ public static CdmApplicationRemoteController NewInstance(ICdmRemoteSource remoteSource, - boolean omitTermLoading, - IProgressMonitor progressMonitor, - List listeners) { + boolean omitTermLoading, + IProgressMonitor progressMonitor, + List listeners) { - return new CdmApplicationRemoteController(DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE, - remoteSource, - omitTermLoading, - progressMonitor, - listeners); + return new CdmApplicationRemoteController(DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE, + remoteSource, + omitTermLoading, + progressMonitor, + listeners); } - /** - * Constructs CdmApplicationRemoteController - * - * @param applicationContextResource - * @param remoteSource - * @param omitTermLoading - * @param progressMonitor - * @param listeners - */ - private CdmApplicationRemoteController(Resource applicationContextResource, - ICdmRemoteSource remoteSource, - boolean omitTermLoading, - IProgressMonitor progressMonitor, - List listeners){ - logger.info("Start CdmApplicationRemoteController with remote source: " + remoteSource.getName()); + /** + * Constructs CdmApplicationRemoteController + * + * @param applicationContextResource + * @param remoteSource + * @param omitTermLoading + * @param progressMonitor + * @param listeners + */ + private CdmApplicationRemoteController(Resource applicationContextResource, + ICdmRemoteSource remoteSource, + boolean omitTermLoading, + IProgressMonitor progressMonitor, + List listeners){ + logger.info("Start CdmApplicationRemoteController with remote source: " + remoteSource.getName()); this.applicationContextResource = - applicationContextResource != null ? applicationContextResource : DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE; + applicationContextResource != null ? applicationContextResource : DEFAULT_REMOTE_APPLICATION_CONTEXT_RESOURCE; this.progressMonitor = progressMonitor != null ? progressMonitor : new NullProgressMonitor(); setNewRemoteSource(remoteSource, omitTermLoading, listeners); - } + } @@ -134,18 +128,15 @@ public class CdmApplicationRemoteController extends CdmApplicationController { * @return */ protected boolean setNewRemoteSource(ICdmRemoteSource remoteSource, - boolean omitTermLoading, - List listeners){ + boolean omitTermLoading, + List listeners){ logger.info("Connecting to '" + remoteSource.getName() + "'"); - RemotingMonitoredGenericApplicationContext applicationContext = new RemotingMonitoredGenericApplicationContext(); - int refreshTasks = 45; - int nTasks = 5 + refreshTasks; + GenericApplicationContext applicationContext + = generateApplicationContext(applicationContextResource, listeners, progressMonitor, false); - progressMonitor.beginTask("Connecting to '" + remoteSource.getName() + "'", nTasks); - progressMonitor.subTask("Registering remote source."); PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer(); Properties properties = new Properties(); properties.setProperty("remoteServer", remoteSource.getServer()); @@ -153,39 +144,46 @@ public class CdmApplicationRemoteController extends CdmApplicationController { properties.setProperty("remoteContext", remoteSource.getContextPath()); pspc.setProperties(properties); applicationContext.addBeanFactoryPostProcessor(pspc); + //progressMonitor.beginTask("Connecting to '" + remoteSource.getName() + "'", nTasks); + applicationContext.refresh(); + applicationContext.start(); + + + progressMonitor.subTask("Cleaning up."); + setApplicationContext(applicationContext); + progressMonitor.worked(1); + + progressMonitor.done(); + return true; + } + + public static GenericApplicationContext generateApplicationContext(Resource applicationContextResource, + List listeners, + IProgressMonitor progressMonitor, + boolean validateXml) { + RemotingMonitoredGenericApplicationContext applicationContext = new RemotingMonitoredGenericApplicationContext(); + int refreshTasks = 45; + int nTasks = 5 + refreshTasks; + + progressMonitor.subTask("Registering remote source."); applicationContext.getEnvironment().setActiveProfiles("remoting"); progressMonitor.worked(1); XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(applicationContext); - //xmlReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE); + if(!validateXml) { + xmlReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE); + } 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); } } - - applicationContext.refresh(new SubProgressMonitor(progressMonitor, refreshTasks)); - applicationContext.start(); - - progressMonitor.subTask("Cleaning up."); - setApplicationContext(applicationContext); - progressMonitor.worked(1); - - progressMonitor.done(); - return true; + return applicationContext; } /* (non-Javadoc) @@ -194,15 +192,15 @@ public class CdmApplicationRemoteController extends CdmApplicationController { @Override protected void init(){ configuration = (ICdmApplicationConfiguration)applicationContext.getBean("cdmApplicationRemoteConfiguration"); - AbstractLazyInitializer.setConfiguration((CdmApplicationRemoteConfiguration)configuration); - AbstractPersistentCollection.setConfiguration((CdmApplicationRemoteConfiguration)configuration); - - CdmModelCacher cmdmc = new CdmModelCacher(); - cmdmc.cacheGetterFields(); + AbstractLazyInitializer.setConfiguration((CdmApplicationRemoteConfiguration)configuration); + AbstractPersistentCollection.setConfiguration((CdmApplicationRemoteConfiguration)configuration); + + CdmModelCacher cmdmc = new CdmModelCacher(); + cmdmc.cacheGetterFields(); } public ICdmEntitySessionManager getCdmEntitySessionManager() { - return ((CdmApplicationRemoteConfiguration)configuration).getCdmEntitySessionManager(); + return ((CdmApplicationRemoteConfiguration)configuration).getCdmEntitySessionManager(); } } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredGenericApplicationContext.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredGenericApplicationContext.java index 6ad7ad418..be7b3b215 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredGenericApplicationContext.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredGenericApplicationContext.java @@ -9,32 +9,28 @@ */ package eu.etaxonomy.cdm.api.application; -import java.util.concurrent.CancellationException; +import java.io.Serializable; import org.apache.log4j.Logger; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; -import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; -import eu.etaxonomy.cdm.common.monitor.SubProgressMonitor; - /** * {@link GenericApplicationContext Generic application context} which allows progress monitoring. * @author a.mueller * @date 29.09.2011 * */ -public class RemotingMonitoredGenericApplicationContext extends GenericApplicationContext{ +public class RemotingMonitoredGenericApplicationContext extends GenericApplicationContext implements Serializable { @SuppressWarnings("unused") - private static final Logger logger = Logger.getLogger(CdmApplicationController.class); + private static final Logger logger = Logger.getLogger(RemotingMonitoredGenericApplicationContext.class); final int countInvokeBeanFactoryPostProcessors = 10; final int countFinishBeanFactoryInitialization = 90; private final int countTasks = countInvokeBeanFactoryPostProcessors + countFinishBeanFactoryInitialization; - private IProgressMonitor currentMonitor; + // private IProgressMonitor currentMonitor; @@ -42,98 +38,111 @@ public class RemotingMonitoredGenericApplicationContext extends GenericApplicati * Constructor. * @param progressMonitor */ +// public RemotingMonitoredGenericApplicationContext() { +//// MonitoredListableBeanFactory beanFactory = +// super(new RemotingMonitoredListableBeanFactory()); +// //taken from empty constructor of GenericApplicationContext +// ((RemotingMonitoredListableBeanFactory)getBeanFactory()).setSerializationId(getId()); +// ((RemotingMonitoredListableBeanFactory)getBeanFactory()).setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer()); +// ((RemotingMonitoredListableBeanFactory)getBeanFactory()).setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver()); +// } + public RemotingMonitoredGenericApplicationContext() { -// MonitoredListableBeanFactory beanFactory = - super(new RemotingMonitoredListableBeanFactory()); +// MonitoredListableBeanFactory beanFactory = + super(); //taken from empty constructor of GenericApplicationContext - ((RemotingMonitoredListableBeanFactory)getBeanFactory()).setSerializationId(getId()); - ((RemotingMonitoredListableBeanFactory)getBeanFactory()).setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer()); - ((RemotingMonitoredListableBeanFactory)getBeanFactory()).setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver()); + ((DefaultListableBeanFactory)getBeanFactory()).setSerializationId(getId()); + ((DefaultListableBeanFactory)getBeanFactory()).setParameterNameDiscoverer(new LocalVariableTableParameterNameDiscoverer()); + ((DefaultListableBeanFactory)getBeanFactory()).setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver()); } - public int countTasks(){ - return countTasks; - } - - protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory){ - String task = "Invoke bean factory post processors"; - checkMonitorCancelled(currentMonitor); - currentMonitor.subTask(task); - super.invokeBeanFactoryPostProcessors(beanFactory); - currentMonitor.worked(countInvokeBeanFactoryPostProcessors); - checkMonitorCancelled(currentMonitor); - } +// public int countTasks(){ +// return countTasks; +// } +// +// @Override +// protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory){ +// String task = "Invoke bean factory post processors"; +//// checkMonitorCancelled(currentMonitor); +//// currentMonitor.subTask(task); +// super.invokeBeanFactoryPostProcessors(beanFactory); +//// currentMonitor.worked(countInvokeBeanFactoryPostProcessors); +//// checkMonitorCancelled(currentMonitor); +// } +// +// @Override +// protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory){ +//// checkMonitorCancelled(currentMonitor); +// String task = "Finish bean factory initialization"; +//// currentMonitor.subTask(task); +//// IProgressMonitor subMonitor = new SubProgressMonitor(currentMonitor, countFinishBeanFactoryInitialization); +//// getMyBeanFactory().setCurrentMonitor(subMonitor); +// super.finishBeanFactoryInitialization(beanFactory); +//// checkMonitorCancelled(currentMonitor); +// +// } + +// /** +// * @param progressMonitor the progressMonitor to set +// */ +// public void setCurrentMonitor(IProgressMonitor monitor) { +//// this.currentMonitor = monitor; +// } +// +// /** +// * +// */ +// public IProgressMonitor getCurrentMonitor() { +//// return currentMonitor; +// return null; +// } + + +// /* (non-Javadoc) +// * @see org.springframework.context.support.AbstractApplicationContext#refresh() +// */ +// @Override +// public void refresh() throws BeansException, IllegalStateException { +// //checkMonitorCancelled(monitor); +// String message = "Refresh application context. This might take a while ..."; +//// currentMonitor = monitor; +// beginTask(message, countTasks); +// super.refresh(); +// taskDone(); +// //checkMonitorCancelled(monitor); +// } - protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory){ - checkMonitorCancelled(currentMonitor); - String task = "Finish bean factory initialization"; - currentMonitor.subTask(task); - IProgressMonitor subMonitor = new SubProgressMonitor(currentMonitor, countFinishBeanFactoryInitialization); - getMyBeanFactory().setCurrentMonitor(subMonitor); - super.finishBeanFactoryInitialization(beanFactory); - checkMonitorCancelled(currentMonitor); - - } - - /** - * @param progressMonitor the progressMonitor to set - */ - public void setCurrentMonitor(IProgressMonitor monitor) { - this.currentMonitor = monitor; - } /** * */ - public IProgressMonitor getCurrentMonitor() { - return currentMonitor; - } - - - /* (non-Javadoc) - * @see org.springframework.context.support.AbstractApplicationContext#refresh() - */ - public void refresh(IProgressMonitor monitor) throws BeansException, IllegalStateException { - checkMonitorCancelled(monitor); - String message = "Refresh application context. This might take a while ..."; - currentMonitor = monitor; - beginTask(message, countTasks); - super.refresh(); - taskDone(); - checkMonitorCancelled(monitor); - } - - - /** - * - */ - private void taskDone() { - if (currentMonitor != null){ - currentMonitor.done(); - } - } - - - /** - * @param monitor - * @param message - */ - private void beginTask(String message, int countTasks) { - if (currentMonitor != null){ - currentMonitor.beginTask(message, countTasks); - } - } - - - private RemotingMonitoredListableBeanFactory getMyBeanFactory(){ - return (RemotingMonitoredListableBeanFactory)getBeanFactory(); - } - - - private void checkMonitorCancelled(IProgressMonitor monitor) { - if (monitor != null && monitor.isCanceled()){ - throw new CancellationException(); - } - } +// private void taskDone() { +//// if (currentMonitor != null){ +//// currentMonitor.done(); +//// } +// } + + +// /** +// * @param monitor +// * @param message +// */ +// private void beginTask(String message, int countTasks) { +//// if (currentMonitor != null){ +//// currentMonitor.beginTask(message, countTasks); +//// } +// } + + +// private RemotingMonitoredListableBeanFactory getMyBeanFactory(){ +// return (RemotingMonitoredListableBeanFactory)getBeanFactory(); +// } +// +// +// private void checkMonitorCancelled(IProgressMonitor monitor) { +// if (monitor != null && monitor.isCanceled()){ +// throw new CancellationException(); +// } +// } } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredListableBeanFactory.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredListableBeanFactory.java index 4e03ea4d8..ba85fb5ea 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredListableBeanFactory.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/RemotingMonitoredListableBeanFactory.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2009 EDIT -* European Distributed Institute of Taxonomy +* 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. */ @@ -30,21 +30,21 @@ import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; public class RemotingMonitoredListableBeanFactory extends DefaultListableBeanFactory { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(RemotingMonitoredListableBeanFactory.class); - + private boolean isInitializingBeans = false; private IProgressMonitor currentMonitor; - + private static List beansToMonitor = Arrays.asList("sessionFactory","defaultBeanInitializer","persistentTermInitializer"); - private Set alreadyMonitoredBeans = new HashSet(); + private final Set alreadyMonitoredBeans = new HashSet(); public RemotingMonitoredListableBeanFactory(){ } - + // @Override // protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException { // if (registeredBeanNames.contains(beanName)){ // return super.getMergedLocalBeanDefinition(beanName); -// +// // } //// String message = "Handle bean '%s'"; //// message = String.format(message, beanName); @@ -54,8 +54,9 @@ public class RemotingMonitoredListableBeanFactory extends DefaultListableBeanFac //// registeredBeanNames.add(beanName); // return result; // } - - public void preInstantiateSingletons() throws BeansException { + + @Override + public void preInstantiateSingletons() throws BeansException { isInitializingBeans = true; checkMonitorCancelled(currentMonitor); int countBeans = 0; @@ -86,8 +87,9 @@ public class RemotingMonitoredListableBeanFactory extends DefaultListableBeanFac // } // return result; // } - - protected Object createBean(final String name, final RootBeanDefinition mbd, final Object[] args){ + + @Override + protected Object createBean(final String name, final RootBeanDefinition mbd, final Object[] args){ boolean doMonitor = isInitializingBeans && beansToMonitor.contains(name) && !alreadyMonitoredBeans.contains(name); checkMonitorCancelled(currentMonitor); if (doMonitor){ @@ -111,18 +113,18 @@ public class RemotingMonitoredListableBeanFactory extends DefaultListableBeanFac return result; } - + /** * @param mainMonitor the mainMonitor to set */ public void setCurrentMonitor(IProgressMonitor monitor) { this.currentMonitor = monitor; } - + private void checkMonitorCancelled(IProgressMonitor monitor) { if (monitor != null && monitor.isCanceled()){ throw new CancellationException(); - } + } } - + } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java index 96c94964c..e7dc0e7d5 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/cache/CdmServiceCacher.java @@ -16,8 +16,9 @@ import eu.etaxonomy.taxeditor.remoting.cache.CdmEntityCacheKey; import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher; import eu.etaxonomy.taxeditor.service.TermServiceRequestExecutor; import eu.etaxonomy.taxeditor.session.CdmEntitySession; -import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager; import eu.etaxonomy.taxeditor.session.ICdmEntitySession; +import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager; +import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver; /** * Class which uses CDM services to cache cdm entities @@ -31,13 +32,13 @@ import eu.etaxonomy.taxeditor.session.ICdmEntitySession; * @param */ @Component -public class CdmServiceCacher extends CdmCacher { +public class CdmServiceCacher extends CdmCacher implements ICdmEntitySessionManagerObserver { @Autowired ITermService termService; - @Autowired - private CdmEntitySessionManager cdmEntitySessionManager; + + private ICdmEntitySessionManager cdmEntitySessionManager; private CdmTransientEntityCacher cdmTransientEntityCacher; @@ -85,12 +86,20 @@ public class CdmServiceCacher extends CdmCacher { return false; } - public void setActiveSession(ICdmEntitySession cdmEntitySession) { + + public void setCdmEntitySessionManager(ICdmEntitySessionManager cdmEntitySessionManager) { + this.cdmEntitySessionManager = cdmEntitySessionManager; + if(cdmEntitySessionManager != null) { + cdmEntitySessionManager.addSessionObserver(this); + } + } + + public CdmTransientEntityCacher getCurrentCacher() { + ICdmEntitySession cdmEntitySession = cdmEntitySessionManager.getActiveSession(); if(cdmEntitySession != null && cdmEntitySession instanceof CdmEntitySession) { - this.cdmTransientEntityCacher = ((CdmEntitySession) cdmEntitySession).getCacher(); - } else { - this.cdmTransientEntityCacher = null; + return ((CdmEntitySession) cdmEntitySession).getCacher(); } + return null; } @Override @@ -122,5 +131,18 @@ public class CdmServiceCacher extends CdmCacher { return cachedCdmEntity; } + /* (non-Javadoc) + * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver#changed() + */ + @Override + public void changed() { + ICdmEntitySession cdmEntitySession = cdmEntitySessionManager.getActiveSession(); + if(cdmEntitySession != null && cdmEntitySession instanceof CdmEntitySession) { + this.cdmTransientEntityCacher = ((CdmEntitySession) cdmEntitySession).getCacher(); + } else { + this.cdmTransientEntityCacher = null; + } + } + } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmModelCacher.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmModelCacher.java index 2f3d49be6..355fb0d66 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmModelCacher.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmModelCacher.java @@ -74,9 +74,8 @@ public class CdmModelCacher { String mappedClassName = mappedClass.getName(); CdmModelFieldPropertyFromClass cmgmfc = new CdmModelFieldPropertyFromClass(mappedClassName); - addGetters(persistentClass, cmgmfc); logger.info("Adding class : " + mappedClassName + " to cache"); - + addGetters(persistentClass, cmgmfc); cache.put(new Element(mappedClassName, cmgmfc)); } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java index e3f6b7b42..e5a50fed3 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java @@ -191,7 +191,7 @@ public class CdmEntitySession implements ICdmEntitySession { public void bind() { logger.info("Binding session with owner " + sessionOwner.toString()); cdmEntitySessionManager.bind(sessionOwner); - cdmEntitySessionManager.notifyObservers(); + } /* (non-Javadoc) diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java index 5e43249ff..538f4df32 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java @@ -18,10 +18,8 @@ import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import eu.etaxonomy.cdm.api.cache.CdmServiceCacher; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType; @@ -41,8 +39,7 @@ public class CdmEntitySessionManager implements ICdmEntitySessionManager { private ICdmEntitySession activeSession; - @Autowired - private CdmServiceCacher cdmServiceCacher; + @Override public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) { @@ -68,7 +65,7 @@ public class CdmEntitySessionManager implements ICdmEntitySessionManager { private void setActiveSession(ICdmEntitySession activeSession) { this.activeSession = activeSession; - cdmServiceCacher.setActiveSession(activeSession); + notifyObservers(); } diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/httpInvokerServiceClients.xml b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/httpInvokerServiceClients.xml index a2b0a513e..0927154ea 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/httpInvokerServiceClients.xml +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/httpInvokerServiceClients.xml @@ -1,5 +1,5 @@ - http://${remoteServer}:${remotePort}/${remoteContext}/remoting/authenticationManager.service diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remotingApplicationContext.xml b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remotingApplicationContext.xml index 2556cbdc0..47f6b6e3b 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remotingApplicationContext.xml +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remotingApplicationContext.xml @@ -1,48 +1,104 @@ - + - + - + - - - + + - - - - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remoting_services_security.xml b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remoting_services_security.xml index 6a09db422..ed2349942 100644 --- a/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remoting_services_security.xml +++ b/eu.etaxonomy.taxeditor.cdmlib/src/main/resources/eu/etaxonomy/cdm/remoting_services_security.xml @@ -15,17 +15,17 @@ security specific configuration ====================================================================== --> - - - + + + - - - + + + @@ -53,10 +53,10 @@ the key must match FirstDataInserter.RUN_AS_KEY --> - - - + + + + diff --git a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/application/CdmApplicationRemoteControllerTest.java b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/application/CdmApplicationRemoteControllerTest.java new file mode 100644 index 000000000..aa1309396 --- /dev/null +++ b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/application/CdmApplicationRemoteControllerTest.java @@ -0,0 +1,22 @@ +// $Id$ +/** +* Copyright (C) 2015 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.taxeditor.application; + +/** + * @author cmathew + * @date 26 May 2015 + * + */ +public class CdmApplicationRemoteControllerTest { + + + + +}