You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2012/05/24 17:15:30 UTC
svn commit: r1342297 -
/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java
Author: reschke
Date: Thu May 24 15:15:30 2012
New Revision: 1342297
URL: http://svn.apache.org/viewvc?rev=1342297&view=rev
Log:
OAK-23: implement lookup by identifier using Query (WIP)
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java?rev=1342297&r1=1342296&r2=1342297&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionDelegate.java Thu May 24 15:15:30 2012
@@ -16,22 +16,10 @@
*/
package org.apache.jackrabbit.oak.jcr;
-import org.apache.jackrabbit.oak.api.AuthInfo;
-import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.ContentSession;
-import org.apache.jackrabbit.oak.api.QueryEngine;
-import org.apache.jackrabbit.oak.api.Root;
-import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.jcr.namespace.NamespaceRegistryImpl;
-import org.apache.jackrabbit.oak.jcr.query.QueryManagerImpl;
-import org.apache.jackrabbit.oak.jcr.value.ValueFactoryImpl;
-import org.apache.jackrabbit.oak.namepath.AbstractNameMapper;
-import org.apache.jackrabbit.oak.namepath.NameMapper;
-import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.namepath.NamePathMapperImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.Collections;
+import java.util.Map;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
@@ -46,11 +34,26 @@ import javax.jcr.lock.LockManager;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.Row;
-import javax.jcr.query.RowIterator;
import javax.jcr.version.VersionManager;
-import java.io.IOException;
+
+import org.apache.jackrabbit.oak.api.AuthInfo;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.ContentSession;
+import org.apache.jackrabbit.oak.api.CoreValue;
+import org.apache.jackrabbit.oak.api.QueryEngine;
+import org.apache.jackrabbit.oak.api.Result;
+import org.apache.jackrabbit.oak.api.ResultRow;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.jcr.namespace.NamespaceRegistryImpl;
+import org.apache.jackrabbit.oak.jcr.value.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.namepath.AbstractNameMapper;
+import org.apache.jackrabbit.oak.namepath.NameMapper;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.namepath.NamePathMapperImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class SessionDelegate {
static final Logger log = LoggerFactory.getLogger(SessionDelegate.class);
@@ -139,53 +142,6 @@ public class SessionDelegate {
}
}
- // TODO replace by query-based implementation
- private NodeDelegate findByJcrUuid(Tree tree, String id) {
-
- try {
- QueryManagerImpl qm = new QueryManagerImpl(this);
- Query q = qm.createQuery("SELECT * FROM [nt:base] WHERE [jcr:uuid] = $id", Query.JCR_SQL2);
- q.bindValue("id", getValueFactory().createValue(id));
-
- QueryResult result = q.execute();
- RowIterator ri = result.getRows();
- if (!ri.hasNext()) {
- // not found
- return null;
- }
-
- Row r = ri.nextRow();
-
- if (ri.hasNext()) {
- log.error("multiple results for query " + q.getStatement());
- return null;
- }
-
- String path = r.getNode().getPath();
- String oakPath = namePathMapper.getOakPath(path);
- return getNode(oakPath);
- }
- catch (RepositoryException ex) {
- log.error("query failed", ex);
- return null;
- }
-
-// PropertyState p = tree.getProperty("jcr:uuid");
-// if (p != null && id.equals(p.getValue().getString())) {
-// return new NodeDelegate(this, tree);
-// }
-// else {
-// for (Tree c : tree.getChildren()) {
-// NodeDelegate found = findByJcrUuid(c, id);
-// if (found != null) {
-// return found;
-// }
-// }
-// }
-//
-// return null;
- }
-
@Nonnull
public ValueFactoryImpl getValueFactory() {
return valueFactory;
@@ -393,6 +349,52 @@ public class SessionDelegate {
return root.getTree(path);
}
+ @CheckForNull
+ NodeDelegate findByJcrUuid(Tree tree, String id) {
+
+ try {
+ Map<String, CoreValue> bindings = Collections.singletonMap("id", getValueFactory().getCoreValueFactory()
+ .createValue(id));
+
+ Result result = getQueryEngine().executeQuery("SELECT * FROM [nt:base] WHERE [jcr:uuid] = $id", Query.JCR_SQL2,
+ getContentSession(), Long.MAX_VALUE, 0, bindings);
+
+ String path = null;
+
+ for (ResultRow rr : result.getRows()) {
+ String tmppath = PathUtils.concat("/", PathUtils.relativize("/" + getWorkspaceName(), rr.getPath()));
+
+ if (path != null) {
+ log.error("multiple results for identifier lookup: " + path + " vs. " + tmppath);
+ return null;
+ } else {
+ path = tmppath;
+ }
+ }
+
+ return path == null ? null : getNode(path);
+ } catch (ParseException ex) {
+ log.error("query failed", ex);
+ return null;
+ }
+
+ // Tree-walking implementation...
+ // PropertyState p = tree.getProperty("jcr:uuid");
+ // if (p != null && id.equals(p.getValue().getString())) {
+ // return new NodeDelegate(this, tree);
+ // }
+ // else {
+ // for (Tree c : tree.getChildren()) {
+ // NodeDelegate found = findByJcrUuid(c, id);
+ // if (found != null) {
+ // return found;
+ // }
+ // }
+ // }
+ //
+ // return null;
+ }
+
//--------------------------------------------------< SessionNameMapper >---
private class SessionNameMapper extends AbstractNameMapper {