Return-Path: X-Original-To: apmail-clerezza-commits-archive@www.apache.org Delivered-To: apmail-clerezza-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id F39671080A for ; Mon, 8 Jul 2013 20:36:21 +0000 (UTC) Received: (qmail 31855 invoked by uid 500); 8 Jul 2013 20:36:21 -0000 Delivered-To: apmail-clerezza-commits-archive@clerezza.apache.org Received: (qmail 31830 invoked by uid 500); 8 Jul 2013 20:36:21 -0000 Mailing-List: contact commits-help@clerezza.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@clerezza.apache.org Delivered-To: mailing list commits@clerezza.apache.org Received: (qmail 31823 invoked by uid 99); 8 Jul 2013 20:36:21 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 08 Jul 2013 20:36:21 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 08 Jul 2013 20:36:19 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 4284523888A6; Mon, 8 Jul 2013 20:35:59 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1500935 - in /clerezza/trunk: rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/ rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/ rdf.jena.tdb.storage/src/main/java/org/apache/clerezza/rdf/jena/tdb/storage/ site/src/mai... Date: Mon, 08 Jul 2013 20:35:59 -0000 To: commits@clerezza.apache.org From: reto@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20130708203559.4284523888A6@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: reto Date: Mon Jul 8 20:35:58 2013 New Revision: 1500935 URL: http://svn.apache.org/r1500935 Log: CLEREZZA-468: routing implemented in TcManager. Changes to API to accept DefaultGraph as URI rather than TripleCollection Modified: clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/QueryableTcProvider.java clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParser.java clerezza/trunk/rdf.jena.tdb.storage/src/main/java/org/apache/clerezza/rdf/jena/tdb/storage/BaseTdbTcProvider.java clerezza/trunk/site/src/main/scala/TitledContentRenderlet.scala Modified: clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/QueryableTcProvider.java URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/QueryableTcProvider.java?rev=1500935&r1=1500934&r2=1500935&view=diff ============================================================================== --- clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/QueryableTcProvider.java (original) +++ clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/QueryableTcProvider.java Mon Jul 8 20:35:58 2013 @@ -19,6 +19,7 @@ package org.apache.clerezza.rdf.core.access; import org.apache.clerezza.rdf.core.TripleCollection; +import org.apache.clerezza.rdf.core.UriRef; import org.apache.clerezza.rdf.core.sparql.query.Query; /** @@ -37,18 +38,6 @@ public interface QueryableTcProvider ext * FROM clause is present * @return the resulting ResultSet, Graph or Boolean value */ - public Object executeSparqlQuery(String query, TripleCollection defaultGraph); + public Object executeSparqlQuery(String query, UriRef defaultGraphUri); - /** - * Executes any sparql query. The type of the result object will vary - * depending on the type of the query. - * - * @param query - * the sparql query to execute - * @param defaultGraph - * the default graph against which to execute the query if not - * FROM clause is present - * @return the resulting ResultSet, Graph or Boolean value - */ - public Object executeSparqlQuery(Query query, TripleCollection defaultGraph); } Modified: clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java?rev=1500935&r1=1500934&r2=1500935&view=diff ============================================================================== --- clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java (original) +++ clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java Mon Jul 8 20:35:58 2013 @@ -38,8 +38,10 @@ import org.apache.clerezza.rdf.core.acce import org.apache.clerezza.rdf.core.impl.WriteBlockedMGraph; import org.apache.clerezza.rdf.core.impl.WriteBlockedTripleCollection; import org.apache.clerezza.rdf.core.sparql.NoQueryEngineException; +import org.apache.clerezza.rdf.core.sparql.ParseException; import org.apache.clerezza.rdf.core.sparql.QueryEngine; import org.apache.clerezza.rdf.core.sparql.ResultSet; +import org.apache.clerezza.rdf.core.sparql.SparqlPreParser; import org.apache.clerezza.rdf.core.sparql.query.AskQuery; import org.apache.clerezza.rdf.core.sparql.query.ConstructQuery; import org.apache.clerezza.rdf.core.sparql.query.DescribeQuery; @@ -56,67 +58,71 @@ import org.osgi.framework.ServiceRegistr import org.osgi.service.component.ComponentContext; /** - * This class implements TcManager, delegating the actual - * provision and creation of Graphs or MGraphs to registered TcProviders. The class - * attempts to satisfy the request using the register WeightedTcProvider - * in decreasing order of weight. If multiple providers have the same weight the - * lexicographical order of the fully qualified class name determines which one - * is used, namely the one that occurs earlier. If a call to a registered provider - * causes an IllegalArgumentException, NoSuchEntityException - * or UnsupportedOperationException then the call is delegated to the + * This class implements + * TcManager, delegating the actual provision and creation of + * Graphs or MGraphs to registered + * TcProviders. The class attempts to satisfy the request using the + * register + * WeightedTcProvider in decreasing order of weight. If multiple + * providers have the same weight the lexicographical order of the fully + * qualified class name determines which one is used, namely the one that occurs + * earlier. If a call to a registered provider causes an + * IllegalArgumentException, + * NoSuchEntityException or + * UnsupportedOperationException then the call is delegated to the * next provider. * * Only one instance of this class should exist in a system, the public no - * argument constructor is meant for initialization by dependency injection systems - * such as OSGi-DS. Applications should use the static getInstance() - * method if they aren't using a framework that injects them the instance. + * argument constructor is meant for initialization by dependency injection + * systems such as OSGi-DS. Applications should use the static + * getInstance() method if they aren't using a framework that + * injects them the instance. * - * This class returns LockableMGraphs a subtype of MGraph - * that allows read/write locks. - * - * This class also registers all TripleCollections as services with the property + * This class returns + * LockableMGraphs a subtype of + * MGraph that allows read/write locks. + * + * This class also registers all TripleCollections as services with the property * 'name' indicating there name. - * - * Security checks are done when a TripleCollection is retrieved. The returned - * TripleCollection will do no further security checks. Because of this it should - * not be passed to a context where different access control applies. If an MGraph - * is retrieved without having write permission the returned mGraph will be read-only. - * - * If a TripleCollections needs to passed around across different security contexts - * the one retrieved from the OSGi service whiteboard should be used as this - * performs access control on every access. + * + * Security checks are done when a TripleCollection is retrieved. The returned + * TripleCollection will do no further security checks. Because of this it + * should not be passed to a context where different access control applies. If + * an MGraph is retrieved without having write permission the returned mGraph + * will be read-only. + * + * If a TripleCollections needs to passed around across different security + * contexts the one retrieved from the OSGi service whiteboard should be used as + * this performs access control on every access. * * @author reto, mir, hasan - * + * */ @Component @Service(TcManager.class) -@Reference(name="weightedTcProvider", policy=ReferencePolicy.DYNAMIC, - referenceInterface=WeightedTcProvider.class, - cardinality=ReferenceCardinality.MANDATORY_MULTIPLE) +@Reference(name = "weightedTcProvider", policy = ReferencePolicy.DYNAMIC, + referenceInterface = WeightedTcProvider.class, + cardinality = ReferenceCardinality.MANDATORY_MULTIPLE) public class TcManager extends TcProviderMultiplexer { private static volatile TcManager instance; - private TcAccessController tcAccessController = new TcAccessController(this); - private Map serviceRegistrations = Collections .synchronizedMap(new HashMap()); - - - @Reference(policy=ReferencePolicy.DYNAMIC, - cardinality=ReferenceCardinality.MANDATORY_UNARY) + @Reference(policy = ReferencePolicy.DYNAMIC, + cardinality = ReferenceCardinality.MANDATORY_UNARY) protected QueryEngine queryEngine; - + @Reference + protected SparqlPreParser sparqlPreParser; private ComponentContext componentContext; private Collection mGraphsToRegisterOnActivation = new HashSet(); private Collection graphsToRegisterOnActivation = new HashSet(); - /** * the constructor sets the singleton instance to allow instantiation by * OSGi-DS. This constructor should not be called except by OSGi-DS, - * otherwise the static getInstance method should be used. + * otherwise the static + * getInstance method should be used. */ public TcManager() { TcManager.instance = this; @@ -127,14 +133,14 @@ public class TcManager extends TcProvide * created (e.g. by OSGi declarative services) this instance is returned, * otherwise a new instance is created and providers are injected using the * service provider interface (META-INF/services/) - * + * * @return the singleton instance */ public static TcManager getInstance() { if (instance == null) { synchronized (TcManager.class) { if (instance == null) { - new TcManager(); + instance = new TcManager(); Iterator weightedProviders = ServiceLoader .load(WeightedTcProvider.class).iterator(); while (weightedProviders.hasNext()) { @@ -151,6 +157,7 @@ public class TcManager extends TcProvide System.out.println("QE: " + instance.queryEngine.getClass()); } + instance.sparqlPreParser = new SparqlPreParser(instance); } } } @@ -204,8 +211,6 @@ public class TcManager extends TcProvide return super.getTriples(name); } - - @Override public LockableMGraph createMGraph(UriRef name) throws UnsupportedOperationException { @@ -267,16 +272,24 @@ public class TcManager extends TcProvide /** * Executes any sparql query. The type of the result object will vary - * depending on the type of the query. - * - * @param query - * the sparql query to execute - * @param defaultGraph - * the default graph against which to execute the query if not - * FROM clause is present + * depending on the type of the query. If the defaultGraph is available + * in this TcManages executeSparqlQuery(String, UriRef) should be used instead. + * + * @param query the sparql query to execute + * @param defaultGraph the default graph against which to execute the query + * if no FROM clause is present * @return the resulting ResultSet, Graph or Boolean value */ - public Object executeSparqlQuery(String query, TripleCollection defaultGraph) { + public Object executeSparqlQuery(String query, TripleCollection defaultGraph) throws ParseException { + final UriRef defaultGraphName = new UriRef("urn:x-temp:/kjsfadfhfasdffds"); + final Set referencedGraphs = sparqlPreParser.getReferredGraphs(query, defaultGraphName); + TcProvider singleTargetTcProvider = null; + if ((referencedGraphs != null) && (!referencedGraphs.contains(defaultGraphName))) { + singleTargetTcProvider = getSingleTargetTcProvider(referencedGraphs); + } + if ((singleTargetTcProvider != null) && (singleTargetTcProvider instanceof QueryableTcProvider)) { + return ((QueryableTcProvider)singleTargetTcProvider).executeSparqlQuery(query, null); + } final QueryEngine queryEngine = this.queryEngine; if (queryEngine != null) { return queryEngine.execute(this, defaultGraph, query); @@ -284,18 +297,33 @@ public class TcManager extends TcProvide throw new NoQueryEngineException(); } } + + public Object executeSparqlQuery(String query, UriRef defaultGraphName) throws ParseException { + final Set referencedGraphs = sparqlPreParser.getReferredGraphs(query, defaultGraphName); + TcProvider singleTargetTcProvider = null; + if ((referencedGraphs != null)) { + singleTargetTcProvider = getSingleTargetTcProvider(referencedGraphs); + } + if ((singleTargetTcProvider != null) && (singleTargetTcProvider instanceof QueryableTcProvider)) { + return ((QueryableTcProvider)singleTargetTcProvider).executeSparqlQuery(query, defaultGraphName); + } + final QueryEngine queryEngine = this.queryEngine; + if (queryEngine != null) { + return queryEngine.execute(this, this.getTriples(defaultGraphName), query); + } else { + throw new NoQueryEngineException(); + } + } /** * Executes any sparql query. The type of the result object will vary * depending on the type of the query. - * - * @param query - * the sparql query to execute - * @param defaultGraph - * the default graph against which to execute the query if not - * FROM clause is present + * + * @param query the sparql query to execute + * @param defaultGraph the default graph against which to execute the query + * if no FROM clause is present * @return the resulting ResultSet, Graph or Boolean value - * + * * @deprecated Query is discontinued */ @Deprecated @@ -310,70 +338,62 @@ public class TcManager extends TcProvide /** * Executes a sparql SELECT query. - * - * @param query - * the sparql SELECT query to execute - * @param defaultGraph - * the default graph against which to execute the query if not - * FROM clause is present + * + * @param query the sparql SELECT query to execute + * @param defaultGraph the default graph against which to execute the query + * if not FROM clause is present * @return the resulting ResultSet * @deprecated Query is discontinued */ @Deprecated public ResultSet executeSparqlQuery(SelectQuery query, TripleCollection defaultGraph) { - return (ResultSet) executeSparqlQuery((Query)query, defaultGraph); + return (ResultSet) executeSparqlQuery((Query) query, defaultGraph); } /** * Executes a sparql ASK query. - * - * @param query - * the sparql ASK query to execute - * @param defaultGraph - * the default graph against which to execute the query if not - * FROM clause is present + * + * @param query the sparql ASK query to execute + * @param defaultGraph the default graph against which to execute the query + * if not FROM clause is present * @return the boolean value this query evaluates to * @deprecated Query is discontinued */ @Deprecated public boolean executeSparqlQuery(AskQuery query, TripleCollection defaultGraph) { - return (Boolean) executeSparqlQuery((Query)query, defaultGraph); + return (Boolean) executeSparqlQuery((Query) query, defaultGraph); } /** * Executes a sparql DESCRIBE query. - * - * @param query - * the sparql DESCRIBE query to execute - * @param defaultGraph - * the default graph against which to execute the query if not - * FROM clause is present + * + * @param query the sparql DESCRIBE query to execute + * @param defaultGraph the default graph against which to execute the query + * if not FROM clause is present * @return the resulting Graph * @deprecated Query is discontinued */ @Deprecated public Graph executeSparqlQuery(DescribeQuery query, TripleCollection defaultGraph) { - return (Graph) executeSparqlQuery((Query)query, defaultGraph); + return (Graph) executeSparqlQuery((Query) query, defaultGraph); } /** * Executes a sparql CONSTRUCT query. - * - * @param query - * the sparql CONSTRUCT query to execute - * @param defaultGraph - * the default graph against which to execute the query if not - * FROM clause is present + * + * @param query the sparql CONSTRUCT query to execute + * @param defaultGraph the default graph against which to execute the query + * if not FROM clause is present * @return the resulting Graph * @deprecated Query is discontinued */ @Deprecated public Graph executeSparqlQuery(ConstructQuery query, TripleCollection defaultGraph) { - return (Graph) executeSparqlQuery((Query)query, defaultGraph); + return (Graph) executeSparqlQuery((Query) query, defaultGraph); } /** @@ -387,8 +407,7 @@ public class TcManager extends TcProvide /** * Registers a provider * - * @param provider - * the provider to be registered + * @param provider the provider to be registered */ protected void bindWeightedTcProvider(WeightedTcProvider provider) { addWeightedTcProvider(provider); @@ -397,8 +416,7 @@ public class TcManager extends TcProvide /** * Unregister a provider * - * @param provider - * the provider to be deregistered + * @param provider the provider to be deregistered */ protected void unbindWeightedTcProvider( WeightedTcProvider provider) { @@ -429,13 +447,13 @@ public class TcManager extends TcProvide String[] interfaceNames; Object service; if (isMGraph) { - interfaceNames = new String[] { + interfaceNames = new String[]{ MGraph.class.getName(), LockableMGraph.class.getName() }; service = new MGraphServiceFactory(this, name, tcAccessController); } else { - interfaceNames = new String[] {Graph.class.getName()}; + interfaceNames = new String[]{Graph.class.getName()}; service = new GraphServiceFactory(this, name, tcAccessController); } final int bundleState = componentContext.getBundleContext().getBundle().getState(); @@ -456,4 +474,21 @@ public class TcManager extends TcProvide serviceRegistrations.remove(name); } } + + private TcProvider getSingleTargetTcProvider(final Set referencedGraphs) { + TcProvider singleTargetTcProvider = null; + for (WeightedTcProvider provider : providerList) { + final Set providerTripleCollections = provider.listTripleCollections(); + if (providerTripleCollections.containsAll(referencedGraphs)) { + singleTargetTcProvider = provider; + break; //success + } + for (UriRef graphName : referencedGraphs) { + if (providerTripleCollections.contains(graphName)) { + break; //failure + } + } + } + return singleTargetTcProvider; + } } Modified: clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java?rev=1500935&r1=1500934&r2=1500935&view=diff ============================================================================== --- clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java (original) +++ clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java Mon Jul 8 20:35:58 2013 @@ -44,7 +44,7 @@ import org.apache.clerezza.rdf.core.spar */ public class TcProviderMultiplexer implements TcProvider { - private SortedSet providerList = new TreeSet( + protected SortedSet providerList = new TreeSet( new WeightedProviderComparator()); /** * Mapping to LockableMGraph's and ServiceRegistration using their URI's as key. Modified: clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParser.java URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParser.java?rev=1500935&r1=1500934&r2=1500935&view=diff ============================================================================== --- clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParser.java (original) +++ clerezza/trunk/rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParser.java Mon Jul 8 20:35:58 2013 @@ -51,6 +51,19 @@ public class SparqlPreParser { this.tcManager = tcManager; } + /** + * This returns the graphs targeted by the queryString. This are the the + * triple collections explicitely refreded in FROM and FROM NAMED clauses, + * and if the queryString contains no FROM clause the defaultGraph. + * + * For queries that are not limited to specified set of graphs null is returned. + * + * + * @param queryString + * @param defaultGraph + * @return + * @throws ParseException + */ public Set getReferredGraphs(String queryString, UriRef defaultGraph) throws ParseException { Set referredGraphs; JavaCCGeneratedSparqlPreParser parser = new JavaCCGeneratedSparqlPreParser(new StringReader(queryString)); Modified: clerezza/trunk/rdf.jena.tdb.storage/src/main/java/org/apache/clerezza/rdf/jena/tdb/storage/BaseTdbTcProvider.java URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.jena.tdb.storage/src/main/java/org/apache/clerezza/rdf/jena/tdb/storage/BaseTdbTcProvider.java?rev=1500935&r1=1500934&r2=1500935&view=diff ============================================================================== --- clerezza/trunk/rdf.jena.tdb.storage/src/main/java/org/apache/clerezza/rdf/jena/tdb/storage/BaseTdbTcProvider.java (original) +++ clerezza/trunk/rdf.jena.tdb.storage/src/main/java/org/apache/clerezza/rdf/jena/tdb/storage/BaseTdbTcProvider.java Mon Jul 8 20:35:58 2013 @@ -14,6 +14,7 @@ import com.hp.hpl.jena.query.QueryExecEx import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QueryFactory; +import org.apache.clerezza.rdf.core.UriRef; abstract class BaseTdbTcProvider implements QueryableTcProvider{ @@ -28,13 +29,14 @@ abstract class BaseTdbTcProvider impleme // ------------------------------------------------------------------------ @Override - public Object executeSparqlQuery(final String query, TripleCollection defaultGraph) { + public Object executeSparqlQuery(final String query, UriRef defaultGraph) { // Missing permission (java.lang.RuntimePermission getClassLoader) // when calling QueryFactory.create causes ExceptionInInitializerError // to be thrown. // QueryExecutionFactory.create requires // (java.io.FilePermission [etc/]location-mapping.* read) // Thus, they are placed within doPrivileged + getDataset().setDefaultModel(null); QueryExecution qexec = AccessController .doPrivileged(new PrivilegedAction() { @@ -67,10 +69,6 @@ abstract class BaseTdbTcProvider impleme } } - @Override - public Object executeSparqlQuery(Query query, TripleCollection defaultGraph) { - return executeSparqlQuery(query.toString(), defaultGraph); - } // ------------------------------------------------------------------------ // Getters / Setters Modified: clerezza/trunk/site/src/main/scala/TitledContentRenderlet.scala URL: http://svn.apache.org/viewvc/clerezza/trunk/site/src/main/scala/TitledContentRenderlet.scala?rev=1500935&r1=1500934&r2=1500935&view=diff ============================================================================== --- clerezza/trunk/site/src/main/scala/TitledContentRenderlet.scala (original) +++ clerezza/trunk/site/src/main/scala/TitledContentRenderlet.scala Mon Jul 8 20:35:58 2013 @@ -53,7 +53,7 @@ class TitledContentRenderlet extends SRe @@ -96,7 +96,7 @@ class TitledContentRenderlet extends SRe
  • Getting Started
  • The Apache Clerezza Stack
  • -
  • API docs
  • +
  • API docs
  • FAQ