Difference between revisions of "ExistClient"

From Gcube Wiki
Jump to: navigation, search
(Introduction)
(Usage Examples)
 
(49 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
=== Introduction ===
 
=== Introduction ===
  
The ExistClient is a Java library that implements the ISClient interface provided by the gCoreFramework. This library allows the developer to execute queries on the Information System.
+
The ExistClient is a Java library implementing the ISClient interface defined in the gCoreFramework. Therefore it can be plugged in a gCore distribution to interface the gCube Information System.
There are three kinds of queries to execute on the IS: GCUBEResourceQuery, WSResourceQuery and GCUBEGenericQuery.
+
This ExistClient implementation reduces possible range of queries (statically implemented), each of them has a template as more generic as possible. This has been thought for covering all the main cases, enabling the user to create dynamically the query as he/she likes better enriching the query with the parameters he/she needs. 
 +
There are three kinds of queries to execute on the IS:  
 +
* ''GCUBEResourceQuery'', to query the GCUBEResources' profiles
 +
* ''WSResourceQuery'', to query WS-ResourceProperty documents
 +
* and ''GCUBEGenericQuery'', to make custom queries
  
=== Implementation Overview ===
+
The name of the component derives from the XQuery dialect supported, which is the one offered by the eXist XML Database on top of which it is built the gCube Information Collector component.
  
 +
=== Implementation Overview ===
  
The ExistClient implements all the query defined in the ISClient Interface:
 
  
 +
The ExistClient implements all the queries defined in the ISClient Interface (to obtain the ExistClient implementation see [[https://wiki.gcore.research-infrastructures.eu/gCube/index.php/Advanced_Topics#Interfacing_the_Information_System ISClient Interface]] ):
  
 +
==== How to query over GCUBEResource profiles ====
 
Queries over GCUBEResource:
 
Queries over GCUBEResource:
  
Line 19: Line 25:
 
*GCUBEGHNQuery
 
*GCUBEGHNQuery
 
*GCUBEMCollectionQuery
 
*GCUBEMCollectionQuery
*GCUBERIQuery
+
*GCUBERIQuery (Return all RI with state equals to ready)
 
*GCUBEServiceQuery
 
*GCUBEServiceQuery
 
*GCUBETPQuery
 
*GCUBETPQuery
Line 26: Line 32:
 
This queries returns a List of specialized GCUBEResource.
 
This queries returns a List of specialized GCUBEResource.
  
 +
===== Usage Examples =====
  
Queries over GCUBEWSResource:
+
This following query retrieves all the RunningInstances of the Service with ServiceName "ABE" in the selected scope:
  
*WSResourceQuery
+
<pre>
  
This query returns a List of RPDocument. The RPDocument object allows developer to retrieve the informations on WSResourceProperties or to exceute XPath  .
+
ISClient client = GHNContext.getImplementation(ISClient.class);
 +
GCUBERIQuery RIquery = client.getQuery(GCUBERIQuery.class);
 +
RIquery.addAtomicConditions(new AtomicCondition("//ServiceName","ABE"));
 +
for (GCUBERunningInstance instance : client.execute(RIquery,GCUBEScope.getScope("/gcube/devsec")))
 +
logger.debug(instance.getServiceName()+"("+instance.getID()+")");
  
 +
</pre>
  
  
The ExistClient also offers the possibility to execute custom queries: GCUBEGenericQuery.
+
The following query retrieves all the HostingNode registered in the selected scope:
GCUBEGenericQuery allows the developer to set the query expression to execute and to use a predefined set of queries which he should set some parameters on listed below:  
+
  
*GCUBEResourceQuery
+
<pre>
*GCUBEWSResourceQuery
+
*RIEndpoint
+
*RIOnGHN
+
*RISpecificData
+
*GHNIDFromHostName
+
*InternalCollections
+
*UserCollectionIDsFromSchemaURI
+
*MCollectionIDForCollection
+
*MCollectionFormatsForCollection
+
*MCollectionIDFromCollectionIDAndRole
+
*MCollectionIDFromFormatLanguage
+
*MCollectionIDFromFormatLanguage
+
*MCollectionIDFromName
+
*MCollectionIDFromSchemaURI
+
  
 +
ISClient client = GHNContext.getImplementation(ISClient.class);
 +
GCUBEGHNQuery GHNquery = client.getQuery(GCUBEGHNQuery.class);
 +
for (GCUBEHostingNode node : client.execute(GHNquery,GCUBEScope.getScope("/gcube/devsec")))
 +
logger.debug(node.getID()+"("+node.getNodeDescription().getName()+")");
  
This kind of queries returns a List of XMLResult. The XMLResult object allows the developer to explore the contained document with XPaths.
+
</pre>
  
=== Usage Examples ===
 
  
Query over GCUBEResource examples:
+
The following query retrieves all the RunningInstances of the Service with ServiceName "GHNManager" or "SoftwareRepository":  
  
 
<pre>
 
<pre>
  
 +
ISClient client = GHNContext.getImplementation(ISClient.class);
 
GCUBERIQuery RIquery = client.getQuery(GCUBERIQuery.class);
 
GCUBERIQuery RIquery = client.getQuery(GCUBERIQuery.class);
RIquery.addAtomicConditions(new AtomicCondition("//Endpoint@EntryName","gcube/annotationmanagement/abe/factory"),new AtomicCondition("//ServiceName","ABE"));
+
RIquery.addGenericCondition("$result/Profile/ServiceName/string() eq 'GHNManager' or $result/Profile/ServiceName/string() eq 'SoftwareRepository'");
 
for (GCUBERunningInstance instance : client.execute(RIquery,GCUBEScope.getScope("/gcube/devsec")))
 
for (GCUBERunningInstance instance : client.execute(RIquery,GCUBEScope.getScope("/gcube/devsec")))
logger.debug(instance.getServiceName()+"("+instance.getID()+")");
+
                      logger.debug(instance.getServiceName()+"("+instance.getID()+")");
  
 
</pre>
 
</pre>
  
<pre>
+
==== How to query over resource property documents ====
 +
Queries over GCUBEWSResource:
  
GCUBEGHNQuery GHNquery = client.getQuery(GCUBEGHNQuery.class);
+
*WSResourceQuery
for (GCUBEHostingNode node : client.execute(GHNquery,GCUBEScope.getScope("/gcube/devsec"))) l
+
logger.debug(node.getID()+"("+node.getNodeDescription().getName()+")");
+
  
 +
This query returns a List of RPDocument. The RPDocument object allows developer to retrieve the informations on WSResourceProperties or to exceute XPath  . 
 +
 +
 +
To get one of GCUBEResource or  GCUBEWSResource queries:
 +
<pre>
 +
...
 +
[GCUBE...Query] query = client.getQuery([GCUBE...Query].class);   
 +
...
 
</pre>
 
</pre>
  
 +
On this kind of queries the developer can reduce the number of results inserting a filter. The supported filters are:
 +
* ''AtomicCondition''
 +
** with the atomic conditions can be specified that a node with a determined path *MUST* have a specified value
 
<pre>
 
<pre>
 +
...  new AtomicCondition("//Endpoint/@EntryName","gcube/annotationmanagement/abe/factory")
 +
</pre>
  
GCUBERIQuery RIquery = client.getQuery(GCUBERIQuery.class);
+
* ''GenericCondition''
RIquery.addGenericCondition("$result/Profile/ServiceName/string() eq 'GHNManager' or $result/Profile/ServiceName/string() eq 'SoftwareRepository'");
+
** with the generic conditions can be specified a entire condition string (using $result as starter node of every used path)
for (GCUBERunningInstance instance : client.execute(RIquery,GCUBEScope.getScope("/gcube/devsec")))
+
<pre>
                      logger.debug(instance.getServiceName()+"("+instance.getID()+")");
+
  ....addGenericCondition("$result/[path] eq '[something]' or $result/[another path] eq '[something else]'");
 
+
 
</pre>
 
</pre>
  
Query over WSResource examples:
+
 
 +
 
 +
===== Usage Example =====
 +
 
 +
The following example returns all the WSResources generated by the services with ServiceClass "Sample":
  
 
<pre>
 
<pre>
  
 +
ISClient client = GHNContext.getImplementation(ISClient.class);
 
WSResourceQuery wsquery = client.getQuery(WSResourceQuery.class);
 
WSResourceQuery wsquery = client.getQuery(WSResourceQuery.class);
wsquery.addAtomicConditions(new AtomicCondition("//ServiceClass","Samples"));
+
wsquery.addAtomicConditions(new AtomicCondition("//gc:ServiceClass","Samples"));
 
for (RPDocument d : client.execute(wsquery,GCUBEScope.getScope("/gcube/devsec")))  
 
for (RPDocument d : client.execute(wsquery,GCUBEScope.getScope("/gcube/devsec")))  
logger.(d.getEndpoint()+":+d.getVO()+":"d.evaluate("//MyRP").get(0));
+
logger.debug(d.getEndpoint()+":+d.getVO()+":"d.evaluate("//MyRP").get(0));
  
 
</pre>
 
</pre>
  
GCUBEGenericQuery example:
+
==== Custom queries ====
 +
 
 +
The ExistClient also offers the possibility to execute custom queries: ''GCUBEGenericQuery''.
 +
GCUBEGenericQuery allows the developer to set the query expression to execute and to use a predefined set of queries which he should set some parameters on listed below:
 +
 
 +
*GCUBEResourceQuery:
 +
** TYPE
 +
** FILTER
 +
** RESULT (the default value returns Ids)
 +
*GCUBEWSResourceQuery:
 +
** FILTER
 +
** RESULT (the default value is the entire  Properties Document Data)
 +
*RIEndpoint:
 +
** NAME (Service name)
 +
** CLASS (Service class)
 +
** ENTRY (the entry point)
 +
*RIOnGHN:
 +
** ID (the GHN id)
 +
*RISpecificData:
 +
** NAME (Service name)
 +
** CLASS (Service class)
 +
** ENTRY (the entry point)
 +
*GHNIDFromHostName:
 +
** NAME (GHN name)
 +
** RESULT (the default value returns Ids)
 +
*InternalCollections
 +
*InternalCollectionIDs
 +
*UserCollectionIDsFromSchemaURI
 +
** URI (the schema uri)
 +
*MCollectionIDForCollection
 +
** ID (related collection ID)
 +
*MCollectionFormatsForCollection
 +
** ID (related collection ID)
 +
*MCollectionIDFromCollectionIDAndRole
 +
** ID (related collection ID)
 +
** ROLE (secondary role)
 +
*MCollectionIDFromMFLanguage
 +
** LANGUAGE (metadata format language)
 +
*MCollectionIDFromName
 +
** NAME (metadata collection name)
 +
*MCollectionIDFromSchemaURI
 +
** URI (schema uri)
 +
 
 +
 
 +
This kind of queries returns a List of XMLResult. The XMLResult object allows the developer to explore the contained document with XPaths.
 +
To get a predefined generic query:
 +
<pre>
 +
...
 +
GCUBEGenericQuery query = client.getQuery("[one of the listed queries]");   
 +
...
 +
</pre>
 +
to set the parameters:
 +
<pre>
 +
...
 +
query.addParameters(new QueryParameter("[parameter to set]","[value]"), new QueryParameter("[parameter to set]","[value ...]"));
 +
...
 +
</pre>
 +
 
 +
 
 +
 
 +
===== Usage Example =====
 +
 
 +
The first two examples are queries used to retrieve all the IDs of the profiles stored on the DB:  
  
 
<pre>
 
<pre>
  
 +
ISClient client = GHNContext.getImplementation(ISClient.class);
 +
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
 
GCUBEGenericQuery query = client.getQuery(GCUBEGenericQuery.class);
 
GCUBEGenericQuery query = client.getQuery(GCUBEGenericQuery.class);
query.setExpression("for $Profile in collection(\"/db/Profiles\")//Document/Data/child::*[local-name()='Profile']/Resource return $Profile/UniqueID");
+
query.setExpression("for $Profile in collection(\"/db/Profiles\")//Document/Data/child::*[local-name()='Profile']/Resource return $Profile/ID");
 
List<XMLResult> result =client.execute(query, scope);
 
List<XMLResult> result =client.execute(query, scope);
for (String resultItem :result ) {
+
for (XMLResult resultItem :result ) {
 
logger.debug(resultItem.evaluate("an XPath ... "));  
 
logger.debug(resultItem.evaluate("an XPath ... "));  
 
logger.debug(resultItem.toString());
 
logger.debug(resultItem.toString());
Line 111: Line 192:
  
 
</pre>
 
</pre>
 
Predefined generic query examples:
 
 
 
<pre>
 
<pre>
  
 +
ISClient client = GHNContext.getImplementation(ISClient.class);
 +
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
 
GCUBEGenericQuery query = client.getQuery("GCUBEResourceQuery");
 
GCUBEGenericQuery query = client.getQuery("GCUBEResourceQuery");
 
for (XMLResult result : client.execute(query,scope)) logger.debug(result.evaluate("/ID/text()"));//displays a singleton list
 
for (XMLResult result : client.execute(query,scope)) logger.debug(result.evaluate("/ID/text()"));//displays a singleton list
//a bit of customisation goes a long way whilst keeping the previous abstractions
 
query.addParameters(new QueryParameter("RESULT","$result/Type"));
 
for (XMLResult result : client.execute(query, scope)) logger.debug(result.evaluate("/Type/text()"));
 
  
//specialise to GCUBE Running Instances (NB. queries can be composed incrementally, possibly by different objects in different methods)
+
</pre>
 +
 
 +
 
 +
 
 +
This example represents how to retrieve Profiles IDs for all RunningInstances:
 +
<pre>
 +
 
 +
ISClient client = GHNContext.getImplementation(ISClient.class);
 +
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
 +
GCUBEGenericQuery query = client.getQuery("GCUBEResourceQuery");
 
query.addParameters(new QueryParameter("TYPE",GCUBERunningInstance.TYPE));  
 
query.addParameters(new QueryParameter("TYPE",GCUBERunningInstance.TYPE));  
 
for (XMLResult result : client.execute(query,scope)) logger.debug(result.evaluate("/Type/text()"));
 
for (XMLResult result : client.execute(query,scope)) logger.debug(result.evaluate("/Type/text()"));
 +
 +
</pre>
 +
 +
 +
This Example describes how to retrieve profiles Descriptions for all the RunningInstances Profiles of all the services with ServiceClass "Annotation":
 +
<pre>
 +
 +
ISClient client = GHNContext.getImplementation(ISClient.class);
 +
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
 +
GCUBEGenericQuery query = client.getQuery("GCUBEResourceQuery");
 
//introduce a filter (NB. parameters can be added in batches)  
 
//introduce a filter (NB. parameters can be added in batches)  
 
query.addParameters(new QueryParameter("TYPE",GCUBERunningInstance.TYPE), //ovverride previous setting
 
query.addParameters(new QueryParameter("TYPE",GCUBERunningInstance.TYPE), //ovverride previous setting

Latest revision as of 16:31, 3 June 2009

Introduction

The ExistClient is a Java library implementing the ISClient interface defined in the gCoreFramework. Therefore it can be plugged in a gCore distribution to interface the gCube Information System. This ExistClient implementation reduces possible range of queries (statically implemented), each of them has a template as more generic as possible. This has been thought for covering all the main cases, enabling the user to create dynamically the query as he/she likes better enriching the query with the parameters he/she needs. There are three kinds of queries to execute on the IS:

  • GCUBEResourceQuery, to query the GCUBEResources' profiles
  • WSResourceQuery, to query WS-ResourceProperty documents
  • and GCUBEGenericQuery, to make custom queries

The name of the component derives from the XQuery dialect supported, which is the one offered by the eXist XML Database on top of which it is built the gCube Information Collector component.

Implementation Overview

The ExistClient implements all the queries defined in the ISClient Interface (to obtain the ExistClient implementation see [ISClient Interface] ):

How to query over GCUBEResource profiles

Queries over GCUBEResource:

  • GCUBECollectionQuery
  • GCUBECSInstanceQuery
  • GCUBECSQuery
  • GCUBEExternalRIQuery
  • GCUBEGenericResourceQuery
  • GCUBEGHNQuery
  • GCUBEMCollectionQuery
  • GCUBERIQuery (Return all RI with state equals to ready)
  • GCUBEServiceQuery
  • GCUBETPQuery
  • GCUBEVREQuery

This queries returns a List of specialized GCUBEResource.

Usage Examples

This following query retrieves all the RunningInstances of the Service with ServiceName "ABE" in the selected scope:


ISClient client = GHNContext.getImplementation(ISClient.class);
GCUBERIQuery RIquery = client.getQuery(GCUBERIQuery.class);
RIquery.addAtomicConditions(new AtomicCondition("//ServiceName","ABE"));
for (GCUBERunningInstance instance : client.execute(RIquery,GCUBEScope.getScope("/gcube/devsec")))
logger.debug(instance.getServiceName()+"("+instance.getID()+")");


The following query retrieves all the HostingNode registered in the selected scope:


ISClient client = GHNContext.getImplementation(ISClient.class);
GCUBEGHNQuery GHNquery = client.getQuery(GCUBEGHNQuery.class);
for (GCUBEHostingNode node : client.execute(GHNquery,GCUBEScope.getScope("/gcube/devsec")))
logger.debug(node.getID()+"("+node.getNodeDescription().getName()+")");


The following query retrieves all the RunningInstances of the Service with ServiceName "GHNManager" or "SoftwareRepository":


ISClient client = GHNContext.getImplementation(ISClient.class);
GCUBERIQuery RIquery = client.getQuery(GCUBERIQuery.class);
RIquery.addGenericCondition("$result/Profile/ServiceName/string() eq 'GHNManager' or $result/Profile/ServiceName/string() eq 'SoftwareRepository'");
for (GCUBERunningInstance instance : client.execute(RIquery,GCUBEScope.getScope("/gcube/devsec")))
                      logger.debug(instance.getServiceName()+"("+instance.getID()+")");

How to query over resource property documents

Queries over GCUBEWSResource:

  • WSResourceQuery

This query returns a List of RPDocument. The RPDocument object allows developer to retrieve the informations on WSResourceProperties or to exceute XPath .


To get one of GCUBEResource or GCUBEWSResource queries:

 ... 
 [GCUBE...Query] query = client.getQuery([GCUBE...Query].class);    
 ... 

On this kind of queries the developer can reduce the number of results inserting a filter. The supported filters are:

  • AtomicCondition
    • with the atomic conditions can be specified that a node with a determined path *MUST* have a specified value
 ...   new AtomicCondition("//Endpoint/@EntryName","gcube/annotationmanagement/abe/factory")
  • GenericCondition
    • with the generic conditions can be specified a entire condition string (using $result as starter node of every used path)
  ....addGenericCondition("$result/[path] eq '[something]' or $result/[another path] eq '[something else]'");


Usage Example

The following example returns all the WSResources generated by the services with ServiceClass "Sample":


ISClient client = GHNContext.getImplementation(ISClient.class);
WSResourceQuery wsquery = client.getQuery(WSResourceQuery.class);
wsquery.addAtomicConditions(new AtomicCondition("//gc:ServiceClass","Samples"));
for (RPDocument d : client.execute(wsquery,GCUBEScope.getScope("/gcube/devsec"))) 
logger.debug(d.getEndpoint()+":+d.getVO()+":"d.evaluate("//MyRP").get(0));

Custom queries

The ExistClient also offers the possibility to execute custom queries: GCUBEGenericQuery. GCUBEGenericQuery allows the developer to set the query expression to execute and to use a predefined set of queries which he should set some parameters on listed below:

  • GCUBEResourceQuery:
    • TYPE
    • FILTER
    • RESULT (the default value returns Ids)
  • GCUBEWSResourceQuery:
    • FILTER
    • RESULT (the default value is the entire Properties Document Data)
  • RIEndpoint:
    • NAME (Service name)
    • CLASS (Service class)
    • ENTRY (the entry point)
  • RIOnGHN:
    • ID (the GHN id)
  • RISpecificData:
    • NAME (Service name)
    • CLASS (Service class)
    • ENTRY (the entry point)
  • GHNIDFromHostName:
    • NAME (GHN name)
    • RESULT (the default value returns Ids)
  • InternalCollections
  • InternalCollectionIDs
  • UserCollectionIDsFromSchemaURI
    • URI (the schema uri)
  • MCollectionIDForCollection
    • ID (related collection ID)
  • MCollectionFormatsForCollection
    • ID (related collection ID)
  • MCollectionIDFromCollectionIDAndRole
    • ID (related collection ID)
    • ROLE (secondary role)
  • MCollectionIDFromMFLanguage
    • LANGUAGE (metadata format language)
  • MCollectionIDFromName
    • NAME (metadata collection name)
  • MCollectionIDFromSchemaURI
    • URI (schema uri)


This kind of queries returns a List of XMLResult. The XMLResult object allows the developer to explore the contained document with XPaths. To get a predefined generic query:

 ... 
 GCUBEGenericQuery query = client.getQuery("[one of the listed queries]");    
 ... 

to set the parameters:

 ... 
 query.addParameters(new QueryParameter("[parameter to set]","[value]"), new QueryParameter("[parameter to set]","[value ...]"));
 ...


Usage Example

The first two examples are queries used to retrieve all the IDs of the profiles stored on the DB:


ISClient client = GHNContext.getImplementation(ISClient.class);
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
GCUBEGenericQuery query = client.getQuery(GCUBEGenericQuery.class);
query.setExpression("for $Profile in collection(\"/db/Profiles\")//Document/Data/child::*[local-name()='Profile']/Resource return $Profile/ID");
List<XMLResult> result =client.execute(query, scope);
for (XMLResult resultItem :result ) {
logger.debug(resultItem.evaluate("an XPath ... ")); 
logger.debug(resultItem.toString());
}


ISClient client = GHNContext.getImplementation(ISClient.class);
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
GCUBEGenericQuery query = client.getQuery("GCUBEResourceQuery");
for (XMLResult result : client.execute(query,scope)) logger.debug(result.evaluate("/ID/text()"));//displays a singleton list


This example represents how to retrieve Profiles IDs for all RunningInstances:


ISClient client = GHNContext.getImplementation(ISClient.class);
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
GCUBEGenericQuery query = client.getQuery("GCUBEResourceQuery");
query.addParameters(new QueryParameter("TYPE",GCUBERunningInstance.TYPE)); 
for (XMLResult result : client.execute(query,scope)) logger.debug(result.evaluate("/Type/text()"));


This Example describes how to retrieve profiles Descriptions for all the RunningInstances Profiles of all the services with ServiceClass "Annotation":


ISClient client = GHNContext.getImplementation(ISClient.class);
GCUBEScope scope = GCUBEScope.getScope("/gcube/devsec");
GCUBEGenericQuery query = client.getQuery("GCUBEResourceQuery");
//introduce a filter (NB. parameters can be added in batches) 
query.addParameters(new QueryParameter("TYPE",GCUBERunningInstance.TYPE), //ovverride previous setting
     new QueryParameter("FILTER","$result/Profile/ServiceClass/string() eq 'Annotation'"),
     new QueryParameter ("RESULT", "$result/Profile/Description")); //any Xquery condition on $result would do
for (XMLResult result : client.execute(query,scope)) logger.debug(result.evaluate("//Description")); //displays a singleton list