You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2009/06/29 15:46:31 UTC
svn commit: r789324 - in /jackrabbit/trunk:
jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/
jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/
jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/ ja...
Author: mreutegg
Date: Mon Jun 29 13:46:30 2009
New Revision: 789324
URL: http://svn.apache.org/viewvc?rev=789324&view=rev
Log:
JCR-2175: Return bind variable names on RepositoryService.checkQueryStatement()
Modified:
jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java
jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml
jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java
Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Mon Jun 29 13:46:30 2009
@@ -294,15 +294,16 @@
* @param language the query language.
* @param namespaces the locally remapped namespaces which might be used in
* the query statement.
+ * @return the bind variable names.
* @throws InvalidQueryException if the query statement is invalid.
* @throws RepositoryException if an error occurs while checking the query
* statement.
*/
- public void checkQueryStatement(String statement,
- String language,
- Map namespaces)
+ public String[] checkQueryStatement(String statement,
+ String language,
+ Map namespaces)
throws InvalidQueryException, RepositoryException {
- service.checkQueryStatement(sessionInfo, statement, language, namespaces);
+ return service.checkQueryStatement(sessionInfo, statement, language, namespaces);
}
/**
Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java Mon Jun 29 13:46:30 2009
@@ -18,6 +18,8 @@
import java.util.HashMap;
import java.util.Map;
+import java.util.Arrays;
+import java.util.Collection;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
@@ -102,6 +104,12 @@
private final Map<String, QValue> boundValues = new HashMap<String, QValue>();
/**
+ * The names of the bind variables as returned by the SPI implementation
+ * after checking the query statement.
+ */
+ private final Collection<String> varNames;
+
+ /**
* Creates a new query.
*
* @param session the session that created this query.
@@ -129,7 +137,8 @@
this.statement = statement;
this.language = language;
this.wspManager = wspManager;
- this.wspManager.checkQueryStatement(statement, language, getNamespaceMappings());
+ this.varNames = Arrays.asList(this.wspManager.checkQueryStatement(
+ statement, language, getNamespaceMappings()));
this.node = node;
}
@@ -215,6 +224,9 @@
* @see Query#bindValue(String, Value)
*/
public void bindValue(String varName, Value value) throws RepositoryException {
+ if (!varNames.contains(varName)) {
+ throw new IllegalArgumentException(varName + " is not a known bind variable name in this query");
+ }
if (value == null) {
boundValues.remove(varName);
} else {
Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java Mon Jun 29 13:46:30 2009
@@ -774,7 +774,7 @@
return new String[0];
}
- public void checkQueryStatement(SessionInfo sessionInfo, String statement,
+ public String[] checkQueryStatement(SessionInfo sessionInfo, String statement,
String language, Map namespaces) throws
InvalidQueryException, RepositoryException {
throw new UnsupportedRepositoryOperationException();
Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java Mon Jun 29 13:46:30 2009
@@ -542,13 +542,12 @@
}, "getSupportedQueryLanguages(SessionInfo)", new Object[]{unwrap(sessionInfo)});
}
- public void checkQueryStatement(final SessionInfo sessionInfo, final String statement,
+ public String[] checkQueryStatement(final SessionInfo sessionInfo, final String statement,
final String language, final Map<String, String> namespaces) throws RepositoryException {
- execute(new Callable() {
+ return (String[]) execute(new Callable() {
public Object call() throws RepositoryException {
- service.checkQueryStatement(unwrap(sessionInfo), statement, language, namespaces);
- return null;
+ return service.checkQueryStatement(unwrap(sessionInfo), statement, language, namespaces);
}
}, "checkQueryStatement(SessionInfo, String, String, Map)",
new Object[]{unwrap(sessionInfo), statement, language, namespaces});
Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Mon Jun 29 13:46:30 2009
@@ -868,20 +868,22 @@
/**
* Checks if the query <code>statement</code> is valid according to the
- * specified query <code>language</code>.
+ * specified query <code>language</code> and returns the bind variable
+ * names found in the query statement.
*
* @param sessionInfo the session info.
* @param statement the query statement to check.
* @param language the query language.
* @param namespaces the locally re-mapped namespace which may be used in
* the query <code>statement</code>.
+ * @return the bind variable names.
* @throws InvalidQueryException if the query statement is invalid or the
* language is not supported.
* @throws RepositoryException if an error occurs while checking the
* statement.
* @see javax.jcr.query.QueryManager#createQuery(String, String)
*/
- public void checkQueryStatement(SessionInfo sessionInfo, String statement, String language, Map<String, String> namespaces) throws InvalidQueryException, RepositoryException;
+ public String[] checkQueryStatement(SessionInfo sessionInfo, String statement, String language, Map<String, String> namespaces) throws InvalidQueryException, RepositoryException;
/**
* Execute the given query statement with the specified query language. The
Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Mon Jun 29 13:46:30 2009
@@ -1667,12 +1667,13 @@
}
}
- public void checkQueryStatement(SessionInfo sessionInfo,
+ public String[] checkQueryStatement(SessionInfo sessionInfo,
String statement,
String language,
Map namespaces)
throws InvalidQueryException, RepositoryException {
// TODO implement
+ return new String[0];
}
/**
Modified: jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml Mon Jun 29 13:46:30 2009
@@ -70,7 +70,6 @@
org.apache.jackrabbit.jcr2spi.name.NamespaceRegistryTest#testReRegisteredNamespaceVisibility
org.apache.jackrabbit.jcr2spi.name.NamespaceRegistryTest#testRegisteredNamespaceVisibility
org.apache.jackrabbit.test.api.observation.EventJournalTest
- org.apache.jackrabbit.test.api.query.qom.BindVariableValueTest#testIllegalArgumentException
org.apache.jackrabbit.test.api.ShareableNodeTest
org.apache.jackrabbit.test.api.version.simple
</value>
Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java?rev=789324&r1=789323&r2=789324&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java Mon Jun 29 13:46:30 2009
@@ -86,6 +86,13 @@
import javax.jcr.query.InvalidQueryException;
import javax.jcr.query.QueryManager;
import javax.jcr.query.Query;
+import javax.jcr.query.qom.Constraint;
+import javax.jcr.query.qom.And;
+import javax.jcr.query.qom.Or;
+import javax.jcr.query.qom.Not;
+import javax.jcr.query.qom.Comparison;
+import javax.jcr.query.qom.BindVariableValue;
+import javax.jcr.query.qom.QueryObjectModel;
import javax.jcr.lock.LockException;
import javax.jcr.lock.Lock;
import javax.jcr.version.VersionException;
@@ -1017,13 +1024,14 @@
/**
* {@inheritDoc}
*/
- public void checkQueryStatement(SessionInfo sessionInfo,
+ public String[] checkQueryStatement(SessionInfo sessionInfo,
String statement,
String language,
Map namespaces)
throws InvalidQueryException, RepositoryException {
- createQuery(getSessionInfoImpl(sessionInfo).getSession(), statement,
- language, namespaces);
+ Query q = createQuery(getSessionInfoImpl(sessionInfo).getSession(),
+ statement, language, namespaces);
+ return getBindVariableNames(q);
}
/**
@@ -1789,4 +1797,36 @@
// if we get here simply run as is
return call.run();
}
+
+ private String[] getBindVariableNames(Query query) {
+ List<String> names = new ArrayList<String>();
+ if (query instanceof QueryObjectModel) {
+ QueryObjectModel qom = (QueryObjectModel) query;
+ collectBindVariableNames(qom.getConstraint(), names);
+ } else {
+ // TODO: use when available
+ // names.addAll(Arrays.asList(q.getBindVariableNames()));
+ }
+ return names.toArray(new String[names.size()]);
+ }
+
+ private void collectBindVariableNames(Constraint c, List<String> names) {
+ if (c instanceof And) {
+ collectBindVariableNames(((And) c).getConstraint1(), names);
+ collectBindVariableNames(((And) c).getConstraint2(), names);
+ } else if (c instanceof Or) {
+ collectBindVariableNames(((Or) c).getConstraint1(), names);
+ collectBindVariableNames(((Or) c).getConstraint2(), names);
+ } else if (c instanceof Not) {
+ collectBindVariableNames(((Not) c).getConstraint(), names);
+ } else if (c instanceof Comparison) {
+ collectBindVariableNames((Comparison) c, names);
+ }
+ }
+
+ private void collectBindVariableNames(Comparison c, List<String> names) {
+ if (c.getOperand2() instanceof BindVariableValue) {
+ names.add(((BindVariableValue) c.getOperand2()).getBindVariableName());
+ }
+ }
}