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 2006/12/07 09:22:53 UTC
svn commit: r483370 - in /jackrabbit/trunk/contrib/spi:
client/src/test/java/org/apache/jackrabbit/jcr2spi/query/
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/
jcr2spi/src/main/java/org/a...
Author: mreutegg
Date: Thu Dec 7 00:22:51 2006
New Revision: 483370
URL: http://svn.apache.org/viewvc?view=rev&rev=483370
Log:
Work in progress
- Add checkQueryStatement() to RepositoryService
- Add Map of locally remapped namespaces to RepositoryService.executeQuery()
- Added test case for query statement with locally remapped namespace prefix
TODO: implement query statement check in spi2dav
Modified:
jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/query/QueryTest.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/LocalNamespaceMappings.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryManagerImpl.java
jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
Modified: jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/query/QueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/query/QueryTest.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/query/QueryTest.java (original)
+++ jackrabbit/trunk/contrib/spi/client/src/test/java/org/apache/jackrabbit/jcr2spi/query/QueryTest.java Thu Dec 7 00:22:51 2006
@@ -20,6 +20,7 @@
import javax.jcr.RepositoryException;
import javax.jcr.NodeIterator;
import javax.jcr.Node;
+import javax.jcr.NamespaceRegistry;
import java.util.List;
import java.util.ArrayList;
@@ -38,5 +39,30 @@
}
Node[] children = (Node[]) nodes.toArray(new Node[nodes.size()]);
executeXPathQuery(superuser, "/jcr:root/*", children);
+ }
+
+ public void testRemappedNamespace() throws RepositoryException {
+ String namespaceURI = "http://jackrabbit.apache.org/spi/test";
+ String defaultPrefix = "spiTest";
+
+ NamespaceRegistry nsReg = superuser.getWorkspace().getNamespaceRegistry();
+ try {
+ nsReg.getPrefix(namespaceURI);
+ } catch (RepositoryException e) {
+ nsReg.registerNamespace(defaultPrefix, namespaceURI);
+ }
+
+ Node n = testRootNode.addNode("spiTest:node");
+ testRootNode.save();
+
+ long time = System.currentTimeMillis();
+ for (int i = 0; i < 10; i++) {
+ String prefix = defaultPrefix + i;
+ superuser.setNamespacePrefix(prefix, namespaceURI);
+ executeXPathQuery(superuser, testPath + "/" + prefix + ":node", new Node[]{n});
+ }
+ time = System.currentTimeMillis() - time;
+ System.out.println("Executed 10 queries in " + time + " ms");
+ System.out.println("Time per query: " + (time / 10) + " ms");
}
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java Thu Dec 7 00:22:51 2006
@@ -725,6 +725,11 @@
}
//--------------------------------------------------------------------------
+
+ LocalNamespaceMappings getLocalNamespaceMappings() {
+ return nsMappings;
+ }
+
ItemManager getItemManager() {
return itemManager;
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java Thu Dec 7 00:22:51 2006
@@ -260,7 +260,7 @@
public QueryManager getQueryManager() throws RepositoryException {
session.checkIsAlive();
if (qManager == null) {
- qManager = new QueryManagerImpl(session, session.getNamespaceResolver(),
+ qManager = new QueryManagerImpl(session, session.getLocalNamespaceMappings(),
session.getItemManager(), session.getItemStateManager(), wspManager);
}
return qManager;
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Thu Dec 7 00:22:51 2006
@@ -95,6 +95,7 @@
import javax.jcr.MergeException;
import javax.jcr.Session;
import javax.jcr.ReferentialIntegrityException;
+import javax.jcr.query.InvalidQueryException;
import javax.jcr.version.VersionException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
@@ -246,15 +247,34 @@
}
/**
+ * Checks if the query statement is valid.
*
- * @param statement
- * @param language
+ * @param statement the query statement.
+ * @param language the query language.
+ * @param namespaces the locally remapped namespaces which might be used in
+ * the query statement.
+ * @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)
+ throws InvalidQueryException, RepositoryException {
+ service.checkQueryStatement(sessionInfo, statement, language, namespaces);
+ }
+
+ /**
+ * @param statement the query statement.
+ * @param language the query language.
+ * @param namespaces the locally remapped namespaces which might be used in
+ * the query statement.
* @return
* @throws RepositoryException
*/
- public QueryInfo executeQuery(String statement, String language)
+ public QueryInfo executeQuery(String statement, String language, Map namespaces)
throws RepositoryException {
- return service.executeQuery(sessionInfo, statement, language);
+ return service.executeQuery(sessionInfo, statement, language, namespaces);
}
/**
@@ -450,7 +470,10 @@
eventSignal = getEventPollingRequest();
}
try {
- eventSignal.acquire();
+ // wait at most 10 seconds
+ if (!eventSignal.attempt(10 * 1000)) {
+ log.warn("No events received for batch");
+ }
} catch (InterruptedException e) {
Thread.interrupted();
log.warn("Interrupted while waiting for events from RepositoryService");
@@ -991,13 +1014,16 @@
EventFilter[] filtArr = (EventFilter[]) filters.toArray(new EventFilter[filters.size()]);
EventBundle[] bundles = service.getEvents(sessionInfo, timeout, filtArr);
- if (bundles.length > 0) {
- onEventReceived(bundles);
- }
- if (signal != null) {
- log.debug("About to signal that events have been delivered");
- signal.release();
- log.debug("Event delivery signaled");
+ try {
+ if (bundles.length > 0) {
+ onEventReceived(bundles);
+ }
+ } finally {
+ if (signal != null) {
+ log.debug("About to signal that events have been delivered");
+ signal.release();
+ log.debug("Event delivery signaled");
+ }
}
}
} catch (UnsupportedRepositoryOperationException e) {
@@ -1010,6 +1036,9 @@
} catch (InterruptedException e) {
// terminate
break;
+ } catch (Exception e) {
+ log.warn("Exception in event polling thread: " + e);
+ log.debug("Dump:", e);
}
}
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/LocalNamespaceMappings.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/LocalNamespaceMappings.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/LocalNamespaceMappings.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/LocalNamespaceMappings.java Thu Dec 7 00:22:51 2006
@@ -29,6 +29,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Arrays;
+import java.util.Map;
/**
* Manager for local session namespace mappings. This class is
@@ -156,6 +157,13 @@
*/
public void dispose() {
nsReg.removeListener(this);
+ }
+
+ /**
+ * @return the namespace mappings that are locally re-mapped.
+ */
+ public Map getLocalNamespaceMappings() {
+ return new HashMap(prefixToURI);
}
//--------------------------------------------------< NamespaceResolver >---
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java Thu Dec 7 00:22:51 2006
@@ -18,9 +18,9 @@
import org.apache.jackrabbit.jcr2spi.ItemManager;
import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
+import org.apache.jackrabbit.jcr2spi.name.LocalNamespaceMappings;
import org.apache.jackrabbit.jcr2spi.state.ItemStateManager;
import org.apache.jackrabbit.name.MalformedPathException;
-import org.apache.jackrabbit.name.NamespaceResolver;
import org.apache.jackrabbit.name.NoPrefixDeclaredException;
import org.apache.jackrabbit.name.Path;
import org.apache.jackrabbit.name.PathFormat;
@@ -53,9 +53,9 @@
private final Session session;
/**
- * The namespace nsResolver of the session that executes this query.
+ * The namespace mappings of the session that executes this query.
*/
- private final NamespaceResolver nsResolver;
+ private final LocalNamespaceMappings nsResolver;
/**
* The item manager of the session that executes this query.
@@ -91,19 +91,21 @@
/**
* Creates a new query.
*
- * @param session the session that created this query.
- * @param nsResolver the namespace resolver to be used.
- * @param itemMgr the item manager of that session.
+ * @param session the session that created this query.
+ * @param nsResolver the namespace resolver to be used.
+ * @param itemMgr the item manager of that session.
* @param itemStateManager the item state manager of that session.
- * @param wspManager the workspace manager that belongs to the session.
- * @param statement the query statement.
- * @param language the language of the query statement.
+ * @param wspManager the workspace manager that belongs to the
+ * session.
+ * @param statement the query statement.
+ * @param language the language of the query statement.
* @throws InvalidQueryException if the query is invalid.
*/
- public QueryImpl(Session session, NamespaceResolver nsResolver,
+ public QueryImpl(Session session, LocalNamespaceMappings nsResolver,
ItemManager itemMgr, ItemStateManager itemStateManager,
WorkspaceManager wspManager,
- String statement, String language) throws InvalidQueryException {
+ String statement, String language)
+ throws InvalidQueryException, RepositoryException {
this.session = session;
this.nsResolver = nsResolver;
this.itemManager = itemMgr;
@@ -111,8 +113,7 @@
this.statement = statement;
this.language = language;
this.wspManager = wspManager;
- // TODO: validate statement
- //this.query = handler.createExecutableQuery(session, itemMgr, statement, language);
+ this.wspManager.checkQueryStatement(statement, language, nsResolver.getLocalNamespaceMappings());
}
/**
@@ -127,7 +128,7 @@
* @throws RepositoryException if another error occurs while reading from
* the node.
*/
- public QueryImpl(Session session, NamespaceResolver nsResolver,
+ public QueryImpl(Session session, LocalNamespaceMappings nsResolver,
ItemManager itemMgr, ItemStateManager itemStateManager,
WorkspaceManager wspManager, Node node)
throws InvalidQueryException, RepositoryException {
@@ -145,8 +146,8 @@
}
statement = node.getProperty(NameFormat.format(QName.JCR_STATEMENT, nsResolver)).getString();
language = node.getProperty(NameFormat.format(QName.JCR_LANGUAGE, nsResolver)).getString();
- // TODO: validate statement
- //query = handler.createExecutableQuery(session, itemMgr, statement, language);
+ this.wspManager.checkQueryStatement(statement, language,
+ nsResolver.getLocalNamespaceMappings());
} catch (NoPrefixDeclaredException e) {
throw new RepositoryException(e.getMessage(), e);
}
@@ -156,7 +157,8 @@
* @see Query#execute()
*/
public QueryResult execute() throws RepositoryException {
- QueryInfo qI = wspManager.executeQuery(statement, language);
+ QueryInfo qI = wspManager.executeQuery(statement, language,
+ nsResolver.getLocalNamespaceMappings());
return new QueryResultImpl(itemManager, itemStateManager, qI, nsResolver);
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryManagerImpl.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryManagerImpl.java Thu Dec 7 00:22:51 2006
@@ -18,8 +18,8 @@
import org.apache.jackrabbit.jcr2spi.ItemManager;
import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
+import org.apache.jackrabbit.jcr2spi.name.LocalNamespaceMappings;
import org.apache.jackrabbit.jcr2spi.state.ItemStateManager;
-import org.apache.jackrabbit.name.NamespaceResolver;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
@@ -39,9 +39,9 @@
private final Session session;
/**
- * The namespace nsResolver for this query manager.
+ * The local namespace mappings for this query manager.
*/
- private final NamespaceResolver nsResolver;
+ private final LocalNamespaceMappings nsResolver;
/**
* The <code>ItemManager</code> of for item retrieval in search results
@@ -69,7 +69,7 @@
* @param wspManager
*/
public QueryManagerImpl(Session session,
- NamespaceResolver nsResolver,
+ LocalNamespaceMappings nsResolver,
ItemManager itemMgr,
ItemStateManager itemStateManager,
WorkspaceManager wspManager) {
Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Thu Dec 7 00:22:51 2006
@@ -39,6 +39,7 @@
import javax.jcr.Node;
import javax.jcr.LoginException;
import javax.jcr.ReferentialIntegrityException;
+import javax.jcr.query.InvalidQueryException;
import java.util.Map;
import java.util.Collection;
import java.io.InputStream;
@@ -522,14 +523,33 @@
public String[] getSupportedQueryLanguages(SessionInfo sessionInfo) throws RepositoryException;
/**
+ * Checks if the query <code>statement</code> is valid according to the
+ * specified query <code>language</code>.
+ *
+ * @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>.
+ * @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 namespaces) throws InvalidQueryException, RepositoryException;
+
+ /**
* @param sessionInfo
* @param statement
* @param language
+ * @param namespaces the locally re-mapped namespace which may be used in
+ * the query <code>statement</code>.
* @return
* @throws javax.jcr.RepositoryException
* @see javax.jcr.query.Query#execute()
*/
- public QueryInfo executeQuery(SessionInfo sessionInfo, String statement, String language) throws RepositoryException;
+ public QueryInfo executeQuery(SessionInfo sessionInfo, String statement, String language, Map namespaces) throws RepositoryException;
//--------------------------------------------------------< Observation >---
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?view=diff&rev=483370&r1=483369&r2=483370
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Thu Dec 7 00:22:51 2006
@@ -85,6 +85,7 @@
import org.apache.jackrabbit.webdav.header.CodedUrlHeader;
import org.apache.jackrabbit.webdav.header.IfHeader;
import org.apache.jackrabbit.webdav.search.SearchConstants;
+import org.apache.jackrabbit.webdav.search.SearchInfo;
import org.apache.jackrabbit.webdav.jcr.version.report.RepositoryDescriptorsReport;
import org.apache.jackrabbit.webdav.jcr.version.report.RegisteredNamespacesReport;
import org.apache.jackrabbit.webdav.jcr.version.report.NodeTypesReport;
@@ -146,6 +147,7 @@
import javax.jcr.ValueFactory;
import javax.jcr.LoginException;
import javax.jcr.ReferentialIntegrityException;
+import javax.jcr.query.InvalidQueryException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
@@ -1190,14 +1192,24 @@
}
}
+ public void checkQueryStatement(SessionInfo sessionInfo,
+ String statement,
+ String language,
+ Map namespaces)
+ throws InvalidQueryException, RepositoryException {
+ // TODO implement
+ }
+
/**
- * @see RepositoryService#executeQuery(SessionInfo, String, String)
+ * @see RepositoryService#executeQuery(SessionInfo, String, String, Map)
*/
- public QueryInfo executeQuery(SessionInfo sessionInfo, String statement, String language) throws RepositoryException {
+ public QueryInfo executeQuery(SessionInfo sessionInfo, String statement, String language, Map namespaces) throws RepositoryException {
SearchMethod method = null;
try {
String uri = uriResolver.getWorkspaceUri(sessionInfo.getWorkspaceName());
- method = new SearchMethod(uri, statement, language);
+ SearchInfo sInfo = new SearchInfo(language,
+ Namespace.EMPTY_NAMESPACE, statement, namespaces);
+ method = new SearchMethod(uri, sInfo);
getClient(sessionInfo).executeMethod(method);
method.checkSuccess();