commit d23b6b7080326851715c998f2c0255dc5ecf38bb Author: Lucio Lelii Date: Wed Feb 1 16:16:46 2017 +0000 release 4.3 git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/branches/data-access/spd-client-library/4.0@141993 82a268e6-3cf1-43bd-a215-b396298e98cf diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..e43402f --- /dev/null +++ b/.classpath @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..9e6176a --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + spd-client-library + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..65784b9 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,7 @@ +#Fri Sep 20 15:12:31 CEST 2013 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..ec4300d --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..8e16da9 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,5 @@ +#Fri Jul 06 19:36:30 CEST 2012 +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/distro/INSTALL b/distro/INSTALL new file mode 100644 index 0000000..ce0e21d --- /dev/null +++ b/distro/INSTALL @@ -0,0 +1 @@ +Used as a Library in the gCube Framework \ No newline at end of file diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..630ba97 --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1,6 @@ +gCube System - License +------------------------------------------------------------ + +The gCube/gCore software is licensed as Free Open Source software conveying to the EUPL (http://ec.europa.eu/idabc/eupl). +The software and documentation is provided by its authors/distributors "as is" and no expressed or +implied warranty is given for its use, quality or fitness for a particular case. diff --git a/distro/MAINTAINERS b/distro/MAINTAINERS new file mode 100644 index 0000000..84395c3 --- /dev/null +++ b/distro/MAINTAINERS @@ -0,0 +1,2 @@ +Lucio lelii (lucio.lelii@isti.cnr.it), CNR Pisa, +Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo". diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..c68a236 --- /dev/null +++ b/distro/README @@ -0,0 +1,47 @@ +The gCube System - spd client library + +------------------------------------------------------------ + +This work has been partially supported by the following European projects: DILIGENT (FP6-2003-IST-2), +D4Science (FP7-INFRA-2007-1.2.2), D4Science-II (FP7-INFRA-2008-1.2.2), iMarine (FP7-INFRASTRUCTURES-2011-2), +and EUBrazilOpenBio (FP7-ICT-2011-EU-Brazil). + + +Authors +------- + +* Lucio Lelii (lucio.lelii@isti.cnr.it), CNR Pisa, + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo". + + +Version and Release Date +------------------------ + +v. 1.0.0 (04-05-2012) + * First release + + +Description +----------- + + + + Download information +-------------------- + + + +Documentation +------------- + +Documentation is available on-line from the Projects Documentation Wiki: +https://gcube.wiki.gcube-system.org/gcube/index.php/Biodiversity_Access + + +Licensing +--------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. + + + diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..f8bf6da --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,27 @@ + + + species products discovery client library release + + + new calls added + + + new calls from execution portType + + + porting to FWK framework + + + porting to spd model 2.0.0 + + + better exception management added + getErrorLink added to Execution PortType + + + changed return of getPluginDescription in case of empty set of plugins + + + moved to smartgears + + \ No newline at end of file diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..21d8c88 --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,42 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + INSTALL + MAINTAINERS + changelog.xml + + 755 + true + + + + + ${distroDirectory}/profile.xml + / + true + + + target/${build.finalName}.jar + /${artifactId} + + + ${distroDirectory}/svnpath.txt + /${artifactId} + true + + + \ No newline at end of file diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..62d5fef --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,29 @@ + + + + Service + + ${description} + DataAccess + ${artifactId} + 1.0.0 + + + ${description} + ${artifactId} + ${version} + + ${groupId} + ${artifactId} + ${version} + + library + + ${build.finalName}.jar + + + + + + + diff --git a/distro/svnpath.txt b/distro/svnpath.txt new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2109eac --- /dev/null +++ b/pom.xml @@ -0,0 +1,104 @@ + + 4.0.0 + + maven-parent + org.gcube.tools + 1.0.0 + + + org.gcube.data.spd + spd-client-library + 4.0.0-SNAPSHOT + spd-client-library + species products discovery client library + + + + + org.gcube.distribution + gcube-bom + 1.0.0-SNAPSHOT + pom + import + + + + + + + + org.gcube.data.spd + spd-model + [3.0.0-SNAPSHOT, 4.0.0-SNAPSHOT) + + + org.gcube.core + common-gcube-calls + + + org.gcube.common + common-jaxrs-client + 1.0.0-SNAPSHOT + + + org.gcube.data.access + streams + [2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT) + + + org.gcube.core + common-generic-clients + + + org.glassfish.jersey.core + jersey-client + 2.24.1 + + + + org.glassfish.jersey.media + jersey-media-jaxb + 2.24.1 + + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + 1.6.4 + test + + + junit + junit + 4.10 + test + + + + + local-deploy + + + + org.gcube.tools + maven-service-plugin + + + package + + local-deploy + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/data/spd/client/Constants.java b/src/main/java/org/gcube/data/spd/client/Constants.java new file mode 100644 index 0000000..68b90ed --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/Constants.java @@ -0,0 +1,43 @@ +package org.gcube.data.spd.client; + +import java.util.concurrent.TimeUnit; + +import javax.xml.namespace.QName; + +public class Constants { + + /** Service name. */ + public static final String SERVICE_NAME = "SpeciesProductsDiscovery"; + + /** Service class. */ + public static final String SERVICE_CLASS = "DataAccess"; + + public static final int DEFAULT_TIMEOUT= (int) TimeUnit.SECONDS.toMillis(10); + + public static final String NAMESPACE = "http://gcube-system.org/namespaces/data/speciesproductsdiscovery"; + + public static final QName MANAGER_QNAME = new QName(NAMESPACE, "manager"); + + public static final QName CLASSIFICATION_QNAME = new QName(NAMESPACE, "classification"); + + public static final QName OCCURRENCE_QNAME = new QName(NAMESPACE, "occurrence"); + + public static final QName EXECUTOR_QNAME = new QName(NAMESPACE, "executor"); + + public static final QName RESULTSET_QNAME = new QName(NAMESPACE, "resultset"); + +/* + public static final GcubeService manager = service().withName(org.gcube.data.spd.model.service.Constants.manager_name).andInterface(ManagerStubs.class); + + public static final GcubeService classification = service().withName(org.gcube.data.spd.model.service.Constants.classification_name).andInterface(ClassificationStubs.class); + + public static final GcubeService executor = service().withName(org.gcube.data.spd.model.service.Constants.executor_name).andInterface(ExecutorStubs.class); + + public static final GcubeService occurrence = service().withName(org.gcube.data.spd.model.service.Constants.occurrence_name).andInterface(OccurrenceStubs.class); + + private static final GcubeService remoteDispatcher = service().withName(org.gcube.data.spd.model.service.Constants.remoteDispatcher_name).andInterface(RemoteDispatcher.class); + + public static final RemoteDispatcher getRemoteDispatcherService(String address){ + return stubFor(remoteDispatcher).at(address); + }*/ +} diff --git a/src/main/java/org/gcube/data/spd/client/JerseyRecordIterator.java b/src/main/java/org/gcube/data/spd/client/JerseyRecordIterator.java new file mode 100644 index 0000000..4ab47de --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/JerseyRecordIterator.java @@ -0,0 +1,177 @@ +package org.gcube.data.spd.client; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.util.Iterator; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLEventWriter; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.EndElement; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.XMLEvent; + +import org.gcube.data.spd.client.plugins.AbstractPlugin; +import org.gcube.data.spd.client.proxies.ResultSetClient; +import org.glassfish.jersey.client.ChunkParser; +import org.glassfish.jersey.client.ChunkedInput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class JerseyRecordIterator implements Iterator, Closeable{ + + private Logger logger = LoggerFactory.getLogger(JerseyRecordIterator.class); + + private ChunkedInput chunkedInput; + + private LinkedBlockingQueue queue = new LinkedBlockingQueue(); + + private long INTERNAL_TIMEOUT_IN_MILLIS = 1000; + + private long timeoutInMillis; + + private ResultSetClient resultSetClient; + + private String locator; + + private ChunkedInputReader chunkedInputReader; + + public JerseyRecordIterator(ResultLocator locator, long timeout, TimeUnit timeoutUnit) { + this.resultSetClient = AbstractPlugin.resultset().at(locator.getHost(), locator.getPort()).build(); + this.locator = locator.getLocator(); + this.timeoutInMillis = timeoutUnit.toMillis(timeout); + } + + String currentElement; + + @Override + public boolean hasNext() { + if (this.chunkedInput==null) + initializeChunckedInput(); + + + if (chunkedInput.isClosed() && queue.isEmpty()) return false; + try { + long startTime = System.currentTimeMillis(); + String retrievedElement = null; + while(retrievedElement==null && (System.currentTimeMillis()-startTime)<=timeoutInMillis + && (!chunkedInput.isClosed() || !queue.isEmpty() )) + retrievedElement = queue.poll(INTERNAL_TIMEOUT_IN_MILLIS, TimeUnit.MILLISECONDS); + + currentElement = retrievedElement; + return currentElement!=null; + } catch (InterruptedException e) { + logger.warn("timeout expired", e); + return false; + } + } + + private void initializeChunckedInput(){ + this.chunkedInput = resultSetClient.getResultSet(locator); + this.chunkedInput.setParser(new RecordChunkParser()); + this.chunkedInputReader = new ChunkedInputReader(); + this.chunkedInputReader.start(); + } + + @Override + public T next() { + try { + return convertFromString(currentElement); + } catch (Exception e) { + logger.warn("error deserializing element", e); + return null; + } + } + + public abstract T convertFromString(String element); + + @Override + public void remove() { + chunkedInput.close(); + this.chunkedInputReader.interrupt(); + resultSetClient.closeResultSet(locator); + queue = null; + } + + + + @Override + public void close() throws IOException { + logger.debug("closing iterator"); + this.remove(); + } + + + + class RecordChunkParser implements ChunkParser{ + + public byte[] readChunk(InputStream responseStream) throws IOException { + XMLEventReader xmlr =null; + XMLOutputFactory of =null; + XMLEventWriter xmlSW =null; + try{ + XMLInputFactory xmlif = XMLInputFactory.newInstance(); + xmlr = xmlif.createXMLEventReader(responseStream); + of = XMLOutputFactory.newInstance(); + xmlSW = null; + StringWriter sw=new StringWriter(); + while (xmlr.hasNext() && queue!=null) { + XMLEvent e = xmlr.nextEvent(); + int eventType = e.getEventType(); + if (eventType == XMLStreamConstants.START_ELEMENT + && ((StartElement) e).getName().getLocalPart().equals("Result")) { + xmlSW = of.createXMLEventWriter(sw); + } else if (eventType == XMLStreamConstants.END_ELEMENT + && ((EndElement) e).getName().getLocalPart().equals("Result")) { + queue.add(sw.toString()); + sw=new StringWriter(); + xmlSW.close(); + xmlSW= null; + }else if ( eventType == XMLStreamConstants.END_ELEMENT && ((EndElement) e).getName().getLocalPart().equals("Results")){ + //THE STREAM IS ARRIVED + break; + } else if (xmlSW!=null){ + xmlSW.add(e); + } + } + }catch(Exception e){ + logger.error("error parsing the input",e); + throw new IOException(e); + } finally { + try { + if (xmlr!=null) + xmlr.close(); + } catch (XMLStreamException e) { + logger.warn("error closing the event reader",e); + } + try { + if (xmlSW!=null) + xmlSW.close(); + } catch (XMLStreamException e) { + logger.warn("error closing the event writer",e); + } + } + return null; + } + + } + + class ChunkedInputReader extends Thread{ + + @Override + public void run() { + while (!chunkedInput.isClosed() && chunkedInput.read() != null) { + } + } + + + } + +} diff --git a/src/main/java/org/gcube/data/spd/client/ResultElementRecordIterator.java b/src/main/java/org/gcube/data/spd/client/ResultElementRecordIterator.java new file mode 100644 index 0000000..0ceb2be --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/ResultElementRecordIterator.java @@ -0,0 +1,26 @@ +package org.gcube.data.spd.client; + +import java.util.concurrent.TimeUnit; + +import javax.xml.bind.JAXBException; + +import org.gcube.data.spd.model.binding.Bindings; +import org.gcube.data.spd.model.products.ResultElement; + +public class ResultElementRecordIterator extends JerseyRecordIterator { + + public ResultElementRecordIterator(ResultLocator locator, + long timeout, TimeUnit timeoutUnit) { + super(locator, timeout, timeoutUnit); + } + + @Override + public T convertFromString(String element) { + try { + return Bindings.fromXml(currentElement); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/org/gcube/data/spd/client/ResultGenerator.java b/src/main/java/org/gcube/data/spd/client/ResultGenerator.java new file mode 100644 index 0000000..1d68f7c --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/ResultGenerator.java @@ -0,0 +1,24 @@ +package org.gcube.data.spd.client; + +import gr.uoa.di.madgik.grs.record.GenericRecord; +import gr.uoa.di.madgik.grs.record.field.StringField; + +import org.gcube.data.spd.model.binding.Bindings; +import org.gcube.data.streams.exceptions.StreamSkipSignal; +import org.gcube.data.streams.generators.Generator; + +public class ResultGenerator implements Generator { + + + public ResultGenerator(){} + + @Override + public T yield(GenericRecord record) { + try { + return Bindings.fromXml(((StringField)record.getField("result")).getPayload()); + } catch (Exception e) { + throw new StreamSkipSignal(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/data/spd/client/ResultLocator.java b/src/main/java/org/gcube/data/spd/client/ResultLocator.java new file mode 100644 index 0000000..211399e --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/ResultLocator.java @@ -0,0 +1,29 @@ +package org.gcube.data.spd.client; + +public class ResultLocator { + + private String host; + private int port; + private String locator; + + public ResultLocator(String host, int port, String locator) { + super(); + this.host = host; + this.port = port; + this.locator = locator; + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + public String getLocator() { + return locator; + } + + +} diff --git a/src/main/java/org/gcube/data/spd/client/Utils.java b/src/main/java/org/gcube/data/spd/client/Utils.java new file mode 100644 index 0000000..128bd3e --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/Utils.java @@ -0,0 +1,13 @@ +package org.gcube.data.spd.client; + +import javax.ws.rs.core.Response; + +public class Utils { + + public static String getLocatorFromResponse(Response response){ + String path = response.getLocation().getPath(); + String[] splitPath = path.split("/"); + String locator = splitPath[splitPath.length-1].isEmpty()?splitPath[splitPath.length-2]:splitPath[splitPath.length-1]; + return locator; + } +} diff --git a/src/main/java/org/gcube/data/spd/client/plugins/AbstractPlugin.java b/src/main/java/org/gcube/data/spd/client/plugins/AbstractPlugin.java new file mode 100644 index 0000000..3686086 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/plugins/AbstractPlugin.java @@ -0,0 +1,72 @@ +package org.gcube.data.spd.client.plugins; + +import javax.ws.rs.client.WebTarget; + +import org.gcube.common.clients.Plugin; +import org.gcube.common.clients.ProxyBuilder; +import org.gcube.common.clients.ProxyBuilderImpl; +import org.gcube.data.spd.client.Constants; +import org.gcube.data.spd.client.proxies.ClassificationClient; +import org.gcube.data.spd.client.proxies.ExecutorClient; +import org.gcube.data.spd.client.proxies.ManagerClient; +import org.gcube.data.spd.client.proxies.OccurrenceClient; +import org.gcube.data.spd.client.proxies.ResultSetClient; + + + +public abstract class AbstractPlugin implements Plugin { + + private static final ManagerPlugin manager_plugin = new ManagerPlugin(); + private static final OccurrencePlugin occurrence_plugin = new OccurrencePlugin(); + private static final ClassificationPlugin classification_plugin = new ClassificationPlugin(); + private static final ExecutorPlugin executor_plugin = new ExecutorPlugin(); + private static final ResultSetPlugin resultset_plugin = new ResultSetPlugin(); + + + public static ProxyBuilder manager() { + return new ProxyBuilderImpl(manager_plugin); + } + + public static ProxyBuilder classification() { + return new ProxyBuilderImpl(classification_plugin); + } + + public static ProxyBuilder occurrences() { + return new ProxyBuilderImpl(occurrence_plugin); + } + + public static ProxyBuilder executor() { + return new ProxyBuilderImpl(executor_plugin); + } + + public static ProxyBuilder resultset() { + return new ProxyBuilderImpl(resultset_plugin); + } + + public final String name; + + public AbstractPlugin(String name) { + this.name=name; + } + + @Override + public String serviceClass() { + return Constants.SERVICE_CLASS; + } + + @Override + public String serviceName() { + return Constants.SERVICE_NAME; + } + + @Override + public String namespace() { + return Constants.NAMESPACE; + } + + @Override + public String name() { + return name; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/data/spd/client/plugins/ClassificationPlugin.java b/src/main/java/org/gcube/data/spd/client/plugins/ClassificationPlugin.java new file mode 100644 index 0000000..b6a9806 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/plugins/ClassificationPlugin.java @@ -0,0 +1,47 @@ +package org.gcube.data.spd.client.plugins; + +import javax.ws.rs.client.WebTarget; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.Constants; +import org.gcube.data.spd.client.proxies.ClassificationClient; +import org.gcube.data.spd.client.proxies.DefaultClassification; +import org.w3c.dom.Node; + + +public class ClassificationPlugin extends AbstractPlugin { + + public ClassificationPlugin() { + super("species-products-discovery/gcube/service"); + } + + @Override + public Exception convert(Exception e, ProxyConfig arg1) { + return e; + } + + @Override + public ClassificationClient newProxy(ProxyDelegate delegate) { + return new DefaultClassification(delegate); + } + + @Override + public WebTarget resolve(EndpointReference epr, ProxyConfig config) + throws Exception { + DOMResult result = new DOMResult(); + epr.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String address = child.getTextContent(); + GcubeService service = GcubeService.service().withName(Constants.CLASSIFICATION_QNAME).andPath("taxon"); + return TargetFactory.stubFor(service).at(address); + + } + + +} diff --git a/src/main/java/org/gcube/data/spd/client/plugins/ExecutorPlugin.java b/src/main/java/org/gcube/data/spd/client/plugins/ExecutorPlugin.java new file mode 100644 index 0000000..8d04832 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/plugins/ExecutorPlugin.java @@ -0,0 +1,46 @@ +package org.gcube.data.spd.client.plugins; + +import javax.ws.rs.client.WebTarget; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.Constants; +import org.gcube.data.spd.client.proxies.DefaultExecutor; +import org.gcube.data.spd.client.proxies.ExecutorClient; +import org.w3c.dom.Node; + +public class ExecutorPlugin extends AbstractPlugin { + + public ExecutorPlugin() { + super("species-products-discovery/gcube/service"); + } + + @Override + public Exception convert(Exception e, ProxyConfig arg1) { + return e; + } + + @Override + public ExecutorClient newProxy(ProxyDelegate delegate) { + return new DefaultExecutor(delegate); + } + + @Override + public WebTarget resolve(EndpointReference epr, ProxyConfig config) + throws Exception { + DOMResult result = new DOMResult(); + epr.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String address = child.getTextContent(); + GcubeService service = GcubeService.service().withName(Constants.EXECUTOR_QNAME).andPath("job"); + return TargetFactory.stubFor(service).at(address); + + } + + +} diff --git a/src/main/java/org/gcube/data/spd/client/plugins/ManagerPlugin.java b/src/main/java/org/gcube/data/spd/client/plugins/ManagerPlugin.java new file mode 100644 index 0000000..bedf091 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/plugins/ManagerPlugin.java @@ -0,0 +1,45 @@ +package org.gcube.data.spd.client.plugins; + +import javax.ws.rs.client.WebTarget; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.Constants; +import org.gcube.data.spd.client.proxies.DefaultManager; +import org.gcube.data.spd.client.proxies.ManagerClient; +import org.w3c.dom.Node; + +public class ManagerPlugin extends AbstractPlugin { + + public ManagerPlugin() { + super("species-products-discovery/gcube/service"); + } + + @Override + public Exception convert(Exception e, ProxyConfig arg1) { + return e; + } + + @Override + public ManagerClient newProxy(ProxyDelegate delegate) { + return new DefaultManager(delegate); + } + + @Override + public WebTarget resolve(EndpointReference epr, ProxyConfig config) + throws Exception { + DOMResult result = new DOMResult(); + epr.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String address = child.getTextContent(); + GcubeService service = GcubeService.service().withName(Constants.MANAGER_QNAME).andPath("retrieve"); + return TargetFactory.stubFor(service).at(address); + + } + +} diff --git a/src/main/java/org/gcube/data/spd/client/plugins/OccurrencePlugin.java b/src/main/java/org/gcube/data/spd/client/plugins/OccurrencePlugin.java new file mode 100644 index 0000000..1d7de61 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/plugins/OccurrencePlugin.java @@ -0,0 +1,44 @@ +package org.gcube.data.spd.client.plugins; + +import javax.ws.rs.client.WebTarget; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.Constants; +import org.gcube.data.spd.client.proxies.DefaultOccurrence; +import org.gcube.data.spd.client.proxies.OccurrenceClient; +import org.w3c.dom.Node; + +public class OccurrencePlugin extends AbstractPlugin { + + public OccurrencePlugin(){ + super("species-products-discovery/gcube/service"); + } + + @Override + public Exception convert(Exception e, ProxyConfig arg1) { + return e; + } + + @Override + public OccurrenceClient newProxy(ProxyDelegate delegate) { + return new DefaultOccurrence(delegate); + } + + @Override + public WebTarget resolve(EndpointReference epr, ProxyConfig config) + throws Exception { + DOMResult result = new DOMResult(); + epr.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String address = child.getTextContent(); + GcubeService service = GcubeService.service().withName(Constants.OCCURRENCE_QNAME).andPath("occurrence"); + return TargetFactory.stubFor(service).at(address); + } + +} diff --git a/src/main/java/org/gcube/data/spd/client/plugins/ResultSetPlugin.java b/src/main/java/org/gcube/data/spd/client/plugins/ResultSetPlugin.java new file mode 100644 index 0000000..cdfed69 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/plugins/ResultSetPlugin.java @@ -0,0 +1,44 @@ +package org.gcube.data.spd.client.plugins; + +import javax.ws.rs.client.WebTarget; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.Constants; +import org.gcube.data.spd.client.proxies.DefaultResultSet; +import org.gcube.data.spd.client.proxies.ResultSetClient; +import org.w3c.dom.Node; + +public class ResultSetPlugin extends AbstractPlugin { + + public ResultSetPlugin(){ + super("species-products-discovery/gcube/service"); + } + + @Override + public Exception convert(Exception e, ProxyConfig arg1) { + return e; + } + + @Override + public ResultSetClient newProxy(ProxyDelegate delegate) { + return new DefaultResultSet(delegate); + } + + @Override + public WebTarget resolve(EndpointReference epr, ProxyConfig config) + throws Exception { + DOMResult result = new DOMResult(); + epr.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String address = child.getTextContent(); + GcubeService service = GcubeService.service().withName(Constants.RESULTSET_QNAME).andPath("resultset"); + return TargetFactory.stubFor(service).at(address); + } + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/ClassificationClient.java b/src/main/java/org/gcube/data/spd/client/proxies/ClassificationClient.java new file mode 100644 index 0000000..fc424e5 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/ClassificationClient.java @@ -0,0 +1,22 @@ +package org.gcube.data.spd.client.proxies; + + +import java.util.List; + +import org.gcube.data.spd.model.products.TaxonomyItem; +import org.gcube.data.spd.model.service.exceptions.InvalidIdentifierException; +import org.gcube.data.spd.model.service.exceptions.UnsupportedCapabilityException; +import org.gcube.data.spd.model.service.exceptions.UnsupportedPluginException; +import org.gcube.data.streams.Stream; + +public interface ClassificationClient { + + public Stream getTaxonChildrenById(String id) throws UnsupportedPluginException,UnsupportedCapabilityException, InvalidIdentifierException; + + public Stream getTaxaByIds(List ids); + + public Stream getTaxonTreeById(String id) throws UnsupportedPluginException,UnsupportedCapabilityException, InvalidIdentifierException; + + public Stream getSynonymsById(String id) throws UnsupportedPluginException,UnsupportedCapabilityException, InvalidIdentifierException; + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/DefaultClassification.java b/src/main/java/org/gcube/data/spd/client/proxies/DefaultClassification.java new file mode 100644 index 0000000..7fdc21d --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/DefaultClassification.java @@ -0,0 +1,115 @@ +package org.gcube.data.spd.client.proxies; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.ResultElementRecordIterator; +import org.gcube.data.spd.client.ResultLocator; +import org.gcube.data.spd.client.Utils; +import org.gcube.data.spd.model.products.TaxonomyItem; +import org.gcube.data.spd.model.service.exceptions.InvalidIdentifierException; +import org.gcube.data.spd.model.service.exceptions.UnsupportedCapabilityException; +import org.gcube.data.spd.model.service.exceptions.UnsupportedPluginException; +import org.gcube.data.streams.Stream; +import org.gcube.data.streams.dsl.Streams; + +public class DefaultClassification implements ClassificationClient{ + + private final ProxyDelegate delegate; + + public DefaultClassification(ProxyDelegate config){ + this.delegate = config; + } + + @Override + public Stream getTaxonChildrenById(final String id) + throws UnsupportedPluginException, UnsupportedCapabilityException, + InvalidIdentifierException { + Call call = new Call() { + @Override + public ResultLocator call(WebTarget manager) throws Exception { + Response response = manager.path("children").path(id).request().get(Response.class); + String host = manager.getUri().getHost(); + int port = manager.getUri().getPort(); + return new ResultLocator(host, port, Utils.getLocatorFromResponse(response)); + } + }; + try { + ResultLocator result = delegate.make(call); + ResultElementRecordIterator ri = new ResultElementRecordIterator(result, 2, TimeUnit.MINUTES); + return Streams.convert(ri); + }catch(Exception e) { + throw new RuntimeException(e); + } + } + + //TODO + @Override + public Stream getTaxaByIds(final List ids) { + return null; + /*Call> call = new Call>() { + @Override + public ChunkedInput call(WebTarget manager) throws Exception { + return null; } + }; + try { + return null; + }catch(Exception e) { + throw new RuntimeException(e); + }*/ + } + + @Override + public Stream getTaxonTreeById(final String id) + throws UnsupportedPluginException, UnsupportedCapabilityException, + InvalidIdentifierException { + Call call = new Call() { + @Override + public ResultLocator call(WebTarget manager) throws Exception { + Response response = manager.path("tree").path(id).request().get(Response.class); + String host = manager.getUri().getHost(); + int port = manager.getUri().getPort(); + return new ResultLocator(host, port, Utils.getLocatorFromResponse(response)); + } + }; + try { + ResultLocator result = delegate.make(call); + ResultElementRecordIterator ri = new ResultElementRecordIterator(result, 2, TimeUnit.MINUTES); + + return Streams.convert(ri); + }catch(Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public Stream getSynonymsById(final String id) + throws UnsupportedPluginException, UnsupportedCapabilityException, + InvalidIdentifierException { + Call call = new Call() { + @Override + public ResultLocator call(WebTarget manager) throws Exception { + Response response = manager.path("synonyms").path(id).request().get(Response.class); + String host = manager.getUri().getHost(); + int port = manager.getUri().getPort(); + return new ResultLocator(host, port, Utils.getLocatorFromResponse(response)); + } + }; + try { + ResultLocator result = delegate.make(call); + ResultElementRecordIterator ri = new ResultElementRecordIterator(result, 2, TimeUnit.MINUTES); + + return Streams.convert(ri); + }catch(Exception e) { + throw new RuntimeException(e); + } + + } + + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/DefaultExecutor.java b/src/main/java/org/gcube/data/spd/client/proxies/DefaultExecutor.java new file mode 100644 index 0000000..342beab --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/DefaultExecutor.java @@ -0,0 +1,187 @@ +package org.gcube.data.spd.client.proxies; + +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; + +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.common.clients.stubs.jaxws.JAXWSUtils.Empty; +import org.gcube.data.spd.model.service.exceptions.InvalidIdentifierException; +import org.gcube.data.spd.model.service.types.CompleteJobStatus; +import org.gcube.data.spd.model.service.types.JobType; +import org.gcube.data.spd.model.service.types.SubmitJob; +import org.gcube.data.spd.model.util.SerializableList; +import org.gcube.data.streams.Stream; + +public class DefaultExecutor implements ExecutorClient{ + + private final ProxyDelegate delegate; + + public DefaultExecutor(ProxyDelegate delegate) { + super(); + this.delegate = delegate; + } + + private Call getCallForJobs(final String input, final JobType job){ + Call call = new Call() { + @Override + public String call(WebTarget executor) throws Exception { + SubmitJob jobRequest = new SubmitJob(input, job); + return executor.path("execute").request().post(Entity.xml(jobRequest), String.class); + } + }; + return call; + } + + @Override + public String getErrorLink(final String jobId) throws InvalidIdentifierException { + Call call = new Call() { + @Override + public String call(WebTarget executor) throws Exception { + return executor.path("error").path(jobId).request().get(String.class); + } + }; + try { + return delegate.make(call); + }catch(Exception e) { + throw new InvalidIdentifierException(); + } + + } + + @Override + public String getResultLink(final String jobId) throws InvalidIdentifierException { + Call call = new Call() { + @Override + public String call(WebTarget executor) throws Exception { + return executor.path("result").path(jobId).request().get(String.class); + } + }; + try { + return delegate.make(call); + }catch(Exception e) { + throw new InvalidIdentifierException(); + } + } + + @Override + public CompleteJobStatus getStatus(final String jobId) + throws InvalidIdentifierException { + Call call = new Call() { + @Override + public CompleteJobStatus call(WebTarget executor) throws Exception { + return executor.path("status").path(jobId).request().get(CompleteJobStatus.class); + } + }; + try { + return delegate.make(call); + }catch(Exception e) { + throw new InvalidIdentifierException(); + } + } + + @Override + public void removeJob(final String jobId) throws InvalidIdentifierException { + Call call = new Call() { + @Override + public Empty call(WebTarget executor) throws Exception { + executor.path(jobId).request().delete(); + return new Empty(); + } + }; + try { + delegate.make(call); + }catch(Exception e) { + throw new InvalidIdentifierException(); + } + + } + + private Boolean sendInputCall(final String jobId, final List input) + throws InvalidIdentifierException { + Call call = new Call() { + @Override + public Boolean call(WebTarget executor) throws Exception { + return executor.path("input").path(jobId).request().put(Entity.xml(new SerializableList(input)), Boolean.class); + } + }; + try { + return delegate.make(call); + }catch(Exception e) { + throw new InvalidIdentifierException(); + } + } + + private void sendInput(String jobId, Stream stream) throws Exception{ + int bunch = 30; + List collected = new ArrayList(30); + while (stream.hasNext()){ + collected.add(stream.next()); + if (collected.size()>=bunch){ + if (!sendInputCall(jobId, collected)) + throw new Exception(); + collected.clear(); + } + } + if (collected.size()>0) + if (!sendInputCall(jobId, collected)) + throw new Exception(); + + sendInputCall(jobId, new ArrayList(0)); + } + + @Override + public String createDwCAByChildren(String taxonKey) throws Exception { + return delegate.make(getCallForJobs(taxonKey, JobType.DWCAByChildren)); + } + + @Override + public String createDwCAByIds(Stream ids) throws Exception { + String jobId = delegate.make(getCallForJobs(null, JobType.DWCAById)); + try{ + sendInput(jobId, ids); + }catch(Exception e){ + e.printStackTrace(); + } + return jobId; + + } + + @Override + public String createCSV(Stream ids) throws Exception { + String jobId = delegate.make(getCallForJobs(null, JobType.CSV)); + try{ + sendInput(jobId, ids); + }catch(Exception e){ + e.printStackTrace(); + } + return jobId; + } + + @Override + public String createCSVforOM(Stream ids) throws Exception { + String jobId = delegate.make(getCallForJobs(null, JobType.CSVForOM)); + try{ + sendInput(jobId, ids); + }catch(Exception e){ + e.printStackTrace(); + } + return jobId; + } + + @Override + public String createDarwincoreFromOccurrenceKeys(Stream ids) + throws Exception { + String jobId = delegate.make(getCallForJobs(null, JobType.DarwinCore)); + try{ + sendInput(jobId, ids); + }catch(Exception e){ + e.printStackTrace(); + } + return jobId; + } + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/DefaultManager.java b/src/main/java/org/gcube/data/spd/client/proxies/DefaultManager.java new file mode 100644 index 0000000..e4da41b --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/DefaultManager.java @@ -0,0 +1,71 @@ +package org.gcube.data.spd.client.proxies; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.ResultElementRecordIterator; +import org.gcube.data.spd.client.ResultLocator; +import org.gcube.data.spd.client.Utils; +import org.gcube.data.spd.model.PluginDescription; +import org.gcube.data.spd.model.exceptions.InvalidQueryException; +import org.gcube.data.spd.model.products.ResultElement; +import org.gcube.data.spd.model.service.exceptions.UnsupportedCapabilityException; +import org.gcube.data.spd.model.service.exceptions.UnsupportedPluginException; +import org.gcube.data.spd.model.service.types.PluginDescriptions; +import org.gcube.data.streams.Stream; +import org.gcube.data.streams.dsl.Streams; + +public class DefaultManager implements ManagerClient { + + private final ProxyDelegate delegate; + + + public DefaultManager(ProxyDelegate config){ + this.delegate = config; + } + + @Override + public Stream search(final String query) + throws InvalidQueryException, UnsupportedPluginException, + UnsupportedCapabilityException { + Call call = new Call() { + @Override + public ResultLocator call(WebTarget manager) throws Exception { + Response response = manager.path("search").queryParam("query", query).request().get(Response.class); + String host = manager.getUri().getHost(); + int port = manager.getUri().getPort(); + return new ResultLocator(host, port, Utils.getLocatorFromResponse(response)); + } + }; + try { + ResultLocator result = delegate.make(call); + + ResultElementRecordIterator ri = new ResultElementRecordIterator(result, 2, TimeUnit.MINUTES); + return Streams.convert(ri); + }catch(Exception e) { + throw new RuntimeException(e); + } + } + + + @Override + public List getPluginsDescription() { + Call> call = new Call>() { + @Override + public List call(WebTarget manager) throws Exception { + return manager.path("providers").request().get(PluginDescriptions.class).getDescriptions(); + } + }; + try { + return delegate.make(call); + }catch(Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/DefaultOccurrence.java b/src/main/java/org/gcube/data/spd/client/proxies/DefaultOccurrence.java new file mode 100644 index 0000000..d777064 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/DefaultOccurrence.java @@ -0,0 +1,117 @@ +package org.gcube.data.spd.client.proxies; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.data.spd.client.ResultElementRecordIterator; +import org.gcube.data.spd.client.ResultLocator; +import org.gcube.data.spd.client.Utils; +import org.gcube.data.spd.model.PointInfo; +import org.gcube.data.spd.model.products.OccurrencePoint; +import org.gcube.data.streams.Stream; +import org.gcube.data.streams.dsl.Streams; + +public class DefaultOccurrence implements OccurrenceClient { + + private final ProxyDelegate delegate; + + public DefaultOccurrence(ProxyDelegate config){ + this.delegate = config; + } + + @Override + public Stream getByIds(final List ids) { + Call call = new Call() { + @Override + public ResultLocator call(WebTarget manager) throws Exception { + manager = manager.path("ids"); + for (String value: ids) + manager = manager.queryParam("ids", value); + System.out.println(manager.getUri().toString()); + Response response = manager.request().get(Response.class); + String host = manager.getUri().getHost(); + int port = manager.getUri().getPort(); + return new ResultLocator(host, port, Utils.getLocatorFromResponse(response)); + } + }; + try { + ResultLocator result = delegate.make(call); + ResultElementRecordIterator ri = new ResultElementRecordIterator(result, 2, TimeUnit.MINUTES); + + return Streams.convert(ri); + }catch(Exception e) { + throw new RuntimeException(e); + } + + } + + @Override + public Stream getByKeys(final List keys) { + Call call = new Call() { + @Override + public ResultLocator call(WebTarget manager) throws Exception { + manager = manager.path("keys"); + for (String value: keys) + manager = manager.queryParam("keys", value); + System.out.println("calling "+manager.getUri().toString()); + Response response = manager.request().get(Response.class); + String host = manager.getUri().getHost(); + int port = manager.getUri().getPort(); + return new ResultLocator(host, port, Utils.getLocatorFromResponse(response)); + } + }; + try { + ResultLocator result = delegate.make(call); + ResultElementRecordIterator ri = new ResultElementRecordIterator(result, 2, TimeUnit.MINUTES); + return Streams.convert(ri); + }catch(Exception e) { + throw new RuntimeException(e); + } + + } + /* + @Override + public String createLayer(Stream coordinatesStream) { + Stream convertedStream = pipe(coordinatesStream).through(new Generator() { + + @Override + public String yield(PointInfo element) { + try { + return Bindings.toXml(element); + } catch (Exception e) { + throw new StreamSkipSignal(); + } + } + + }); + + final String coordinateLocator = publishStringsIn(convertedStream).withDefaults().toString(); + + Call call = new Call() { + @Override + public String call(OccurrenceStubs occurrence) throws Exception { + return occurrence.createLayer(coordinateLocator); + } + }; + + try { + return delegate.make(call); + }catch(Exception e) { + throw again(e).asServiceException(); + } + } + */ + + @Override + public String createLayer(Stream coordinatesLocator) { + // TODO Auto-generated method stub + return null; + } + + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/DefaultResultSet.java b/src/main/java/org/gcube/data/spd/client/proxies/DefaultResultSet.java new file mode 100644 index 0000000..6ea89b8 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/DefaultResultSet.java @@ -0,0 +1,53 @@ +package org.gcube.data.spd.client.proxies; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; + +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.common.clients.stubs.jaxws.JAXWSUtils.Empty; +import org.glassfish.jersey.client.ChunkedInput; + +public class DefaultResultSet implements ResultSetClient { + + private final ProxyDelegate delegate; + + public DefaultResultSet(ProxyDelegate config){ + this.delegate = config; + } + + @Override + public ChunkedInput getResultSet(final String locator){ + Call> call = new Call>() { + @Override + public ChunkedInput call(WebTarget manager) throws Exception { + return manager.path(locator).request().get(new GenericType>() {}); + } + }; + try { + return delegate.make(call); + + }catch(Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void closeResultSet(final String locator){ + Call call = new Call() { + @Override + public Empty call(WebTarget manager) throws Exception { + manager.path(locator).request().delete(); + return new Empty(); + } + }; + try { + delegate.make(call); + }catch(Exception e) { + throw new RuntimeException(e); + } + } + + + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/ExecutorClient.java b/src/main/java/org/gcube/data/spd/client/proxies/ExecutorClient.java new file mode 100644 index 0000000..69d6089 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/ExecutorClient.java @@ -0,0 +1,27 @@ +package org.gcube.data.spd.client.proxies; + +import org.gcube.data.spd.model.service.exceptions.InvalidIdentifierException; +import org.gcube.data.spd.model.service.types.CompleteJobStatus; +import org.gcube.data.streams.Stream; + +public interface ExecutorClient { + + public String createDwCAByChildren(String taxonKey) throws Exception; + + public String getResultLink(String jobId) throws InvalidIdentifierException; + + public String getErrorLink(String jobId) throws InvalidIdentifierException; + + public CompleteJobStatus getStatus(String jobId) throws InvalidIdentifierException; + + public void removeJob(String jobId) throws InvalidIdentifierException; + + public String createDwCAByIds(final Stream ids) throws Exception; + + public String createCSV(final Stream ids) throws Exception; + + public String createCSVforOM(final Stream ids) throws Exception; + + public String createDarwincoreFromOccurrenceKeys(final Stream ids) throws Exception; + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/ManagerClient.java b/src/main/java/org/gcube/data/spd/client/proxies/ManagerClient.java new file mode 100644 index 0000000..223e931 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/ManagerClient.java @@ -0,0 +1,18 @@ +package org.gcube.data.spd.client.proxies; + + +import java.util.List; + +import org.gcube.data.spd.model.PluginDescription; +import org.gcube.data.spd.model.exceptions.InvalidQueryException; +import org.gcube.data.spd.model.products.ResultElement; +import org.gcube.data.spd.model.service.exceptions.UnsupportedCapabilityException; +import org.gcube.data.spd.model.service.exceptions.UnsupportedPluginException; +import org.gcube.data.streams.Stream; + +public interface ManagerClient { + + public Stream search(String query) throws InvalidQueryException, UnsupportedPluginException, UnsupportedCapabilityException; + + public List getPluginsDescription(); +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/OccurrenceClient.java b/src/main/java/org/gcube/data/spd/client/proxies/OccurrenceClient.java new file mode 100644 index 0000000..238aef4 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/OccurrenceClient.java @@ -0,0 +1,18 @@ +package org.gcube.data.spd.client.proxies; + + +import java.util.List; + +import org.gcube.data.spd.model.PointInfo; +import org.gcube.data.spd.model.products.OccurrencePoint; +import org.gcube.data.streams.Stream; + +public interface OccurrenceClient { + + public Stream getByIds(List ids); + + public String createLayer(Stream coordinatesLocator); + + public Stream getByKeys(List keys); + +} diff --git a/src/main/java/org/gcube/data/spd/client/proxies/ResultSetClient.java b/src/main/java/org/gcube/data/spd/client/proxies/ResultSetClient.java new file mode 100644 index 0000000..44d1ce1 --- /dev/null +++ b/src/main/java/org/gcube/data/spd/client/proxies/ResultSetClient.java @@ -0,0 +1,11 @@ +package org.gcube.data.spd.client.proxies; + +import org.glassfish.jersey.client.ChunkedInput; + +public interface ResultSetClient { + + ChunkedInput getResultSet(String locator); + + void closeResultSet(String locator); + +} diff --git a/src/main/resources/org/gcube/data/spd/dwca/eml.xml b/src/main/resources/org/gcube/data/spd/dwca/eml.xml new file mode 100644 index 0000000..d80313a --- /dev/null +++ b/src/main/resources/org/gcube/data/spd/dwca/eml.xml @@ -0,0 +1,60 @@ + + + + The gCube System - Species Products Discovery Service + + + Valentina + Marioli + + CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" + +
+ Pisa + + + Italy +
+ + valentina.marioli@isti.cnr.it + https://gcube.wiki.gcube-system.org/gcube/index.php/Biodiversity_Access +
+ + en + + This work has been partially supported by the following European projects: DILIGENT (FP6-2003-IST-2), + D4Science (FP7-INFRA-2007-1.2.2), D4Science-II (FP7-INFRA-2008-1.2.2), + iMarine (FP7-INFRASTRUCTURES-2011-2), and EUBrazilOpenBio (FP7-ICT-2011-EU-Brazil). + + + gCube + Species Discovery + + + The gCube/gCore software is licensed as Free Open Source software conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + The software and documentation is provided by its authors/distributors "as is" and no expressed or + implied warranty is given for its use, quality or fitness for a particular case. + + + + Valentina + Marioli + + valentina.marioli@isti.cnr.it + + + + + Species Products Discovery Service + +
+ + +
diff --git a/src/main/resources/org/gcube/data/spd/dwca/meta.xml b/src/main/resources/org/gcube/data/spd/dwca/meta.xml new file mode 100644 index 0000000..c8a306a --- /dev/null +++ b/src/main/resources/org/gcube/data/spd/dwca/meta.xml @@ -0,0 +1,39 @@ + + + + +taxa.txt + + + + + + + + + + + + + + + + + + + + + + + + + + +VernacularName.txt + + + + + + + diff --git a/src/test/java/org/gcube/data/spd/client/manager/DWCATest.java b/src/test/java/org/gcube/data/spd/client/manager/DWCATest.java new file mode 100644 index 0000000..07f1af2 --- /dev/null +++ b/src/test/java/org/gcube/data/spd/client/manager/DWCATest.java @@ -0,0 +1,90 @@ +package org.gcube.data.spd.client.manager; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.data.spd.client.plugins.AbstractPlugin; +import org.gcube.data.spd.client.proxies.ExecutorClient; +import org.gcube.data.spd.client.proxies.ManagerClient; +import org.gcube.data.spd.model.products.Product; +import org.gcube.data.spd.model.products.Product.ProductType; +import org.gcube.data.spd.model.products.ResultItem; +import org.gcube.data.spd.model.service.types.CompleteJobStatus; +import org.gcube.data.spd.model.service.types.JobStatus; +import org.gcube.data.spd.model.service.types.NodeStatus; +import org.gcube.data.streams.Stream; +import org.gcube.data.streams.dsl.Streams; +import org.junit.Test; + + +public class DWCATest { + + + @Test + public void OccurrenceJobFromSardaSarda() throws Exception{ + + SecurityTokenProvider.instance.set("94a3b80a-c66f-4000-ae2f-230f5dfad793-98187548"); + ScopeProvider.instance.set("/gcube/devsec"); + ExecutorClient creator = AbstractPlugin.executor().build(); + + //"CatalogueOfLife:13445516" chordata + //"CatalogueOfLife:13446218" cervidae + String jobId = createOccurrence(creator); + //String jobId = createOccurrence(creator); + CompleteJobStatus response= null; + do{ + Thread.sleep(10000); + response= creator.getStatus(jobId); + System.out.println("thes status is "+response.getStatus()); + System.out.println("the number of element read are "+response.getCompletedEntries()); + if(response.getSubNodes()!=null) + for (NodeStatus status : response.getSubNodes()) + System.out.println(status.getScientificName()+"--"+status.getStatus()); + + }while(response.getStatus()!=JobStatus.FAILED && response.getStatus()!=JobStatus.COMPLETED); + + System.out.println("result uri "+creator.getResultLink(jobId)); + System.out.println("error uri "+creator.getErrorLink(jobId)); + + + } + + + private static String createDWCAJobTest(ExecutorClient creator, String id) throws Exception { + return creator.createDwCAByChildren(id); + } + + private static String createOccurrence(ExecutorClient creator) throws Exception { + Stream keyStream =Streams.convert(new String[]{"Obis:522634-1695----", "Obis:465686-1695----", "Obis:429081-721----", "Obis:822676-1691----", "Obis:742361-119----", "Obis:447539-1695----", "GBIF:sarda||130||11956||57744173||","GBIF:sarda||82||400||50917042||","GBIF:sarda||427||14113||60499431||"}); + return creator.createDarwincoreFromOccurrenceKeys(keyStream); + } + + private static String createOccurrenceFromSardasarda(ExecutorClient creator) throws Exception { + + ManagerClient manager = AbstractPlugin.manager().build(); + + Stream rsStream = manager.search("SEARCH BY SN 'sarda sarda'"); + + List keylist = new ArrayList(); + int i =0; + while (rsStream.hasNext()){ + ResultItem rs = rsStream.next(); + for (Product product: rs.getProducts()) + if (product.getCount()>0 && product.getType()==ProductType.Occurrence) keylist.add(product.getKey()); + if (i++>=5) + break; + } + rsStream.close(); + + System.out.println("keyList is "+keylist.size()); + + System.in.read(); + + Stream keyStream =Streams.convert(keylist); + return creator.createCSV(keyStream); + } + + +} diff --git a/src/test/java/org/gcube/data/spd/client/manager/JobTest.java b/src/test/java/org/gcube/data/spd/client/manager/JobTest.java new file mode 100644 index 0000000..1401a71 --- /dev/null +++ b/src/test/java/org/gcube/data/spd/client/manager/JobTest.java @@ -0,0 +1,42 @@ +package org.gcube.data.spd.client.manager; + + +public class JobTest { + +/* *//** + * @param args + *//* + public static void main(String[] args) throws Exception{ + ScopeProvider.instance.set("/gcube/devsec"); + getJobFile(); + } + + private static void getJobFile() throws Exception { + + ExecutorClient creator = executor().build(); + String link = creator.getResultLink("f63a96b0-e94b-11e2-a63c-e05c5bb7d509||8c788f50-eace-11e2-b167-8f9adc39871b"); + System.out.println("resultLink is "+ link); + } + + private static void getJobErorFile() throws Exception { + + ExecutorClient creator = executor().build(); + String link = creator.getErrorLink("f63a96b0-e94b-11e2-a63c-e05c5bb7d509||8c788f50-eace-11e2-b167-8f9adc39871b"); + System.out.println("errorLink is "+ link); + } + + private static void getStatus() throws Exception { + + ExecutorClient creator = executor().build(); + CompleteJobStatus status = creator.getStatus("f63a96b0-e94b-11e2-a63c-e05c5bb7d509||8c788f50-eace-11e2-b167-8f9adc39871b"); + System.out.println("status is "+ status); + } + + private static void getJobs() throws Exception { + + ExecutorClient creator = executor().build(); + CompleteJobStatus status = creator.getStatus("f63a96b0-e94b-11e2-a63c-e05c5bb7d509||8c788f50-eace-11e2-b167-8f9adc39871b"); + System.out.println("status is "+ status); + }*/ + +} diff --git a/src/test/java/org/gcube/data/spd/client/manager/ManagerTest.java b/src/test/java/org/gcube/data/spd/client/manager/ManagerTest.java new file mode 100644 index 0000000..7e1af0b --- /dev/null +++ b/src/test/java/org/gcube/data/spd/client/manager/ManagerTest.java @@ -0,0 +1,74 @@ +package org.gcube.data.spd.client.manager; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.data.spd.client.plugins.AbstractPlugin; +import org.gcube.data.spd.client.proxies.ManagerClient; +import org.gcube.data.spd.client.proxies.OccurrenceClient; +import org.gcube.data.spd.model.PluginDescription; +import org.gcube.data.spd.model.products.OccurrencePoint; +import org.gcube.data.spd.model.products.Product; +import org.gcube.data.spd.model.products.ResultItem; +import org.gcube.data.streams.Stream; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ManagerTest { + + private static final Logger log = LoggerFactory.getLogger(ManagerTest.class); + + @Test + public void search() throws Exception{ + SecurityTokenProvider.instance.set("94a3b80a-c66f-4000-ae2f-230f5dfad793-98187548"); + ScopeProvider.instance.set("/gcube/devsec"); + ManagerClient manager = AbstractPlugin.manager().build(); + + Stream stream = manager.search("SEARCH BY SN 'cetacea' IN OBIS WHERE coordinate >= 30.0 , 20.0 "); + + List productKeys = new ArrayList(); + + int i =0; + while (stream.hasNext()){ + if (i==10) break; + ResultItem item = stream.next(); + + for (Product prod : item.getProducts()){ + System.out.println("type: "+prod.getType()+" - "+prod.getKey()+" - "+prod.getCount()); + productKeys.add(prod.getKey()); + } + i++; + } + + stream.close(); + + OccurrenceClient occurrence = AbstractPlugin.occurrences().build(); + Stream occurrenceStream = occurrence.getByKeys(productKeys); + + int occIndex = 0; + + while (occurrenceStream.hasNext()){ + + occIndex++; + } + + System.out.println("occurrence point found : "+occIndex); + occurrenceStream.close(); + } + + @Test + public void getPluginDescription() throws Exception{ + SecurityTokenProvider.instance.set("94a3b80a-c66f-4000-ae2f-230f5dfad793-98187548"); + ScopeProvider.instance.set("/gcube/devsec"); + ManagerClient manager = AbstractPlugin.manager().build(); + List pluginDescriptions = manager.getPluginsDescription(); + System.out.println("plugin descriptions are "+pluginDescriptions.size()); + for (PluginDescription description : pluginDescriptions) + System.out.println(description.toString()); + } + +} diff --git a/src/test/java/org/gcube/data/spd/client/manager/OccurrencesTest.java b/src/test/java/org/gcube/data/spd/client/manager/OccurrencesTest.java new file mode 100644 index 0000000..8bde5f1 --- /dev/null +++ b/src/test/java/org/gcube/data/spd/client/manager/OccurrencesTest.java @@ -0,0 +1,56 @@ +package org.gcube.data.spd.client.manager; + +import java.util.Arrays; +import java.util.List; + +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.data.spd.client.plugins.AbstractPlugin; +import org.gcube.data.spd.client.proxies.OccurrenceClient; +import org.gcube.data.spd.model.products.OccurrencePoint; +import org.gcube.data.streams.Stream; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OccurrencesTest { + + private static Logger logger = LoggerFactory.getLogger(OccurrencesTest.class); + + + private static List occurrenceIds=Arrays.asList("GBIF:1238408827","GBIF:1234813179","GBIF:1136918536","GBIF:1050224578", + "GBIF:1084012520","GBIF:1084013323","GBIF:1084013326","GBIF:1084013281", "GBIF:857015137","GBIF:856828010"); + + private static List occurrenceKeys = Arrays.asList("GBIF:84028840-f762-11e1-a439-00145eb45e9a^^Marine and Coastal Management - Demersal Surveys (years 1991-1995) (AfrOBIS)^^Marine and Coastal Management - Demersal Surveys^^0e0fc0f0-828e-11d8-b7ed-b8a03c50a862^^Ocean Biogeographic Information System||5208593" , "GBIF:ed820bdb-4345-4143-a280-4fbffaacd31d^^The Pisces Collection at the Staatssammlung für Anthropologie und Paläoanatomie München^^Staatliche Naturwissenschaftliche Sammlungen Bayerns: The Pisces Collection at the Staatssammlung für Anthropologie und Paläoanatomie München^^0674aea0-a7e1-11d8-9534-b8a03c50a862^^Staatliche Naturwissenschaftliche Sammlungen Bayerns||5712279", "GBIF:8609f1a0-f762-11e1-a439-00145eb45e9a^^Marine and Coastal Management - Linefish Dataset (Second Semester of 1992) (AfrOBIS)^^Marine and Coastal Management - Linefish Dataset^^0e0fc0f0-828e-11d8-b7ed-b8a03c50a862^^Ocean Biogeographic Information System||5208602" ); + + @Test + public void getOccurencesByIds() throws Exception{ + SecurityTokenProvider.instance.set("94a3b80a-c66f-4000-ae2f-230f5dfad793-98187548"); + ScopeProvider.instance.set("/gcube/devsec"); + OccurrenceClient occurrences = AbstractPlugin.occurrences().build(); + Stream stream = occurrences.getByIds(occurrenceIds); + + int i =0; + while (stream.hasNext()) + System.out.println(i+++")"+stream.next()); + + stream.close(); + + } + + @Test + public void getOccurencesByKeys() throws Exception{ + SecurityTokenProvider.instance.set("94a3b80a-c66f-4000-ae2f-230f5dfad793-98187548"); + ScopeProvider.instance.set("/gcube/devsec"); + OccurrenceClient occurrences = AbstractPlugin.occurrences().build(); + + Stream stream = occurrences.getByKeys(occurrenceKeys); + + int i =0; + while (stream.hasNext()) + System.out.println(i+++")"+stream.next()); + + stream.close(); + } + +} diff --git a/src/test/java/org/gcube/data/spd/client/manager/TaxonTest.java b/src/test/java/org/gcube/data/spd/client/manager/TaxonTest.java new file mode 100644 index 0000000..bb5b983 --- /dev/null +++ b/src/test/java/org/gcube/data/spd/client/manager/TaxonTest.java @@ -0,0 +1,74 @@ +package org.gcube.data.spd.client.manager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TaxonTest { + + private static Logger logger = LoggerFactory.getLogger(TaxonTest.class); + + + + /*public static void main(String[] args) throws Exception{ + getTaxonById(); + getChilds(); + } + + + public static void getChilds() throws UnsupportedPluginException, UnsupportedCapabilityException, InvalidIdentifierException{ + ScopeProvider.instance.set("/gcube/devsec"); + Classification classification = classification().build(); + + Stream item = classification.getTaxonChildrenById("CatalogueOfLife:12640178"); + + System.out.println("parent id is cataloguesOfLife:12640178"); + + while (item.hasNext()){ + System.out.println("item:"+ item.next()); + } + + + } + + public static void getChildenTree() throws Exception{ + ScopeProvider.instance.set("/gcube/devsec"); + Classification classification = classification().build(); + + + Stream item = classification.getTaxonTreeById("CatalogueOfLife:11946467"); + + int i =0; + while (item.hasNext()){ + TaxonomyItem subitem = item.next(); + System.out.println("item ("+i+++") "+ subitem.getId()+" !! "+ subitem.getRank()+" -- "+subitem.getParent()); + } + + } + + public static void getSynonyms() throws IdNotValidException, Exception{ + ScopeProvider.instance.set("/gcube/devsec"); + Classification classification = classification().build(); + Stream item = classification.getSynonymsById("WoRMS:273810"); + + int i =0; + while (item.hasNext()){ + System.out.println("item ("+i+++") "+ item.next()); + } + + } + + public static void getTaxonById() throws Exception{ + ScopeProvider.instance.set("/gcube/devsec"); + Classification classification = classification().build(); + Stream item = classification.getTaxaByIds(convert(Collections.singletonList("CatalogueOfLife:12640178"))); + + System.out.println("taxon ----"); + int i =0; + while (item.hasNext()){ + System.out.println("item ("+i+++") "+ item.next()); + } + + }*/ + + +} diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties new file mode 100644 index 0000000..cc231d9 --- /dev/null +++ b/src/test/resources/log4j.properties @@ -0,0 +1,12 @@ +log4j.appender.ROOT=org.apache.log4j.ConsoleAppender +log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout +log4j.appender.ROOT.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %c{2} [%t,%M:%L] %m%n +log4j.rootLogger=TRACE,A1 + +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %c{2} [%t,%M:%L] %m%n +log4j.appender.SPD-CL.layout=org.apache.log4j.PatternLayout +log4j.appender.SPD-CL.layout.ConversionPattern=[SPD-CL] %d{HH:mm:ss,SSS} %-5p %c{2} [%t,%M:%L] %m%n + +