ref #10222 adapt taxeditor to changes (DerivedUnitFacade and CondensedDistributionRec...
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / cdm / api / application / CdmApplicationRemoteConfiguration.java
index 515abdbeb35749815cf6c0003780e85e4e3f130f..4bc14613dc8fe5c28b2cc3f8c4c40413488a3438 100644 (file)
@@ -6,7 +6,6 @@
  * The contents of this file are subject to the Mozilla Public License Version 1.1\r
  * See LICENSE.TXT at the top of this package for the full license terms.\r
  */\r
-\r
 package eu.etaxonomy.cdm.api.application;\r
 \r
 import java.util.ArrayList;\r
@@ -15,10 +14,9 @@ import java.util.HashMap;
 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.apache.commons.lang3.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
 import org.springframework.remoting.httpinvoker.CachingHttpInvokerProxyFactoryBean;\r
 import org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor;\r
 import org.springframework.security.access.AccessDecisionVoter;\r
@@ -32,24 +30,19 @@ import org.springframework.security.core.Authentication;
 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.IDescriptionElementService;\r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
 import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;\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
 import eu.etaxonomy.cdm.api.service.IGroupService;\r
 import eu.etaxonomy.cdm.api.service.IIdentificationKeyService;\r
@@ -73,20 +66,26 @@ import eu.etaxonomy.cdm.api.service.ITermTreeService;
 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.geo.IDistributionService;\r
 import eu.etaxonomy.cdm.api.service.longrunningService.ILongRunningTasksService;\r
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;\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.api.service.registration.IRegistrationWorkingSetService;\r
+import eu.etaxonomy.cdm.api.service.security.IAccountRegistrationService;\r
+import eu.etaxonomy.cdm.api.service.security.IPasswordResetService;\r
 import eu.etaxonomy.cdm.ext.geo.IEditGeoService;\r
 import eu.etaxonomy.cdm.io.service.IIOService;\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.cdm.persistence.permission.CdmPermissionEvaluator;\r
+import eu.etaxonomy.cdm.persistence.permission.ICdmPermissionEvaluator;\r
+import eu.etaxonomy.cdm.persistence.permission.UnanimousBasedUnrevokable;\r
+import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionBaseVoter;\r
+import eu.etaxonomy.cdm.persistence.permission.voter.DescriptionElementVoter;\r
+import eu.etaxonomy.cdm.persistence.permission.voter.GrantAlwaysVoter;\r
+import eu.etaxonomy.cdm.persistence.permission.voter.TaxonBaseVoter;\r
+import eu.etaxonomy.cdm.persistence.permission.voter.TaxonNodeVoter;\r
+import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;\r
 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;\r
 import eu.etaxonomy.taxeditor.service.AuthenticatingHttpInvokerRequestExecutor;\r
 import eu.etaxonomy.taxeditor.service.CachedCommonServiceImpl;\r
@@ -95,25 +94,27 @@ import eu.etaxonomy.taxeditor.service.RemoteInvocationTermCacher;
 import eu.etaxonomy.taxeditor.session.CdmEntitySessionManager;\r
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;\r
 \r
-\r
 /**\r
  * CDM Application Configuration class which manages the configuration for remoting\r
  * clients\r
  */\r
 @Component\r
 // TODO split into CdmRepository and proper @Configuration class\r
-public class CdmApplicationRemoteConfiguration implements ICdmRepository, ApplicationContextAware  {\r
+public class CdmApplicationRemoteConfiguration implements ICdmRepository {\r
 \r
     @SuppressWarnings("unused")\r
-    private static final Logger logger = Logger.getLogger(CdmApplicationRemoteConfiguration.class);\r
+    private static final Logger logger = LogManager.getLogger();\r
 \r
     /**\r
-     * Timeout for service lookup etc. This timeout (milliseconds) should me more\r
+     * Timeout for service lookup etc. This timeout (milliseconds) should be more\r
      * strict than {@link #HTTP_READ_TIMEOUT} to avoid connecting to\r
      * cdm servers when the network quality is too bad.\r
-     *\r
+     * Note AM: IMO we should not be to strict, sometimes services do not respond too fast\r
+     *     during the first call (e.g. test server), therefore I put this up from 1 to 3 sec.\r
+     *     Better we should inform the user that the connection might be of low quality\r
+     *     instead of making the connection completely unavailable.\r
      */\r
-    public static final int HTTP_READ_TIMEOUT_MIN = 1000; // one minute\r
+    public static final int HTTP_READ_TIMEOUT_MIN = 3000; // 3 seconds\r
 \r
     /**\r
      * Timeout for normal operation (milliseconds)\r
@@ -124,18 +125,10 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
      * <p>\r
      * The application should be usable in networks with low connection quality,\r
      * e.g.: from cuba where the throughput rate is low (<= ISDN speed, 64 kbit)\r
-     * and a packet delay of <200 ms. Additionally we should tolerate a certain\r
-     * amount of packet loss. Here we take the packet loss rate as it occurs\r
-     * in the FU-Berlin ZEDAT VPN as reference case (~1%)\r
-     * <ul>\r
-     * <li>5min: Timeout at remoting/taxonnode.service\r
-     * </ul>\r
+     * and a packet delay of <200 ms.\r
      *\r
      */\r
-    public static final int HTTP_READ_TIMEOUT = 70000;\r
-\r
-\r
-    protected ApplicationContext applicationContext;\r
+    public static final int HTTP_READ_TIMEOUT = 10 * 60 * 1000;\r
 \r
     private ICdmRemoteSource remoteSource;\r
 \r
@@ -150,11 +143,16 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
 \r
     private ICachedCommonService cachedCommonService;\r
 \r
+    static {\r
+        // The Taxeditor is multithreaded, the same authentication should be used\r
+        // in all threads\r
+        SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL);\r
+    }\r
+\r
     public CdmApplicationRemoteConfiguration() {}\r
 \r
     public CdmApplicationRemoteConfiguration(ICdmRemoteSource remoteSource) {\r
         this.remoteSource = remoteSource;\r
-\r
     }\r
 \r
     public void setRemoteSource(ICdmRemoteSource remoteSource) {\r
@@ -176,10 +174,13 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
             HttpComponentsHttpInvokerRequestExecutor executor) {\r
 \r
         String baseUrl;\r
-        if(remoteSource.getContextPath() == null || remoteSource.getContextPath().equals("")) {\r
-            baseUrl = "http://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());\r
+        String protocol = remoteSource.getPort() == 443 ? "https" : "http";\r
+\r
+        String contextPath = (remoteSource instanceof CdmRemoteSource)? ((CdmRemoteSource)remoteSource).getContextPath() : "";\r
+        if(StringUtils.isBlank(contextPath)) {\r
+            baseUrl = protocol + "://" + remoteSource.getServer() + ":" + String.valueOf(remoteSource.getPort());\r
         } else {\r
-            baseUrl = "http://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + remoteSource.getContextPath();\r
+            baseUrl = protocol + "://" + remoteSource.getServer()  + ":" + String.valueOf(remoteSource.getPort()) + "/" + contextPath;\r
         }\r
         CachingHttpInvokerProxyFactoryBean proxyFactory = new CachingHttpInvokerProxyFactoryBean();\r
         proxyFactory.setServiceInterface(clazz);\r
@@ -198,16 +199,6 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
 \r
     // ****************************** APPLICATION CONTEXT *************************************************/\r
 \r
-    @Override\r
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{\r
-        this.applicationContext = applicationContext;\r
-    }\r
-\r
-    @Override\r
-    public PlatformTransactionManager getTransactionManager() throws UnsupportedOperationException {\r
-        throw new UnsupportedOperationException("getTransactionManager is not implemented for CdmApplicationRemoteConfiguration");\r
-    }\r
-\r
     public IEditGeoService getEditGeoService() {\r
         return (IEditGeoService) getService(IEditGeoService.class, "/remoting/editgeo.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
@@ -229,8 +220,8 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
  // ****************************** GETTER *************************************************/\r
 \r
     @Override\r
-    public final Object getBean(String name){\r
-        throw new UnsupportedOperationException("getBean is not implemented for CdmApplicationRemoteConfiguration");\r
+    public IAccountRegistrationService getAccountRegistrationService() {\r
+        return (IAccountRegistrationService) getService(IAccountRegistrationService.class, "/remoting/accountregistrationservice.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
     @Override\r
@@ -278,6 +269,16 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         return (IDescriptionService) getService(IDescriptionService.class, "/remoting/description.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
+    @Override\r
+    public IDistributionService getDistributionService(){\r
+        return (IDistributionService) getService(IDistributionService.class, "/remoting/distribution.service", new AuthenticatingHttpInvokerRequestExecutor());\r
+    }\r
+\r
+    @Override\r
+    public IDescriptionElementService getDescriptionElementService(){\r
+        return (IDescriptionElementService) getService(IDescriptionElementService.class, "/remoting/descriptionelement.service", new AuthenticatingHttpInvokerRequestExecutor());\r
+    }\r
+\r
     @Override\r
     public IOccurrenceService getOccurrenceService(){\r
         return (IOccurrenceService) getService(IOccurrenceService.class, "/remoting/occurrence.service", new AuthenticatingHttpInvokerRequestExecutor());\r
@@ -333,7 +334,6 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         return (IUserService) getService(IUserService.class, "/remoting-public/user.service", new AuthenticatingHttpInvokerRequestExecutor());\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
@@ -352,7 +352,6 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         return (IGrantedAuthorityService) getService(IGrantedAuthorityService.class, "/remoting/grantedauthority.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
-\r
     @Override\r
     public ProviderManager getAuthenticationManager(){\r
         if(authenticationManager == null) {\r
@@ -374,31 +373,16 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         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 AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
-    @Override\r
-    public IFeatureTreeService getFeatureTreeService(){\r
-        return (IFeatureTreeService) getService(IFeatureTreeService.class, "/remoting/featuretree.service", new AuthenticatingHttpInvokerRequestExecutor());\r
-    }\r
     @Override\r
     public ITermTreeService getTermTreeService() {\r
        return (ITermTreeService) getService(ITermTreeService.class, "/remoting/termtree.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
-    @Override\r
-    public IFeatureNodeService getFeatureNodeService(){\r
-        return (IFeatureNodeService) getService(IFeatureNodeService.class, "/remoting/featurenode.service", new AuthenticatingHttpInvokerRequestExecutor());\r
-    }\r
-\r
        @Override\r
        public ITermNodeService getTermNodeService() {\r
         return (ITermNodeService) getService(ITermNodeService.class, "/remoting/termnode.service", new AuthenticatingHttpInvokerRequestExecutor());\r
@@ -419,7 +403,6 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         return (IPolytomousKeyService) getService(IPolytomousKeyService.class, "/remoting/polytomouskey.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
-\r
     @Override\r
     public IPolytomousKeyNodeService getPolytomousKeyNodeService(){\r
         return (IPolytomousKeyNodeService) getService(IPolytomousKeyNodeService.class, "/remoting/polytomouskeynode.service", new AuthenticatingHttpInvokerRequestExecutor());\r
@@ -435,13 +418,14 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         return (IDescriptiveDataSetService) getService(IDescriptiveDataSetService.class, "/remoting/descriptivedataset.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
-    /**\r
-     * {@inheritDoc}\r
-     */\r
     @Override\r
     public IRegistrationService getRegistrationService() {\r
         return (IRegistrationService) getService(IRegistrationService.class, "/remoting/registration.service", new AuthenticatingHttpInvokerRequestExecutor());\r
+    }\r
 \r
+    @Override\r
+    public IRegistrationWorkingSetService getRegistrationWorkingSetService() {\r
+        return (IRegistrationWorkingSetService) getService(IRegistrationWorkingSetService.class, "/remoting/registrationworkingset.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
     @Override\r
@@ -454,18 +438,26 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         return (IPreferenceService) getService(IPreferenceService.class, "/remoting/preference.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
+    @Override\r
+    public IPasswordResetService getPasswordResetService(){\r
+        return (IPasswordResetService) getService(IPasswordResetService.class, "/remoting/passwordreset.service", new AuthenticatingHttpInvokerRequestExecutor());\r
+    }\r
 \r
     @Override\r
     public IEntityValidationService getEntityValidationService(){\r
         return (IEntityValidationService) getService(IEntityValidationService.class, "/remoting/entityvalidation.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
-\r
     @Override\r
     public IEntityConstraintViolationService getEntityConstraintViolationService(){\r
         return (IEntityConstraintViolationService) getService(IEntityConstraintViolationService.class, "/remoting/entityconstraintviolation.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
 \r
+    @Override\r
+    public MediaInfoFactory getMediaInfoFactory(){ // TODO use interface\r
+        return (MediaInfoFactory) getService(MediaInfoFactory.class, "/remoting/mediainfofactory.service", new AuthenticatingHttpInvokerRequestExecutor());\r
+    }\r
+\r
     @Override\r
     public ICdmPermissionEvaluator getPermissionEvaluator(){\r
 \r
@@ -486,28 +478,6 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
         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
-\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 void rollbackTransaction(TransactionStatus arg0) {\r
-        throw new UnsupportedOperationException("rollbackTransaction 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
@@ -528,5 +498,4 @@ public class CdmApplicationRemoteConfiguration implements ICdmRepository, Applic
     public ITestService getTestService() {\r
         return (ITestService) getService(ITestService.class, "/remoting/test.service", new AuthenticatingHttpInvokerRequestExecutor());\r
     }\r
-\r
 }\r