diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java index 0d88a2c12834f89220585f746d60dfa022e5ca67..bbc9ae20aa06e2e59eb3b6f2365588519e63540f 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java @@ -31,15 +31,16 @@ public class ServiceConversationClientManager extends BaseServiceConversationCli private ServiceConversationDataStoreClientId dataStoreClientId; - private String applicationServerServerUrl; + private ServiceConversationApplicationServerUrl applicationServerUrl; private int applicationServerTimeoutInMillis; @Override public IETLLIMSService getETLService(String sessionToken) { - return getService(applicationServerServerUrl, IETLLIMSService.class, sessionToken, - dataStoreClientId, applicationServerTimeoutInMillis); + return getService(applicationServerUrl.getServerUrl(applicationServerTimeoutInMillis), + IETLLIMSService.class, sessionToken, dataStoreClientId, + applicationServerTimeoutInMillis); } public void setDataStoreCode(String dataStoreCode) @@ -49,8 +50,8 @@ public class ServiceConversationClientManager extends BaseServiceConversationCli public void setApplicationServerUrl(String applicationServerUrl) { - this.applicationServerServerUrl = - new ServiceConversationApplicationServerUrl(applicationServerUrl).getServerUrl(); + this.applicationServerUrl = + new ServiceConversationApplicationServerUrl(applicationServerUrl); } public void setApplicationServerTimeout(String applicationServerTimeout) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java index 7a61ef2ad561ebef9b4f809a67e2ca4c9482d4eb..045ab76f03ddd69b816d78c2e0b627a5d459bea9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java @@ -32,7 +32,7 @@ public class ServiceConversationServerManager extends BaseServiceConversationSer private IDataStoreService dataStoreService; - private String applicationServerClientUrl; + private ServiceConversationApplicationServerUrl applicationServerUrl; private int applicationServerTimeoutInMillis; @@ -47,7 +47,8 @@ public class ServiceConversationServerManager extends BaseServiceConversationSer { if (clientId instanceof ServiceConversationApplicationServerClientId) { - return new ServiceConversationClientDetails(applicationServerClientUrl, + return new ServiceConversationClientDetails( + applicationServerUrl.getClientUrl(applicationServerTimeoutInMillis), applicationServerTimeoutInMillis); } return null; @@ -60,8 +61,8 @@ public class ServiceConversationServerManager extends BaseServiceConversationSer public void setApplicationServerUrl(String applicationServerUrl) { - this.applicationServerClientUrl = - new ServiceConversationApplicationServerUrl(applicationServerUrl).getClientUrl(); + this.applicationServerUrl = + new ServiceConversationApplicationServerUrl(applicationServerUrl); } public void setApplicationServerTimeout(String applicationServerTimeout) diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java index 16fb8ddee50605152c0de2757e0b5d9516162cc9..24701dd21e3843c0573d20f96f54c7a79b322e8f 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java +++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java @@ -117,6 +117,22 @@ public class ServiceFinder */ public <S> S createService(Class<S> serviceInterface, String serverUrl, IServicePinger<S> servicePinger, long timeoutInMillis) + { + ServiceWithUrl<S> serviceWithUrl = + createServiceWithUrl(serviceInterface, serverUrl, servicePinger, timeoutInMillis); + return serviceWithUrl.getService(); + } + + public <S> String createServiceUrl(Class<S> serviceInterface, String serverUrl, + IServicePinger<S> servicePinger, long timeoutInMillis) + { + ServiceWithUrl<S> serviceWithUrl = + createServiceWithUrl(serviceInterface, serverUrl, servicePinger, timeoutInMillis); + return serviceWithUrl.getUrl(); + } + + private <S> ServiceWithUrl<S> createServiceWithUrl(Class<S> serviceInterface, String serverUrl, + IServicePinger<S> servicePinger, long timeoutInMillis) { S service; String usedServerUrl = computeServerUrlWithDoubledApplicationName(serverUrl); @@ -126,7 +142,7 @@ public class ServiceFinder usedServerUrl); if (canConnectToService(service, servicePinger)) { - return service; + return new ServiceWithUrl<S>(usedServerUrl, service); } // Try the url that ends in just one <applicationName> @@ -136,7 +152,7 @@ public class ServiceFinder usedServerUrl); if (canConnectToService(service, servicePinger)) { - return service; + return new ServiceWithUrl<S>(usedServerUrl, service); } // Try the url as provided @@ -144,7 +160,7 @@ public class ServiceFinder service = createServiceStubStoringCertificateIfNecessary(serviceInterface, timeoutInMillis, usedServerUrl); - return service; + return new ServiceWithUrl<S>(usedServerUrl, service); } private <S> S createServiceStubStoringCertificateIfNecessary(Class<S> serviceInterface, @@ -276,4 +292,27 @@ public class ServiceFinder configDir.mkdirs(); return configDir; } + + private class ServiceWithUrl<S> + { + private String url; + + private S service; + + public ServiceWithUrl(String url, S service) + { + this.url = url + urlServiceSuffix; + this.service = service; + } + + public String getUrl() + { + return url; + } + + public S getService() + { + return service; + } + } } diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java index a44cad4d5e06d52375c758b58988af6fa02e9287..03d630c6857e1b260be42cf9eecfec87488ce411 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java +++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java @@ -53,6 +53,11 @@ public class BaseServiceConversationClientManager implements } } + @Override + public void ping() + { + } + public <T> T getService(String serverUrl, Class<T> serviceInterface, String sessionToken, Object clientId, int clientTimeout) { diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java index 7f61908c3576bc92637eb0e56c423458b88e90fc..2e340d8923ea9ad1af624d71c4247caef5b95a37 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java +++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java @@ -118,6 +118,11 @@ public abstract class BaseServiceConversationServerManager implements server.getIncomingMessageTransport().send(message); } + @Override + public void ping() + { + } + protected abstract ServiceConversationClientDetails getClientDetailsForClientId(Object clientId); private synchronized IServiceConversationClientManagerRemote getClientForClientDetails( diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java index 29a7c12f5276f4ea0ea6a4d45f1fe6b4b21f6056..8ba47f6aeac2dac88d20fec593b6e37dc43d074e 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java +++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java @@ -28,4 +28,6 @@ public interface IServiceConversationClientManagerRemote extends IServiceMessage public static final String PATH = "/service-conversation-client-manager"; + public void ping(); + } diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java index 7263e56de9fe8e74de47d0ff4e2be5708438a089..d325aabaeb3d78ac3d04a24e518e93e045169d78 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java +++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java @@ -31,5 +31,7 @@ public interface IServiceConversationServerManagerRemote extends IServiceMessage public ServiceConversationDTO startConversation(String sessionToken, String serviceName, Object clientId); + + public void ping(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java index e446aa17e1cf6a067d75afe254627a293da7730c..eeec93b6fbf873d34469902deed8ca7982c02984 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.generic.shared.conversation; +import ch.systemsx.cisd.common.api.client.IServicePinger; +import ch.systemsx.cisd.common.api.client.ServiceFinder; import ch.systemsx.cisd.common.conversation.manager.IServiceConversationClientManagerRemote; import ch.systemsx.cisd.common.conversation.manager.IServiceConversationServerManagerRemote; @@ -27,21 +29,60 @@ public class ServiceConversationApplicationServerUrl private String applicationServerUrl; + private String clientUrl; + + private String serverUrl; + public ServiceConversationApplicationServerUrl(String applicationServerUrl) { this.applicationServerUrl = applicationServerUrl; } - public String getClientUrl() + public String getClientUrl(int timeout) { - return applicationServerUrl + "/openbis/openbis" - + IServiceConversationClientManagerRemote.PATH; + if (clientUrl == null) + { + IServicePinger<IServiceConversationClientManagerRemote> pinger = + new IServicePinger<IServiceConversationClientManagerRemote>() + { + @Override + public void ping(IServiceConversationClientManagerRemote service) + { + service.ping(); + } + }; + + ServiceFinder finder = + new ServiceFinder("openbis", IServiceConversationClientManagerRemote.PATH); + clientUrl = + finder.createServiceUrl(IServiceConversationClientManagerRemote.class, + applicationServerUrl, pinger, timeout); + } + + return clientUrl; } - public String getServerUrl() + public String getServerUrl(int timeout) { - return applicationServerUrl + "/openbis/openbis" - + IServiceConversationServerManagerRemote.PATH; + if (serverUrl == null) + { + IServicePinger<IServiceConversationServerManagerRemote> pinger = + new IServicePinger<IServiceConversationServerManagerRemote>() + { + @Override + public void ping(IServiceConversationServerManagerRemote service) + { + service.ping(); + } + }; + ServiceFinder finder = + new ServiceFinder("openbis", IServiceConversationServerManagerRemote.PATH); + serverUrl = + finder.createServiceUrl(IServiceConversationServerManagerRemote.class, + applicationServerUrl, pinger, timeout); + } + + return serverUrl; } }