diff --git a/distro/changelog.xml b/distro/changelog.xml
index b43931f..5b7d5af 100644
--- a/distro/changelog.xml
+++ b/distro/changelog.xml
@@ -8,7 +8,10 @@
Fixed W3CEndpointReference->EndpointReferenceType conversion util
-
+
Aligns with gCF 1.6.0+ and eliminates dependencies on legacy scope handling mechanisms
+
+ internal refactoring
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 2d2da87..58821c1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
org.gcube.core
common-gcore-clients
- 2.1.0-SNAPSHOT
+ 2.2.0-SNAPSHOT
GCore Clients
A framework for client APIs that invoke GCore services
diff --git a/src/main/java/org/gcube/common/clients/gcore/plugins/Plugin.java b/src/main/java/org/gcube/common/clients/gcore/plugins/Plugin.java
index f685d29..2b36ac8 100644
--- a/src/main/java/org/gcube/common/clients/gcore/plugins/Plugin.java
+++ b/src/main/java/org/gcube/common/clients/gcore/plugins/Plugin.java
@@ -13,15 +13,10 @@ import org.gcube.common.clients.delegates.ProxyPlugin;
*/
public interface Plugin extends ProxyPlugin {
- /**
- * Returns the gCube name of the service.
- * @return the name
- */
- String serviceClass();
/**
- * Returns the gCube class of the service.
- * @return the class
+ * Returns the namespace of the service
+ * @return the namespace
*/
- String serviceName();;
+ String namespace();
}
diff --git a/src/main/java/org/gcube/common/clients/gcore/queries/GCoreQuery.java b/src/main/java/org/gcube/common/clients/gcore/queries/GCoreQuery.java
index 68cf85b..29e4db5 100644
--- a/src/main/java/org/gcube/common/clients/gcore/queries/GCoreQuery.java
+++ b/src/main/java/org/gcube/common/clients/gcore/queries/GCoreQuery.java
@@ -1,12 +1,19 @@
package org.gcube.common.clients.gcore.queries;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import org.apache.axis.message.addressing.EndpointReferenceType;
import org.gcube.common.clients.cache.DefaultEndpointCache;
import org.gcube.common.clients.cache.EndpointCache;
+import org.gcube.common.clients.delegates.ProxyPlugin;
+import org.gcube.common.clients.exceptions.DiscoveryException;
import org.gcube.common.clients.gcore.plugins.Plugin;
import org.gcube.common.clients.gcore.plugins.PluginAdapter;
-import org.gcube.common.clients.queries.AbstractQuery;
import org.gcube.common.clients.queries.Query;
+import org.gcube.common.clients.queries.ResultMatcher;
/**
* Partial implementation of {@link Query}s for gCore services.
@@ -15,10 +22,15 @@ import org.gcube.common.clients.queries.Query;
*
* @param the type of query results
*/
-public abstract class GCoreQuery extends AbstractQuery {
+public abstract class GCoreQuery implements Query {
+
+ private final ProxyPlugin plugin;
+
public static EndpointCache globalCache = new DefaultEndpointCache();
+ private final Map conditions = new HashMap();
+
private final ISFacade facade;
/**
@@ -28,8 +40,7 @@ public abstract class GCoreQuery extends AbstractQuery plugin) {
- super(plugin);
-
+ this.plugin = plugin;
this.facade=facade;
}
@@ -40,4 +51,106 @@ public abstract class GCoreQuery extends AbstractQuery matcher = new ResultMatcher() {
+ @Override public boolean match(R doc) {
+ return true;
+ }
+ };
+
+ /**
+ * Adds a condition to the query.
+ * @param property an expression that identifies a property of service endpoints
+ * @param value the value of the property
+ */
+ public void addCondition(String property, String value) {
+ this.conditions.put(property,value);
+ }
+
+ /**
+ * Sets an {@link ResultMatcher} for the query.
+ * @param matcher the matcher.
+ */
+ public void setMatcher(ResultMatcher matcher) {
+ this.matcher=matcher;
+ }
+
+ @Override
+ public final List fire() throws DiscoveryException {
+
+ //delegate actual execution to subclass-specific mechanisms
+ List results = fire(conditions);
+
+ //from results to addresses
+ List endpoints = new ArrayList();
+
+ for (R result : results)
+ try {
+ if (matcher.match(result)) //should we include this? ask matcher
+ endpoints.add(address(result)); //extract address
+ }
+ catch(IllegalArgumentException e) {
+ //skip result, this is just a signal from subclasses
+ };
+
+ return endpoints;
+ }
+
+ /**
+ * Executes the query through implementation-specific means.
+ * @param conditions the conditions to apply on the query prior to its execution
+ * @return the query results
+ * @throws DiscoveryException if the query could not be executed
+ */
+ protected abstract List fire(Map conditions) throws DiscoveryException;
+
+ /**
+ * Returns an endpoint address from a query result.
+ * @param result the result
+ * @return the address
+ * @throws IllegalArgumentException if an address cannot be derived from the result
+ */
+ protected abstract EndpointReferenceType address(R result) throws IllegalArgumentException;
+
+ /**
+ * Returns the {@link ProxyPlugin}.
+ * @return the plugin
+ */
+ protected ProxyPlugin plugin() {
+ return plugin;
+ }
+
+ //queries are value objects based on properties
+
+ @Override
+ public final boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ GCoreQuery> other = (GCoreQuery>) obj;
+ if (conditions == null) {
+ if (other.conditions != null)
+ return false;
+ } else if (!conditions.equals(other.conditions))
+ return false;
+ return true;
+ }
+
+ @Override
+ public final int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((conditions == null) ? 0 : conditions.hashCode());
+ return result;
+ }
+
+ @Override
+ public final String toString() {
+ return conditions.toString();
+ }
}