Skip to content
Snippets Groups Projects
Commit d52fc40d authored by felmer's avatar felmer
Browse files

LMS-1527 Refactoring: Moving stuff from OpenBisServiceFactory to a new class:...

LMS-1527 Refactoring: Moving stuff from OpenBisServiceFactory to a new class: ServiceFinder in project server-common. Adapt build to create Raw Data API dist

SVN: 16001
parent 3b1a89f8
No related branches found
No related tags found
No related merge requests found
......@@ -469,7 +469,8 @@
<zipfileset src="${jar.file}">
<include name="ch/systemsx/cisd/common/exceptions/**/*.class" />
<include name="ch/systemsx/cisd/common/spring/HttpInvokerUtils.class" />
<include name="ch/systemsx/cisd/openbis/**/api/**/*.class" />
<include name="ch/systemsx/cisd/common/api/*.class" />
<include name="ch/systemsx/cisd/openbis/plugin/query/**/api/**/*.class" />
<exclude name="ch/systemsx/cisd/openbis/**/server/api/**/*.class" />
<include name="**/*BuildAndEnvironmentInfo.class" />
<include name="*.INFO" />
......
/*
* Copyright 2010 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.generic.shared;
import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
import ch.systemsx.cisd.openbis.generic.shared.OpenBisServiceFactory.ILimsServiceStubFactory;
/**
* @author Chandrasekhar Ramakrishnan
*/
public class DefaultLimsServiceStubFactory implements ILimsServiceStubFactory
{
public static final int SERVER_TIMEOUT_MIN = 5;
public IETLLIMSService createServiceStub(String serverUrl)
{
return HttpInvokerUtils.createServiceStub(IETLLIMSService.class, serverUrl,
SERVER_TIMEOUT_MIN);
}
}
......@@ -16,64 +16,23 @@
package ch.systemsx.cisd.openbis.generic.shared;
import ch.systemsx.cisd.common.api.client.IServicePinger;
import ch.systemsx.cisd.common.api.client.ServiceFinder;
/**
* A factory for creating proxies to the openBIS application server.
* <p>
* The OpenBisServiceFactory will create a proxy by trying several possible locations for the
* service.
* <p>
* After calling {@link #createService}, you can get the url createService used by calling the
* {@link #getUsedServerUrl} method.
*
* @author Chandrasekhar Ramakrishnan
*/
public class OpenBisServiceFactory
{
/**
* An interface that can create a {@link IETLLIMSService} proxy to a service located at a given
* a URL.
*
* @author Chandrasekhar Ramakrishnan
*/
public static interface ILimsServiceStubFactory
{
/**
* Create a proxy to the service located at the serverURL. Implementations should not alter
* the url, e.g., by appending something to it.
*
* @param serverUrl The URL of of the IETLLIMSService service
* @return IETLLIMSService The service located at the serverUrl
*/
public IETLLIMSService createServiceStub(String serverUrl);
}
private final String initialServerUrl;
private final String urlServiceSuffix;
private final ILimsServiceStubFactory stubFactory;
private String usedServerUrl;
/**
* Constructor for the OpenBisServiceFactory. The service factory works best when the serverUrl
* is simply the protocol://machine:port of the openBIS application server. It will
* automatically append likely locations of the openBIS service to the url.
* <p>
* Examples:
* <ul>
* <li>OpenBisServiceFactory("http://localhost:8888/", "/rmi-etl", stubFactory)</li>
* <li>OpenBisServiceFactory("https://openbis.ethz.ch:8443/", "/rmi-etl", stubFactory)</li>
* </ul>
*
* @param serverUrl The Url where the openBIS server is assumed to be.
* @param stubFactory A factory that, given a url, returns an IETLLIMSService proxy to the url
*/
public OpenBisServiceFactory(String serverUrl, ILimsServiceStubFactory stubFactory)
{
this(serverUrl, "/rmi-etl", stubFactory);
}
/**
* Constructor for the OpenBisServiceFactory. The service factory works best when the serverUrl
* is simply the protocol://machine:port of the openBIS application server. It will
......@@ -87,15 +46,11 @@ public class OpenBisServiceFactory
*
* @param serverUrl The Url where the openBIS server is assumed to be.
* @param urlServiceSuffix The suffix appended to the url to refer to the service.
* @param stubFactory A factory that, given a url, returns an IETLLIMSService proxy to the url
*/
public OpenBisServiceFactory(String serverUrl, String urlServiceSuffix,
ILimsServiceStubFactory stubFactory)
public OpenBisServiceFactory(String serverUrl, String urlServiceSuffix)
{
this.initialServerUrl = serverUrl;
this.urlServiceSuffix = urlServiceSuffix;
this.stubFactory = stubFactory;
this.usedServerUrl = "";
}
/**
......@@ -105,87 +60,15 @@ public class OpenBisServiceFactory
*/
public IETLLIMSService createService()
{
IETLLIMSService service;
usedServerUrl = computeOpenbisOpenbisServerUrl(initialServerUrl);
// Try the url that ends in openbis/openbis
service = stubFactory.createServiceStub(usedServerUrl + urlServiceSuffix);
if (canConnectToService(service))
{
return service;
}
// Try the url that ends in just one openbis
usedServerUrl = computeOpenbisServerUrl(initialServerUrl);
service = stubFactory.createServiceStub(usedServerUrl + urlServiceSuffix);
if (canConnectToService(service))
{
return service;
}
// Try the url as provided
usedServerUrl = initialServerUrl;
service = stubFactory.createServiceStub(usedServerUrl + urlServiceSuffix);
return service;
ServiceFinder serviceFinder = new ServiceFinder("openbis", urlServiceSuffix);
return serviceFinder.createService(IETLLIMSService.class, initialServerUrl,
new IServicePinger<IETLLIMSService>()
{
public void ping(IETLLIMSService service)
{
service.getVersion();
}
});
}
/**
* Return the serverUrl used by the createService method. The result of this method only makes
* sense after calling createService.
*/
public String getUsedServerUrl()
{
return usedServerUrl;
}
private boolean canConnectToService(IETLLIMSService service)
{
try
{
service.getVersion();
} catch (Exception e)
{
return false;
}
return true;
}
private String computeOpenbisOpenbisServerUrl(String serverUrl)
{
if (serverUrl.endsWith("/openbis/openbis"))
{
return serverUrl;
}
if (serverUrl.endsWith("/openbis"))
{
return serverUrl + "/openbis";
}
String myServerUrl = serverUrl;
if (false == serverUrl.endsWith("/"))
{
myServerUrl = myServerUrl + "/";
}
return myServerUrl + "openbis/openbis";
}
private String computeOpenbisServerUrl(String serverUrl)
{
if (serverUrl.endsWith("/openbis/openbis"))
{
return serverUrl.substring(0, serverUrl.length() - "/openbis".length());
}
if (serverUrl.endsWith("/openbis"))
{
return serverUrl;
}
String myServerUrl = serverUrl;
if (false == serverUrl.endsWith("/"))
{
myServerUrl = myServerUrl + "/";
}
return myServerUrl + "openbis";
}
}
......@@ -44,6 +44,8 @@ public final class ResourceNames
}
public final static String ETL_SERVICE = "etl-service";
public final static String ETL_SERVICE_URL = "/rmi-etl";
public final static String COMMON_SERVICE = "common-service";
......
......@@ -16,9 +16,7 @@
package ch.systemsx.cisd.openbis.plugin.query.client.api.v1;
import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
import ch.systemsx.cisd.openbis.generic.shared.DefaultLimsServiceStubFactory;
import ch.systemsx.cisd.openbis.generic.shared.OpenBisServiceFactory;
import ch.systemsx.cisd.common.api.client.ServiceFinder;
import ch.systemsx.cisd.openbis.plugin.query.server.api.v1.ResourceNames;
import ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer;
......@@ -29,26 +27,15 @@ import ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer;
*/
public class FacadeFactory
{
private static final int SERVER_TIMEOUT_MIN = 5;
// Trick for discovering the server Url
private static String getServiceUrl(String serverUrl)
{
OpenBisServiceFactory openBisServiceFactory =
new OpenBisServiceFactory(serverUrl, new DefaultLimsServiceStubFactory());
openBisServiceFactory.createService();
return openBisServiceFactory.getUsedServerUrl() + ResourceNames.QUERY_PLUGIN_SERVER_URL;
}
private static final ServiceFinder SERVICE_FINDER =
new ServiceFinder("openbis", ResourceNames.QUERY_PLUGIN_SERVER_URL);
/**
* Creates a facade for specified server URL, user Id, and password.
*/
public static IQueryApiFacade create(String serverURL, String userID, String password)
{
String serviceUrl = getServiceUrl(serverURL);
IQueryApiServer service =
HttpInvokerUtils.createServiceStub(IQueryApiServer.class, serviceUrl,
SERVER_TIMEOUT_MIN);
IQueryApiServer service = createService(serverURL);
String sessionToken = service.tryToAuthenticateAtQueryServer(userID, password);
if (sessionToken == null)
{
......@@ -62,9 +49,11 @@ public class FacadeFactory
*/
public static IQueryApiFacade create(String serverURL, String sessionToken)
{
IQueryApiServer service =
HttpInvokerUtils.createServiceStub(IQueryApiServer.class, serverURL
+ ResourceNames.QUERY_PLUGIN_SERVER_URL, SERVER_TIMEOUT_MIN);
return new QueryApiFacade(service, sessionToken);
return new QueryApiFacade(createService(serverURL), sessionToken);
}
private static IQueryApiServer createService(String serverURL)
{
return SERVICE_FINDER.createService(IQueryApiServer.class, serverURL);
}
}
/*
* Copyright 2010 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.generic.shared;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.testng.AssertJUnit;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
import ch.systemsx.cisd.openbis.generic.shared.OpenBisServiceFactory;
import ch.systemsx.cisd.openbis.generic.shared.OpenBisServiceFactory.ILimsServiceStubFactory;
/**
* @author Chandrasekhar Ramakrishnan
*/
public class OpenBisServiceFactoryTest extends AssertJUnit
{
private Mockery context;
private IETLLIMSService openBisService;
private ILimsServiceStubFactory stubFactory;
@BeforeMethod
public void setUp()
{
context = new Mockery();
openBisService = context.mock(IETLLIMSService.class);
stubFactory = context.mock(ILimsServiceStubFactory.class);
}
@Test
public void testBasicUse()
{
context.checking(new Expectations()
{
{
one(stubFactory).createServiceStub(
"http://localhost:8888/openbis/openbis/rmi-etl");
will(returnValue(openBisService));
one(openBisService).getVersion();
}
});
OpenBisServiceFactory factory =
new OpenBisServiceFactory("http://localhost:8888", stubFactory);
factory.createService();
context.assertIsSatisfied();
}
@Test
public void testAlternateLocation()
{
context.checking(new Expectations()
{
{
one(stubFactory).createServiceStub(
"http://localhost:8888/openbis/openbis/rmi-etl");
will(returnValue(openBisService));
one(openBisService).getVersion();
will(throwException(new Exception()));
one(stubFactory).createServiceStub("http://localhost:8888/openbis/rmi-etl");
will(returnValue(openBisService));
one(openBisService).getVersion();
}
});
OpenBisServiceFactory factory =
new OpenBisServiceFactory("http://localhost:8888", stubFactory);
factory.createService();
context.assertIsSatisfied();
}
@Test
public void testLocationAlreadySpecified()
{
context.checking(new Expectations()
{
{
one(stubFactory).createServiceStub(
"http://localhost:8888/openbis/openbis/rmi-etl");
will(returnValue(openBisService));
one(openBisService).getVersion();
}
});
OpenBisServiceFactory factory =
new OpenBisServiceFactory("http://localhost:8888/openbis/openbis", stubFactory);
factory.createService();
context.assertIsSatisfied();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment