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(); + } }