cleanup
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationRemoteConfiguration.java
index ec310b56397e1e6b3325ef8d7db894b57add55eb..1055ebdc553d7567c0ae4cc324ccd94e914b9d1c 100644 (file)
@@ -9,12 +9,25 @@
 \r
 package eu.etaxonomy.cdm.api.application;\r
 \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.BeansException;\r
 import org.springframework.context.ApplicationContext;\r
 import org.springframework.context.ApplicationContextAware;\r
+import org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor;\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
@@ -24,7 +37,9 @@ import org.springframework.transaction.TransactionStatus;
 \r
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
 import eu.etaxonomy.cdm.api.conversation.ConversationHolderMock;\r
+import eu.etaxonomy.cdm.api.longrunningService.ILongRunningTasksService;\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
@@ -32,6 +47,7 @@ import eu.etaxonomy.cdm.api.service.IDatabaseService;
 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.IEventBaseService;\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
@@ -39,25 +55,45 @@ import eu.etaxonomy.cdm.api.service.IGroupService;
 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.IPreferenceService;\r
+import eu.etaxonomy.cdm.api.service.IProgressMonitorService;\r
 import eu.etaxonomy.cdm.api.service.IReferenceService;\r
+import eu.etaxonomy.cdm.api.service.IRegistrationService;\r
+import eu.etaxonomy.cdm.api.service.IRightsService;\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.IDescriptiveDataSetService;\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
@@ -67,16 +103,68 @@ import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
  *\r
  */\r
 @Component\r
-public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfiguration, ApplicationContextAware  {\r
+public class CdmApplicationRemoteConfiguration implements ICdmRepository, 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
+    //TODO should be something like Map<Class<IService>, IService>, but we have no common service base interface yet\r
+    private Map<Class<?>, Object> serviceMap = new HashMap<>();\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<?/* extends IService*/> clazz, String serviceSuffix, HttpComponentsHttpInvokerRequestExecutor 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
+            HttpComponentsHttpInvokerRequestExecutor 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
@@ -98,19 +186,25 @@ public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfigu
      * @return\r
      */\r
     public IEditGeoService getEditGeoService() {\r
-        return (IEditGeoService)getBean("editGeoService");\r
+        return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     /**\r
      * @return\r
      */\r
     public ICachedCommonService getCachedCommonService(){\r
-        return (ICachedCommonService) getBean("cachedCommonService");\r
+        if(cachedCommonService == null) {\r
+            cachedCommonService = new CachedCommonServiceImpl();\r
+        }\r
+        return cachedCommonService;\r
     }\r
 \r
 \r
     public ICdmEntitySessionManager getCdmEntitySessionManager() {\r
-        return (ICdmEntitySessionManager) getBean("cdmEntitySessionManager");\r
+        if(cdmEntitySessionManager == null) {\r
+            cdmEntitySessionManager = new CdmEntitySessionManager();\r
+        }\r
+        return cdmEntitySessionManager;\r
     }\r
 \r
 \r
@@ -122,108 +216,153 @@ public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfigu
 \r
     @Override\r
     public final Object getBean(String name){\r
-        return this.applicationContext.getBean(name);\r
+        throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");\r
     }\r
 \r
     @Override\r
     public IAgentService getAgentService(){\r
-        return (IAgentService) getBean("agentService");\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) getBean("databaseService");\r
+        return (IDatabaseService) getService(IDatabaseService.class, "/remoting/database.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public INameService getNameService(){\r
-        return (INameService) getBean("nameService");\r
+        return (INameService) getService(INameService.class, "/remoting/name.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IReferenceService getReferenceService(){\r
-        return (IReferenceService) getBean("referenceService");\r
+        return (IReferenceService) getService(IReferenceService.class, "/remoting/reference.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public ITaxonService getTaxonService(){\r
-        return (ITaxonService) getBean("taxonService");\r
+        return (ITaxonService) getService(ITaxonService.class, "/remoting/taxon.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IClassificationService getClassificationService(){\r
-        return (IClassificationService) getBean("classificationService");\r
+        return (IClassificationService) getService(IClassificationService.class, "/remoting/classification.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public ITaxonNodeService getTaxonNodeService(){\r
-        return (ITaxonNodeService) getBean("taxonNodeService");\r
+        return (ITaxonNodeService) getService(ITaxonNodeService.class, "/remoting/taxonnode.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IDescriptionService getDescriptionService(){\r
-        return (IDescriptionService) getBean("descriptionService");\r
+        return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IOccurrenceService getOccurrenceService(){\r
-        return (IOccurrenceService) getBean("occurrenceService");\r
+        return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IPrimerService getPrimerService(){\r
-        return (IPrimerService) getBean("primerService");\r
+        return (IPrimerService) getService(IPrimerService.class, "/remoting/primer.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IAmplificationService getAmplificationService(){\r
-        return (IAmplificationService) getBean("amplificationService");\r
+        return (IAmplificationService) getService(IAmplificationService.class, "/remoting/amplification.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public ISequenceService getSequenceService(){\r
-        return (ISequenceService) getBean("sequenceService");\r
+        return (ISequenceService) getService(ISequenceService.class, "/remoting/sequence.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IEventBaseService getEventBaseService() {\r
+        return (IEventBaseService) getService(IEventBaseService.class, "/remoting/eventbase.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IMediaService getMediaService(){\r
-        return (IMediaService) getBean("mediaService");\r
+        return (IMediaService) getService(IMediaService.class, "/remoting/media.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public ITermService getTermService(){\r
-        return (ITermService) getBean("termService");\r
+        return (ITermService) getService(ITermService.class, "/remoting/term.service", new TermServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IRightsService getRightsService(){\r
+        return (IRightsService) getService(IRightsService.class, "/remoting/rights.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public ICommonService getCommonService(){\r
-        return (ICommonService) getBean("commonService");\r
+        return (ICommonService) getService(ICommonService.class, "/remoting/common.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public ILocationService getLocationService(){\r
-        return (ILocationService) getBean("locationService");\r
+        return (ILocationService) getService(ILocationService.class, "/remoting/location.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IUserService getUserService(){\r
-        return (IUserService) getBean("userService");\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 HttpComponentsHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IMetadataService getMetadataService() {\r
+        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", new HttpComponentsHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    public static IMetadataService getMetadataService(ICdmRemoteSource remoteSource) {\r
+        return (IMetadataService) getService(IMetadataService.class, "/remoting-public/metadata.service", remoteSource, new HttpComponentsHttpInvokerRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IGrantedAuthorityService getGrantedAuthorityService(){\r
-        return (IGrantedAuthorityService) getBean("grantedAuthorityService");\r
+        return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IService<CdmBase> getMainService(){\r
-        return (IService<CdmBase>) getBean("mainService");\r
+        return null;\r
     }\r
 \r
 \r
     @Override\r
     public ProviderManager getAuthenticationManager(){\r
-        return (ProviderManager) getBean("authenticationManager");\r
+        if(authenticationManager == null) {\r
+               authenticationManager = getAuthenticationManager(getUserService());\r
+        }\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
@@ -234,65 +373,99 @@ public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfigu
 \r
     @Override\r
     public ICollectionService getCollectionService(){\r
-        return (ICollectionService) getBean("collectionService");\r
+        return (ICollectionService) getService(ICollectionService.class, "/remoting/collection.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IFeatureTreeService getFeatureTreeService(){\r
-        return (IFeatureTreeService) getBean("featureTreeService");\r
+        return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IFeatureNodeService getFeatureNodeService(){\r
-        return (IFeatureNodeService) getBean("featureNodeService");\r
+        return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IVocabularyService getVocabularyService(){\r
-        return (IVocabularyService) getBean("vocabularyService");\r
+        return (IVocabularyService) getService(IVocabularyService.class, "/remoting/vocabulary.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IIdentificationKeyService getIdentificationKeyService(){\r
-        return (IIdentificationKeyService) getBean("identificationKeyService");\r
+        return (IIdentificationKeyService) getService(IIdentificationKeyService.class, "/remoting/identificationkey.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public IPolytomousKeyService getPolytomousKeyService(){\r
-        return (IPolytomousKeyService) getBean("polytomousKeyService");\r
+        return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
 \r
     @Override\r
     public IPolytomousKeyNodeService getPolytomousKeyNodeService(){\r
-        return (IPolytomousKeyNodeService) getBean("polytomousKeyNodeService");\r
+        return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
-    public IWorkingSetService getWorkingSetService(){\r
-        return (IWorkingSetService) getBean("workingSetService");\r
+    public IProgressMonitorService getProgressMonitorService() {\r
+        return (IProgressMonitorService) getService(IProgressMonitorService.class, "/remoting/progressmonitor.service", new CdmAuthenticatedHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IDescriptiveDataSetService getDescriptiveDataSetService(){\r
+        return (IDescriptiveDataSetService) getService(IDescriptiveDataSetService.class, "/remoting/descriptivedataset.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    /**\r
+     * {@inheritDoc}\r
+     */\r
+    @Override\r
+    public IRegistrationService getRegistrationService() {\r
+        return (IRegistrationService) getService(IRegistrationService.class, "/remoting/registration.service", new CdmServiceRequestExecutor());\r
+\r
     }\r
 \r
     @Override\r
     public IGroupService getGroupService(){\r
-        return (IGroupService) getBean("groupService");\r
+        return (IGroupService) getService(IGroupService.class, "/remoting/group.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IPreferenceService getPreferenceService(){\r
+        return (IPreferenceService) getService(IPreferenceService.class, "/remoting/preference.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
 \r
     @Override\r
     public IEntityValidationService getEntityValidationService(){\r
-        return (IEntityValidationService) getBean("entityValidationService");\r
+        return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
 \r
     @Override\r
     public IEntityConstraintViolationService getEntityConstraintViolationService(){\r
-        return (IEntityConstraintViolationService) getBean("entityConstraintViolationService");\r
+        return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new CdmServiceRequestExecutor());\r
     }\r
 \r
     @Override\r
     public ICdmPermissionEvaluator getPermissionEvaluator(){\r
-        return (ICdmPermissionEvaluator) getBean("cdmPermissionEvaluator");\r
+\r
+        if(cdmPermissionEvaluator != null) {\r
+            return cdmPermissionEvaluator;\r
+        }\r
+        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList<>();\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
@@ -319,4 +492,16 @@ public class CdmApplicationRemoteConfiguration implements ICdmApplicationConfigu
         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 ILongRunningTasksService getLongRunningTasksService() {\r
+        return (ILongRunningTasksService) getService(ILongRunningTasksService.class, "/remoting/longrunningtasks.service", new CdmServiceRequestExecutor());\r
+    }\r
+\r
+    public ITestService getTestService() {\r
+        return (ITestService) getService(ITestService.class, "/remoting/test.service", new CdmServiceRequestExecutor());\r
+    }\r
 }\r