#5207 Add validation of credentials on target server before starting application...
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationRemoteConfiguration.java
index 690972c10e43cd93515da517235275b1f14c89a2..47757c9863f8fc05198f383250ff08ddeeb690a9 100644 (file)
-// $Id: CdmApplicationDefaultConfiguration.java 11680 2011-04-04 17:07:39Z a.mueller $\r
 /**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
+ * Copyright (C) 2014 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 javax.sql.DataSource;\r
-\r
-import org.hibernate.SessionFactory;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.beans.BeansException;\r
+import org.springframework.context.ApplicationContext;\r
+import org.springframework.context.ApplicationContextAware;\r
+import org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor;\r
+import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean;\r
+import org.springframework.security.access.AccessDecisionVoter;\r
+import org.springframework.security.authentication.AuthenticationProvider;\r
+import org.springframework.security.authentication.ProviderManager;\r
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\r
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;\r
+import org.springframework.security.authentication.dao.ReflectionSaltSource;\r
+import org.springframework.security.authentication.encoding.Md5PasswordEncoder;\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.stereotype.Component;\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.conversation.ConversationHolderMock;\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.IMetadataService;\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.IProgressMonitorService;\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.ITestService;\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.ext.geo.IEditGeoService;\r
+import eu.etaxonomy.cdm.io.service.IIOService;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.CdmPermissionEvaluator;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.UnanimousBasedUnrevokable;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionBaseVoter;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.DescriptionElementVoter;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.GrantAlwaysVoter;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonBaseVoter;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.voter.TaxonNodeVoter;\r
+import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;\r
+import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;\r
+import eu.etaxonomy.taxeditor.service.CdmAuthenticatedHttpInvokerRequestExecutor;\r
+import eu.etaxonomy.taxeditor.service.CdmServiceRequestExecutor;\r
+import eu.etaxonomy.taxeditor.service.ICachedCommonService;\r
+import eu.etaxonomy.taxeditor.service.TermServiceRequestExecutor;\r
+import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;\r
+import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;\r
+\r
 \r
 /**\r
- * @author a.mueller\r
- * @created 21.05.2008\r
- * @version 1.0\r
- */\r
-/**\r
- * @author a.mueller\r
- * @author j.koch\r
+ * CDM Application Configuration class which manages the configuration for remoting\r
+ * clients\r
+ *\r
  */\r
-// FIXME:Remoting This bean naming is a hack to make remoting work, in conjunction with the\r
-// exclude filter in the application package set in the remotingApplicationContext \r
-//@Component("cdmApplicationDefaultConfiguration")\r
-public class CdmApplicationRemoteConfiguration extends CdmApplicationDefaultConfiguration {\r
-       \r
-       @SuppressWarnings("unused")\r
-       private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);\r
-\r
-       @Autowired\r
-       IEditGeoService editGeoService;\r
-       \r
-       public CdmApplicationRemoteConfiguration() {\r
-       }\r
-       \r
-       @Override\r
-       public IDatabaseService getDatabaseService() throws UnsupportedOperationException {\r
-               throw new UnsupportedOperationException("getDatabaseService is not implemented for CdmApplicationRemoteConfiguration");\r
-       }\r
-\r
-       \r
-    @Override\r
-    public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {\r
-               throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");\r
-       }\r
+@Component\r
+public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfiguration, ApplicationContextAware  {\r
+\r
+    @SuppressWarnings("unused")\r
+    private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);\r
+\r
+    protected ApplicationContext applicationContext;\r
+\r
+    private ICdmRemoteSource remoteSource;\r
+\r
+    private Map serviceMap = new HashMap<Class<IService>, IService>();\r
+\r
+    private ICdmEntitySessionManager cdmEntitySessionManager;\r
+\r
+    private CdmPermissionEvaluator cdmPermissionEvaluator;\r
+\r
+    private ProviderManager authenticationManager;\r
+\r
+    private ICachedCommonService cachedCommonService;\r
+\r
+    public CdmApplicationRemoteConfiguration() {}\r
+\r
+    public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {\r
+        this.remoteSource = remoteSource;\r
+\r
+    }\r
+\r
+    public void setRemoteSource(ICdmRemoteSource remoteSource) {\r
+        this.remoteSource = remoteSource;\r
+    }\r
+\r
+    private Object getService(Class<?> clazz, String serviceSuffix, CommonsHttpInvokerRequestExecutor executor) {\r
+        if(serviceMap.containsKey(clazz)) {\r
+            return serviceMap.get(clazz);\r
+        }\r
+        Object service = getService(clazz, serviceSuffix, remoteSource, executor);\r
+        serviceMap.put(clazz,  service);\r
+        return service;\r
+    }\r
+\r
+    public static Object getService(Class<?> clazz,\r
+            String serviceSuffix,\r
+            ICdmRemoteSource remoteSource,\r
+            CommonsHttpInvokerRequestExecutor executor) {\r
 \r
+        String baseUrl;\r
+        if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {\r
+            baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());\r
+        } else {\r
+            baseUrl = "http://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();\r
+        }\r
+        HttpInvokerProxyFactoryBean proxy = new HttpInvokerProxyFactoryBean();\r
+        proxy.setServiceInterface(clazz);\r
+        proxy.setServiceUrl(baseUrl + serviceSuffix);\r
+        if(executor != null) {\r
+            executor.setReadTimeout(0);\r
+            proxy.setHttpInvokerRequestExecutor(executor);\r
+        }\r
+        proxy.afterPropertiesSet();\r
+        return proxy.getObject();\r
+    }\r
+\r
+    // ****************************** APPLICATION CONTEXT *************************************************/\r
+\r
+    @Override\r
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{\r
+        this.applicationContext = applicationContext;\r
+    }\r
 \r
     /* (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#startTransaction()\r
+     * @see eu.etaxonomy.cdm.api.application.CdmApplicationDefaultConfiguration#getTransactionManager()\r
      */\r
     @Override\r
-    public TransactionStatus startTransaction() throws UnsupportedOperationException {\r
-               throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");\r
-       }\r
+    public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {\r
+        throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");\r
+    }\r
 \r
 \r
-    /* (non-Javadoc)\r
-     * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#startTransaction()\r
+\r
+    /**\r
+     * @return\r
+     */\r
+    public IEditGeoService getEditGeoService() {\r
+        return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    /**\r
+     * @return\r
      */\r
+    public ICachedCommonService getCachedCommonService(){\r
+        if(cachedCommonService == null) {\r
+            cachedCommonService = new CachedCommonServiceImpl();\r
+        }\r
+        return cachedCommonService;\r
+    }\r
+\r
+\r
+    public ICdmEntitySessionManager getCdmEntitySessionManager() {\r
+        if(cdmEntitySessionManager == null) {\r
+            cdmEntitySessionManager = new CdmEntitySessionManager();\r
+        }\r
+        return cdmEntitySessionManager;\r
+    }\r
+\r
+\r
+\r
+\r
+\r
+\r
+ // ****************************** GETTER *************************************************/\r
+\r
+    @Override\r
+    public final Object getBean(String name){\r
+        throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");\r
+    }\r
+\r
+    @Override\r
+    public IAgentService getAgentService(){\r
+        return (IAgentService) getService(IAgentService.class, "/remoting/agent.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IAnnotationService getAnnotationService(){\r
+        return (IAnnotationService) getService(IAnnotationService.class, "/remoting/annotation.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IDatabaseService getDatabaseService(){\r
+        return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public INameService getNameService(){\r
+        return (INameService) getService(INameService.class, "/remoting/name.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IReferenceService getReferenceService(){\r
+        return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public ITaxonService getTaxonService(){\r
+        return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IClassificationService getClassificationService(){\r
+        return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public ITaxonNodeService getTaxonNodeService(){\r
+        return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IDescriptionService getDescriptionService(){\r
+        return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IOccurrenceService getOccurrenceService(){\r
+        return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IPrimerService getPrimerService(){\r
+        return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IAmplificationService getAmplificationService(){\r
+        return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public ISequenceService getSequenceService(){\r
+        return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IMediaService getMediaService(){\r
+        return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public ITermService getTermService(){\r
+        return (ITermService) getService(ITermService.class, "/remoting/term.service", new TermServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public ICommonService getCommonService(){\r
+        return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public ILocationService getLocationService(){\r
+        return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IUserService getUserService(){\r
+        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+\r
+    public static IUserService getUserService(ICdmRemoteSource remoteSource) {\r
+        return (IUserService) getService(IUserService.class, "/remoting-public/user.service", remoteSource, new CommonsHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IMetadataService getMetadataService() {\r
+        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", new CommonsHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    public static IMetadataService getMetadataService(ICdmRemoteSource remoteSource) {\r
+        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", remoteSource, new CommonsHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IGrantedAuthorityService getGrantedAuthorityService(){\r
+        return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IService<CdmBase> getMainService(){\r
+        return null;\r
+    }\r
+\r
+\r
+    @Override\r
+    public ProviderManager getAuthenticationManager(){\r
+        if(authenticationManager != null) {\r
+            return authenticationManager;\r
+        }\r
+\r
+        authenticationManager = getAuthenticationManager(getUserService());\r
+        return authenticationManager;\r
+    }\r
+\r
+    public static ProviderManager getAuthenticationManager(IUserService userService) {\r
+        Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder();\r
+        ReflectionSaltSource saltSource = new ReflectionSaltSource();\r
+        saltSource.setUserPropertyToUse("getUsername");\r
+\r
+        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();\r
+        daoAuthenticationProvider.setUserDetailsService(userService);\r
+        daoAuthenticationProvider.setSaltSource(saltSource);\r
+        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);\r
+\r
+        return new ProviderManager(Arrays.asList((AuthenticationProvider)daoAuthenticationProvider));\r
+    }\r
+\r
+\r
+    @Override\r
+    public ConversationHolder NewConversation() {\r
+        return new ConversationHolderMock();\r
+    }\r
+\r
+    @Override\r
+    public ICollectionService getCollectionService(){\r
+        return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IFeatureTreeService getFeatureTreeService(){\r
+        return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IFeatureNodeService getFeatureNodeService(){\r
+        return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IVocabularyService getVocabularyService(){\r
+        return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IIdentificationKeyService getIdentificationKeyService(){\r
+        return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IPolytomousKeyService getPolytomousKeyService(){\r
+        return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+\r
+    @Override\r
+    public IPolytomousKeyNodeService getPolytomousKeyNodeService(){\r
+        return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IProgressMonitorService getProgressMonitorService() {\r
+        return (IProgressMonitorService) getService(IProgressMonitorService.class, "/remoting/progressmonitor.service", new CdmAuthenticatedHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IWorkingSetService getWorkingSetService(){\r
+        return (IWorkingSetService) getService(IWorkingSetService.class, "/remoting/workingset.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IGroupService getGroupService(){\r
+        return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+\r
+    @Override\r
+    public IEntityValidationService getEntityValidationService(){\r
+        return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+\r
+    @Override\r
+    public IEntityConstraintViolationService getEntityConstraintViolationService(){\r
+        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public ICdmPermissionEvaluator getPermissionEvaluator(){\r
+\r
+        if(cdmPermissionEvaluator != null) {\r
+            return cdmPermissionEvaluator;\r
+        }\r
+        List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();\r
+        decisionVoters.add(new GrantAlwaysVoter());\r
+        decisionVoters.add(new TaxonNodeVoter());\r
+        decisionVoters.add(new TaxonBaseVoter());\r
+        decisionVoters.add(new DescriptionBaseVoter());\r
+        decisionVoters.add(new DescriptionElementVoter());\r
+        UnanimousBasedUnrevokable accessDecisionManager = new UnanimousBasedUnrevokable(decisionVoters);\r
+\r
+        cdmPermissionEvaluator = new CdmPermissionEvaluator();\r
+        cdmPermissionEvaluator.setAccessDecisionManager(accessDecisionManager);\r
+\r
+        return cdmPermissionEvaluator;\r
+    }\r
+\r
+\r
+    @Override\r
+    public TransactionStatus startTransaction() throws UnsupportedOperationException {\r
+        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");\r
+    }\r
+\r
     @Override\r
     public TransactionStatus startTransaction(Boolean readOnly) throws UnsupportedOperationException {\r
-               throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");\r
-       }\r
+        throw new UnsupportedOperationException("startTransaction is not implemented for CdmApplicationRemoteConfiguration");\r
+    }\r
 \r
 \r
     @Override\r
     public void commitTransaction(TransactionStatus txStatus) throws UnsupportedOperationException {\r
-               throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");\r
-       }\r
-                       \r
-       @Override\r
-       public ConversationHolder NewConversation() {\r
-               // TODO Auto-generated method stub\r
-               return new ConversationHolderMock();\r
-       }\r
-       \r
-       public IEditGeoService getEditGeoService() {\r
-               return this.editGeoService;\r
-       }\r
-       \r
-       @Override\r
-       public void setDataSource(DataSource dataSource) {        \r
-    }\r
-       \r
-       @Override\r
-       public void setTransactionManager(PlatformTransactionManager transactionManager) {        \r
-    }\r
-       \r
-       @Override\r
-    public void setSessionFactory(SessionFactory sessionFactory) {     \r
+        throw new UnsupportedOperationException("commitTransaction is not implemented for CdmApplicationRemoteConfiguration");\r
+    }\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
+    public IIOService getIOService() {\r
+        return (IIOService) getService(IIOService.class, "/remoting/io.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    public ITestService getTestService() {\r
+        return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());\r
     }\r
 }\r