Client automatic loading from IS configuration
This commit is contained in:
parent
54b6f156da
commit
79c0533999
|
@ -7,7 +7,7 @@ import javax.ws.rs.client.WebTarget;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
import org.gcube.common.clients.Call;
|
import org.gcube.common.clients.Call;
|
||||||
import org.gcube.spatial.data.clients.AbstractGenericClient;
|
import org.gcube.spatial.data.clients.AbstractGenericRESTClient;
|
||||||
import org.gcube.spatial.data.clients.GenericLoginClient;
|
import org.gcube.spatial.data.clients.GenericLoginClient;
|
||||||
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
import org.gcube.spatial.data.sdi.model.credentials.Credentials;
|
import org.gcube.spatial.data.sdi.model.credentials.Credentials;
|
||||||
|
@ -20,7 +20,7 @@ import org.json.simple.JSONObject;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class GSRESTClientImpl extends AbstractGenericClient implements GSRESTClient,GenericLoginClient{
|
public class GSRESTClientImpl extends AbstractGenericRESTClient implements GSRESTClient,GenericLoginClient{
|
||||||
|
|
||||||
private static final String API_BASE_PATH="rest";
|
private static final String API_BASE_PATH="rest";
|
||||||
|
|
||||||
|
@ -29,11 +29,11 @@ public class GSRESTClientImpl extends AbstractGenericClient implements GSRESTCli
|
||||||
private static final String STYLES_BASE_PATH="styles";
|
private static final String STYLES_BASE_PATH="styles";
|
||||||
private static final String LAYERS_BASE_PATH="layers";
|
private static final String LAYERS_BASE_PATH="layers";
|
||||||
|
|
||||||
protected GSRESTClientImpl(ConnectionDescriptor conn) {
|
public GSRESTClientImpl(ConnectionDescriptor conn) {
|
||||||
super(conn);
|
super(conn);
|
||||||
// localhost:8080/geoserver/rest
|
|
||||||
// register(providerClass);
|
setBasePath(API_BASE_PATH);
|
||||||
// getClient().
|
|
||||||
log.info("Connecting to GS @ "+conn.getEndpoint());
|
log.info("Connecting to GS @ "+conn.getEndpoint());
|
||||||
|
|
||||||
Credentials cr=conn.getCredentials().get(0);
|
Credentials cr=conn.getCredentials().get(0);
|
||||||
|
|
|
@ -1,24 +1,25 @@
|
||||||
package org.gcube.spatial.data.clients.geoserver;
|
package org.gcube.spatial.data.clients.geoserver;
|
||||||
|
|
||||||
|
import org.gcube.spatial.data.clients.AbstractGenericClient;
|
||||||
import org.gcube.spatial.data.clients.SDIGenericClient;
|
import org.gcube.spatial.data.clients.SDIGenericClient;
|
||||||
import org.gcube.spatial.data.clients.model.ClientInfo;
|
import org.gcube.spatial.data.clients.model.ClientInfo;
|
||||||
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
|
||||||
import org.gcube.spatial.data.clients.model.engine.Engine;
|
import org.gcube.spatial.data.clients.model.engine.Engine;
|
||||||
import org.gcube.spatial.data.clients.model.engine.Range;
|
import org.gcube.spatial.data.clients.model.engine.Range;
|
||||||
|
|
||||||
public class GeoServerClient implements SDIGenericClient{
|
public class GeoServerClient extends AbstractGenericClient implements SDIGenericClient{
|
||||||
|
|
||||||
|
|
||||||
|
public GeoServerClient() {
|
||||||
|
super(GSRESTClientImpl.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ClientInfo getInfo() {
|
public ClientInfo getInfo() {
|
||||||
return new ClientInfo("gs-rest", "GeoServer REST", "GeoServer REST client", "come class",
|
return new ClientInfo("gs-rest", "GeoServer REST", "GeoServer REST client", "come class",
|
||||||
new Engine(Engine.GS_ENGINE, "Default GeoServerVersion", new Range("2.0.0", null)));
|
new Engine(Engine.GS_ENGINE, "Default GeoServerVersion", new Range("2.0.0", null)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public GSRESTClient getRESTClient(ConnectionDescriptor conn) {
|
|
||||||
return new GSRESTClientImpl(conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package org.gcube.spatial.data.clients.geoserver;
|
package org.gcube.spatial.data.clients.geoserver;
|
||||||
|
|
||||||
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
|
import org.gcube.spatial.data.clients.model.engine.Engine;
|
||||||
|
import org.gcube.spatial.data.sdi.model.credentials.AccessType;
|
||||||
|
import org.gcube.spatial.data.sdi.model.credentials.Credentials;
|
||||||
import org.gcube.spatial.data.sdi.model.faults.RemoteException;
|
import org.gcube.spatial.data.sdi.model.faults.RemoteException;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -14,14 +17,28 @@ public class GSTests {
|
||||||
// String sdiHostname="sdi-d-d4s.d4science.org";
|
// String sdiHostname="sdi-d-d4s.d4science.org";
|
||||||
static String scope = "/gcube/devsec/devVRE";
|
static String scope = "/gcube/devsec/devVRE";
|
||||||
|
|
||||||
|
static ConnectionDescriptor desc;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void gatherCredentials() {
|
||||||
|
desc=new ConnectionDescriptor("https://geoserver1.dev.d4science.org/geoserver");
|
||||||
|
desc.add(new Credentials("admin", "GS-d3v-98751", AccessType.ADMIN));
|
||||||
|
}
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void setScope(){
|
public static void setScope(){
|
||||||
TokenSetter.set(scope);
|
// TokenSetter.set(scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getWS() throws RemoteException, Exception {
|
public void gets() throws RemoteException, Exception {
|
||||||
System.out.println(new GSRESTClientImpl(new ConnectionDescriptor("https://geoserver1.dev.d4science.org/geoserver/rest")).getWorkspaces());
|
// System.out.println(new GSRESTClientImpl(new ConnectionDescriptor("https://geoserver1.dev.d4science.org/geoserver/rest")).getWorkspaces());
|
||||||
|
GSRESTClient client=new GSRESTClientImpl(desc);
|
||||||
|
System.out.println(client.getStyles());
|
||||||
|
|
||||||
|
System.out.println(client.getWorkspaces());
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,147 +1,34 @@
|
||||||
package org.gcube.spatial.data.clients;
|
package org.gcube.spatial.data.clients;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import org.gcube.spatial.data.clients.model.ClientInfo;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.ws.rs.client.Client;
|
|
||||||
import javax.ws.rs.client.ClientBuilder;
|
|
||||||
import javax.ws.rs.client.Entity;
|
|
||||||
import javax.ws.rs.client.WebTarget;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
|
|
||||||
import org.gcube.common.clients.Call;
|
|
||||||
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
import org.gcube.spatial.data.sdi.model.faults.RemoteException;
|
|
||||||
import org.gcube.spatial.data.sdi.model.metadata.TemplateDescriptor;
|
|
||||||
import org.glassfish.jersey.client.ClientConfig;
|
|
||||||
import org.glassfish.jersey.client.ClientProperties;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
public abstract class AbstractGenericClient implements SDIGenericClient {
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public abstract class AbstractGenericClient {
|
|
||||||
|
|
||||||
private static ObjectMapper mapper = new ObjectMapper();
|
|
||||||
|
|
||||||
static {
|
|
||||||
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
|
|
||||||
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
|
|
||||||
mapper.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, false);
|
|
||||||
mapper.setSerializationInclusion(Include.NON_NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ClientConfig config=new ClientConfig();
|
|
||||||
private ConnectionDescriptor conn;
|
private ConnectionDescriptor conn;
|
||||||
|
private Class<?> restClientClass;
|
||||||
|
|
||||||
|
|
||||||
private Client client;
|
public AbstractGenericClient(Class<?> clazz) {
|
||||||
|
this.restClientClass=clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getRESTClient() {
|
||||||
|
try {
|
||||||
protected AbstractGenericClient(ConnectionDescriptor conn) {
|
return restClientClass.getConstructor(ConnectionDescriptor.class).newInstance(conn);
|
||||||
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
|
||||||
|
| NoSuchMethodException | SecurityException e) {
|
||||||
|
throw new RuntimeException("Unable to instantiate class "+restClientClass,e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SDIGenericClient at(ConnectionDescriptor conn) {
|
||||||
this.conn=conn;
|
this.conn=conn;
|
||||||
config.register(AuthorizationFilter.class);
|
return this;
|
||||||
}
|
|
||||||
|
|
||||||
protected void register(Class<?> providerClass) {
|
|
||||||
config.register(providerClass);
|
|
||||||
client=null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void register(Object provider) {
|
|
||||||
config.register(provider);
|
|
||||||
client=null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Client getClient() {
|
|
||||||
if(client==null) {
|
|
||||||
client = ClientBuilder.newClient(config)
|
|
||||||
.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
|
|
||||||
}
|
|
||||||
return client;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected WebTarget resolve() {
|
|
||||||
return getClient().target(conn.getEndpoint());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected <T> T makeCall(Call<WebTarget, T> call) throws Exception{
|
|
||||||
try{
|
|
||||||
return call.call(resolve());
|
|
||||||
}catch(RemoteException e) {
|
|
||||||
throw e;
|
|
||||||
}catch(Throwable t) {
|
|
||||||
throw new Exception(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected JSONObject get(String path) throws Exception {
|
|
||||||
return get(path,JSONObject.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void delete(String path) throws Exception {
|
|
||||||
check(resolve().path(path).request(MediaType.APPLICATION_JSON).delete(),null);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void post(String path,Entity<?> entity)throws Exception{
|
|
||||||
post(path,entity,null);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected <T> T post(String path,Entity<?> entity,Class<T> returnClazz) throws Exception {
|
|
||||||
return makeCall(new Call<WebTarget, T>() {
|
|
||||||
|
|
||||||
public T call(WebTarget endpoint) throws Exception {
|
|
||||||
return check(endpoint.path(path).request(MediaType.APPLICATION_JSON).
|
|
||||||
post(entity),returnClazz);
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected <T> T get(String path, Class<T> clazz) throws Exception{
|
|
||||||
return makeCall(new Call<WebTarget, T>() {
|
|
||||||
|
|
||||||
public T call(WebTarget endpoint) throws Exception {
|
|
||||||
return check(endpoint.path(path).request(MediaType.APPLICATION_JSON).get(),clazz);
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected static <T> T check(Response resp, Class<T> clazz) throws RemoteException{
|
|
||||||
if(resp.getStatus()<200||resp.getStatus()>=300) {
|
|
||||||
String remoteMessage=resp.readEntity(String.class);
|
|
||||||
Integer httpCode=resp.getStatus();
|
|
||||||
RemoteException e=new RemoteException("RESP STATUS IS "+httpCode+". Message : "+remoteMessage);
|
|
||||||
e.setRemoteMessage(remoteMessage);
|
|
||||||
e.setResponseHTTPCode(httpCode);
|
|
||||||
throw e;
|
|
||||||
}else {
|
|
||||||
if(clazz==null) return null;
|
|
||||||
String respString=resp.readEntity(String.class);
|
|
||||||
if(clazz==String.class) return (T) respString;
|
|
||||||
try {
|
|
||||||
return mapper.readValue(respString, clazz);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RemoteException("Unable to parse response from Zenodo. Content was : \n "+respString,e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
package org.gcube.spatial.data.clients;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.ws.rs.client.Client;
|
||||||
|
import javax.ws.rs.client.ClientBuilder;
|
||||||
|
import javax.ws.rs.client.Entity;
|
||||||
|
import javax.ws.rs.client.WebTarget;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
import org.gcube.common.clients.Call;
|
||||||
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
|
import org.gcube.spatial.data.sdi.model.faults.RemoteException;
|
||||||
|
import org.glassfish.jersey.client.ClientConfig;
|
||||||
|
import org.glassfish.jersey.client.ClientProperties;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public abstract class AbstractGenericRESTClient {
|
||||||
|
|
||||||
|
private static ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
||||||
|
static {
|
||||||
|
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
|
||||||
|
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
|
||||||
|
mapper.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, false);
|
||||||
|
mapper.setSerializationInclusion(Include.NON_NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private ClientConfig config=new ClientConfig();
|
||||||
|
private ConnectionDescriptor conn;
|
||||||
|
|
||||||
|
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private String basePath=null;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected AbstractGenericRESTClient(ConnectionDescriptor conn) {
|
||||||
|
this.conn=conn;
|
||||||
|
config.register(AuthorizationFilter.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void register(Class<?> providerClass) {
|
||||||
|
config.register(providerClass);
|
||||||
|
client=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void register(Object provider) {
|
||||||
|
config.register(provider);
|
||||||
|
client=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Client getClient() {
|
||||||
|
if(client==null) {
|
||||||
|
client = ClientBuilder.newClient(config)
|
||||||
|
.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
|
||||||
|
}
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected WebTarget resolve() {
|
||||||
|
WebTarget toReturn =getClient().target(conn.getEndpoint());
|
||||||
|
if(basePath!=null) return toReturn.path(basePath);
|
||||||
|
else return toReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected <T> T makeCall(Call<WebTarget, T> call) throws Exception{
|
||||||
|
try{
|
||||||
|
return call.call(resolve());
|
||||||
|
}catch(RemoteException e) {
|
||||||
|
throw e;
|
||||||
|
}catch(Throwable t) {
|
||||||
|
throw new Exception(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected JSONObject get(String path) throws Exception {
|
||||||
|
return get(path,JSONObject.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void delete(String path) throws Exception {
|
||||||
|
check(resolve().path(path).request(MediaType.APPLICATION_JSON).delete(),null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void post(String path,Entity<?> entity)throws Exception{
|
||||||
|
post(path,entity,null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected <T> T post(String path,Entity<?> entity,Class<T> returnClazz) throws Exception {
|
||||||
|
return makeCall(new Call<WebTarget, T>() {
|
||||||
|
|
||||||
|
public T call(WebTarget endpoint) throws Exception {
|
||||||
|
return check(endpoint.path(path).request(MediaType.APPLICATION_JSON).
|
||||||
|
post(entity),returnClazz);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected <T> T get(String path, Class<T> clazz) throws Exception{
|
||||||
|
return makeCall(new Call<WebTarget, T>() {
|
||||||
|
|
||||||
|
public T call(WebTarget endpoint) throws Exception {
|
||||||
|
return check(endpoint.path(path).request(MediaType.APPLICATION_JSON).get(),clazz);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected static <T> T check(Response resp, Class<T> clazz) throws RemoteException{
|
||||||
|
if(resp.getStatus()<200||resp.getStatus()>=300) {
|
||||||
|
String remoteMessage=resp.readEntity(String.class);
|
||||||
|
Integer httpCode=resp.getStatus();
|
||||||
|
RemoteException e=new RemoteException("RESP STATUS IS "+httpCode+". Message : "+remoteMessage);
|
||||||
|
e.setRemoteMessage(remoteMessage);
|
||||||
|
e.setResponseHTTPCode(httpCode);
|
||||||
|
throw e;
|
||||||
|
}else {
|
||||||
|
if(clazz==null) return null;
|
||||||
|
String respString=resp.readEntity(String.class);
|
||||||
|
if(clazz==String.class) return (T) respString;
|
||||||
|
try {
|
||||||
|
return mapper.readValue(respString, clazz);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RemoteException("Unable to parse response from Zenodo. Content was : \n "+respString,e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -3,7 +3,7 @@ package org.gcube.spatial.data.clients;
|
||||||
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
|
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
|
||||||
|
|
||||||
public class TestClient extends AbstractGenericClient{
|
public class TestClient extends AbstractGenericRESTClient{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,48 @@
|
||||||
package org.gcube.spatial.data.clients;
|
package org.gcube.spatial.data.clients;
|
||||||
|
|
||||||
import static org.junit.Assert.assertFalse;
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
import static org.junit.Assert.assertTrue;
|
import org.gcube.spatial.data.clients.model.engine.Engine;
|
||||||
|
import org.gcube.spatial.data.sdi.model.faults.RemoteException;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class Tests {
|
public class Tests {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// static String sdiHostname="sdi-t.pre.d4science.org";
|
||||||
|
// static String scope ="/pred4s/preprod/preVRE";
|
||||||
|
//
|
||||||
|
static String basePath="";
|
||||||
|
static String scope = "/gcube/devsec/devVRE";
|
||||||
|
|
||||||
|
|
||||||
|
static ConnectionDescriptor DEV_SDI=new ConnectionDescriptor("https://sdi.d4science.org/sdi-service/gcube/service/");
|
||||||
|
|
||||||
|
static ConnectionDescriptor DEV_GS=new ConnectionDescriptor("https://geoserver1.dev.d4science.org/geoserver/rest");
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setScope(){
|
||||||
|
TokenSetter.set(scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testContext() throws RemoteException, Exception {
|
||||||
|
|
||||||
|
|
||||||
|
new TestClient(DEV_SDI).get("SDI");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBasicAuth() throws RemoteException, Exception {
|
||||||
|
|
||||||
|
|
||||||
|
TestClient c=new TestClient(DEV_GS);
|
||||||
|
c.setHttpBasicAuth("admin", "GS-d3v-98751");
|
||||||
|
c.get("workspaces");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,14 +2,19 @@ package org.gcube.spatial.data.clients;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.ServiceLoader;
|
import java.util.ServiceLoader;
|
||||||
|
|
||||||
|
import org.gcube.spatial.data.clients.model.ClientInfo;
|
||||||
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class SDIClientManager {
|
public class SDIClientManager {
|
||||||
|
|
||||||
private Collection<SDIGenericClient> clients=new ArrayList<SDIGenericClient>();
|
private List<SDIGenericClient> clients=new ArrayList<SDIGenericClient>();
|
||||||
|
|
||||||
public SDIClientManager() {
|
public SDIClientManager() {
|
||||||
ServiceLoader.load(SDIGenericClient.class).forEach((SDIGenericClient c)->{clients.add(c);});
|
ServiceLoader.load(SDIGenericClient.class).forEach((SDIGenericClient c)->{clients.add(c);});
|
||||||
|
@ -36,4 +41,25 @@ public class SDIClientManager {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the implementation for the target engine's Connection. Null if no suitable plugin is found
|
||||||
|
*
|
||||||
|
* @param engine
|
||||||
|
* @param version
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public SDIGenericClient get(ConnectionDescriptor conn) throws Exception {
|
||||||
|
SDIGenericClient toReturn=get(conn.getEngineUniqueID(),conn.getVersion());
|
||||||
|
if(toReturn==null) throw new Exception("Unable to get client for "+conn.getEngineUniqueID()+" "+conn.getVersion());
|
||||||
|
return toReturn.at(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClientInfo> list(){
|
||||||
|
List<ClientInfo> toReturn=new ArrayList<ClientInfo>();
|
||||||
|
clients.forEach((SDIGenericClient c)->{toReturn.add(c.getInfo());});
|
||||||
|
return toReturn;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,8 @@ public interface SDIGenericClient {
|
||||||
|
|
||||||
public ClientInfo getInfo();
|
public ClientInfo getInfo();
|
||||||
|
|
||||||
public Object getRESTClient(ConnectionDescriptor conn);
|
public Object getRESTClient();
|
||||||
|
|
||||||
|
|
||||||
|
public SDIGenericClient at(ConnectionDescriptor conn);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,4 +17,7 @@ public class ConnectionDescriptor {
|
||||||
|
|
||||||
@Delegate
|
@Delegate
|
||||||
private List<Credentials> credentials=new ArrayList<Credentials>();
|
private List<Credentials> credentials=new ArrayList<Credentials>();
|
||||||
|
|
||||||
|
private String engineUniqueID;
|
||||||
|
private String version;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import javax.xml.bind.annotation.XmlAccessType;
|
||||||
import javax.xml.bind.annotation.XmlAccessorType;
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
import org.gcube.spatial.data.clients.model.engine.ComparableVersion;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
@ -26,4 +28,8 @@ public class Version {
|
||||||
public Version(Integer maj,Integer min, Integer build){
|
public Version(Integer maj,Integer min, Integer build){
|
||||||
this(maj.shortValue(),min.shortValue(),build.shortValue());
|
this(maj.shortValue(),min.shortValue(),build.shortValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ComparableVersion asComparable() {
|
||||||
|
return new ComparableVersion(major+"."+minor+"."+build);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import org.gcube.spatial.data.clients.SDIClientManager;
|
import org.gcube.spatial.data.clients.SDIClientManager;
|
||||||
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
|
import org.gcube.spatial.data.clients.model.engine.ComparableVersion;
|
||||||
import org.gcube.spatial.data.clients.model.engine.Range;
|
import org.gcube.spatial.data.clients.model.engine.Range;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,12 @@ public class DumbGNClient implements SDIGenericClient{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getRESTClient(ConnectionDescriptor conn) {
|
public Object getRESTClient() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public SDIGenericClient at(ConnectionDescriptor conn) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ import org.gcube.common.clients.delegates.ProxyDelegate;
|
||||||
import org.gcube.spatia.data.model.profiles.ApplicationProfile;
|
import org.gcube.spatia.data.model.profiles.ApplicationProfile;
|
||||||
import org.gcube.spatial.data.clients.SDIClientManager;
|
import org.gcube.spatial.data.clients.SDIClientManager;
|
||||||
import org.gcube.spatial.data.clients.SDIGenericClient;
|
import org.gcube.spatial.data.clients.SDIGenericClient;
|
||||||
|
import org.gcube.spatial.data.clients.model.ClientInfo;
|
||||||
|
import org.gcube.spatial.data.clients.model.ConnectionDescriptor;
|
||||||
import org.gcube.spatial.data.clients.model.engine.Engine;
|
import org.gcube.spatial.data.clients.model.engine.Engine;
|
||||||
import org.gcube.spatial.data.sdi.interfaces.SDIManagement;
|
import org.gcube.spatial.data.sdi.interfaces.SDIManagement;
|
||||||
import org.gcube.spatial.data.sdi.model.ScopeConfiguration;
|
import org.gcube.spatial.data.sdi.model.ScopeConfiguration;
|
||||||
|
@ -21,15 +23,19 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
public class DefaultSDIManagement implements SDIManagement{
|
public class DefaultSDIManagement implements SDIManagement{
|
||||||
|
|
||||||
private final ProxyDelegate<WebTarget> delegate;
|
private final ProxyDelegate<WebTarget> delegate;
|
||||||
|
|
||||||
private SDIClientManager clientManager=new SDIClientManager();
|
private SDIClientManager clientManager=null;
|
||||||
|
|
||||||
public DefaultSDIManagement(ProxyDelegate<WebTarget> delegate) {
|
public DefaultSDIManagement(ProxyDelegate<WebTarget> delegate) {
|
||||||
this.delegate=delegate;
|
this.delegate=delegate;
|
||||||
|
clientManager=new SDIClientManager();
|
||||||
|
log.debug("Available clients are ");
|
||||||
|
clientManager.list().forEach((ClientInfo c)->{
|
||||||
|
log.debug("{}",c);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ScopeConfiguration getConfiguration() throws RemoteException {
|
public ScopeConfiguration getConfiguration() throws RemoteException {
|
||||||
Call<WebTarget, ScopeConfiguration> call=new Call<WebTarget,ScopeConfiguration>(){
|
Call<WebTarget, ScopeConfiguration> call=new Call<WebTarget,ScopeConfiguration>(){
|
||||||
|
@ -44,7 +50,7 @@ public class DefaultSDIManagement implements SDIManagement{
|
||||||
throw new RemoteException(e);
|
throw new RemoteException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HealthReport getReport() throws RemoteException {
|
public HealthReport getReport() throws RemoteException {
|
||||||
Call<WebTarget, HealthReport> call=new Call<WebTarget,HealthReport>(){
|
Call<WebTarget, HealthReport> call=new Call<WebTarget,HealthReport>(){
|
||||||
|
@ -59,8 +65,8 @@ public class DefaultSDIManagement implements SDIManagement{
|
||||||
throw new RemoteException(e);
|
throw new RemoteException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ApplicationProfile getProfile(String serviceClass,String serviceName) throws RemoteException {
|
public ApplicationProfile getProfile(String serviceClass,String serviceName) throws RemoteException {
|
||||||
Call<WebTarget, ApplicationProfile> call=new Call<WebTarget,ApplicationProfile>(){
|
Call<WebTarget, ApplicationProfile> call=new Call<WebTarget,ApplicationProfile>(){
|
||||||
|
@ -76,14 +82,14 @@ public class DefaultSDIManagement implements SDIManagement{
|
||||||
throw new RemoteException(e);
|
throw new RemoteException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SDIGenericClient getClientByEngineId(String engineId) throws Exception {
|
public SDIGenericClient getClientByEngineId(String engineId) throws Exception {
|
||||||
ScopeConfiguration conf=getConfiguration();
|
ScopeConfiguration conf=getConfiguration();
|
||||||
|
|
||||||
GeoServiceDescriptor desc=null;
|
GeoServiceDescriptor desc=null;
|
||||||
log.info("Looking for {} under {} ",engineId,conf.getContextName());
|
log.info("Looking for {} under {} ",engineId,conf.getContextName());
|
||||||
|
|
||||||
switch (engineId) {
|
switch (engineId) {
|
||||||
case Engine.GN_ENGINE:
|
case Engine.GN_ENGINE:
|
||||||
if(conf.getGeonetworkConfiguration().size()>0)
|
if(conf.getGeonetworkConfiguration().size()>0)
|
||||||
|
@ -100,10 +106,17 @@ public class DefaultSDIManagement implements SDIManagement{
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(desc==null) throw new Exception("No "+engineId+" available in current context. Check ScopeConfiguration object.");
|
if(desc==null) throw new Exception("No "+engineId+" available in current context. Check ScopeConfiguration object.");
|
||||||
else log.info("Getting client for "+desc);
|
else log.info("Getting client for "+desc);
|
||||||
|
|
||||||
return clientManager.get(engineId, desc.getVersion().toString());
|
SDIGenericClient c=clientManager.get(engineId, desc.getVersion().asComparable().getCanonical());
|
||||||
|
if(c==null) throw new RuntimeException("No implementation available for "+engineId +":"+desc.getVersion().asComparable().getCanonical());
|
||||||
|
|
||||||
|
ConnectionDescriptor conn=new ConnectionDescriptor(desc.getBaseEndpoint());
|
||||||
|
conn.addAll(desc.getAccessibleCredentials());
|
||||||
|
log.debug("Setting defult connection {}",conn);
|
||||||
|
|
||||||
|
return c.at(conn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package org.gcube.spatial.data.sdi;
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
|
||||||
|
import org.gcube.spatial.data.clients.geoserver.GSRESTClient;
|
||||||
import org.gcube.spatial.data.clients.model.engine.Engine;
|
import org.gcube.spatial.data.clients.model.engine.Engine;
|
||||||
import org.gcube.spatial.data.sdi.interfaces.SDIManagement;
|
import org.gcube.spatial.data.sdi.interfaces.SDIManagement;
|
||||||
import org.gcube.spatial.data.sdi.model.faults.RemoteException;
|
import org.gcube.spatial.data.sdi.model.faults.RemoteException;
|
||||||
|
@ -28,5 +29,9 @@ public class SDITests extends BasicScopedTests{
|
||||||
public void getGS() throws Exception {
|
public void getGS() throws Exception {
|
||||||
System.out.println(
|
System.out.println(
|
||||||
SDIAbstractPlugin.management().build().getClientByEngineId(Engine.GS_ENGINE).getInfo());
|
SDIAbstractPlugin.management().build().getClientByEngineId(Engine.GS_ENGINE).getInfo());
|
||||||
|
|
||||||
|
GSRESTClient gs=(GSRESTClient) SDIAbstractPlugin.management().build().getClientByEngineId(Engine.GS_ENGINE).getRESTClient();
|
||||||
|
gs.getWorkspaces();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue