You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2012/03/07 12:03:21 UTC
svn commit: r1297932 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk:
MicroKernelImpl.java Repository.java store/CopyingGC.java
store/DefaultRevisionStore.java store/RevisionProvider.java
store/StoredNodeAsState.java
Author: jukka
Date: Wed Mar 7 11:03:21 2012
New Revision: 1297932
URL: http://svn.apache.org/viewvc?rev=1297932&view=rev
Log:
OAK-3: Internal tree model
Apply proposed patch to start integrating the interfaces with existing MK implementation
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java (with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/Repository.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/CopyingGC.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/RevisionProvider.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java?rev=1297932&r1=1297931&r2=1297932&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java Wed Mar 7 11:03:21 2012
@@ -23,7 +23,6 @@ import org.apache.jackrabbit.mk.json.Jso
import org.apache.jackrabbit.mk.model.ChildNodeEntry;
import org.apache.jackrabbit.mk.model.Commit;
import org.apache.jackrabbit.mk.model.CommitBuilder;
-import org.apache.jackrabbit.mk.model.Node;
import org.apache.jackrabbit.mk.model.StoredCommit;
import org.apache.jackrabbit.mk.model.StoredNode;
import org.apache.jackrabbit.mk.model.TraversingNodeDiffHandler;
@@ -31,12 +30,13 @@ import org.apache.jackrabbit.mk.store.No
import org.apache.jackrabbit.mk.util.CommitGate;
import org.apache.jackrabbit.mk.util.PathUtils;
import org.apache.jackrabbit.mk.util.SimpleLRUCache;
+import org.apache.jackrabbit.oak.tree.NodeState;
+import org.apache.jackrabbit.oak.tree.PropertyState;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -226,7 +226,8 @@ public class MicroKernelImpl implements
if (node1 == null) {
if (node2 != null) {
buff.tag('+').key(path).object();
- toJson(buff, node2, Integer.MAX_VALUE, 0, -1, false);
+ toJson(buff, rep.getRevisionStore().getNodeState(node2),
+ Integer.MAX_VALUE, 0, -1, false);
return buff.endObject().newline().toString();
} else {
throw new MicroKernelException("path doesn't exist in the specified revisions: " + path);
@@ -271,7 +272,7 @@ public class MicroKernelImpl implements
buff.tag('+').
key(PathUtils.concat(getCurrentPath(), added.getName())).object();
try {
- toJson(buff, rep.getRevisionStore().getNode(added.getId()), Integer.MAX_VALUE, 0, -1, false);
+ toJson(buff, store.getNodeState(store.getNode(added.getId())), Integer.MAX_VALUE, 0, -1, false);
} catch (Exception e) {
buff.value("ERROR: failed to retrieve node " + added.getId());
}
@@ -338,7 +339,7 @@ public class MicroKernelImpl implements
buff.tag('+').
key(PathUtils.concat(getCurrentPath(), added.getName())).object();
try {
- toJson(buff, rep.getRevisionStore().getNode(added.getId()), Integer.MAX_VALUE, 0, -1, false);
+ toJson(buff, store.getNodeState(store.getNode(added.getId())), Integer.MAX_VALUE, 0, -1, false);
} catch (Exception e) {
buff.value("ERROR: failed to retrieve node " + added.getId());
}
@@ -394,7 +395,7 @@ public class MicroKernelImpl implements
revisionId = revisionId == null ? getHeadRevision() : revisionId;
try {
- return rep.getNode(revisionId, path).getChildNodeCount();
+ return rep.getNodeState(revisionId, path).getChildNodeCount();
} catch (Exception e) {
throw new MicroKernelException(e);
}
@@ -415,7 +416,7 @@ public class MicroKernelImpl implements
try {
JsopBuilder buf = new JsopBuilder().object();
- toJson(buf, rep.getNode(revisionId, path), depth, (int) offset, count, true);
+ toJson(buf, rep.getNodeState(revisionId, path), depth, (int) offset, count, true);
return buf.endObject().toString();
} catch (Exception e) {
throw new MicroKernelException(e);
@@ -594,20 +595,21 @@ public class MicroKernelImpl implements
//-------------------------------------------------------< implementation >
- void toJson(JsopBuilder builder, Node node, int depth, int offset, int count, boolean inclVirtualProps) throws Exception {
- for (Map.Entry<String, String> prop : node.getProperties().entrySet()) {
- builder.key(prop.getKey()).encodedValue(prop.getValue());
+ void toJson(JsopBuilder builder, NodeState node, int depth, int offset, int count, boolean inclVirtualProps) throws Exception {
+ for (PropertyState property : node.getProperties()) {
+ builder.key(property.getName()).encodedValue(property.getEncodedValue());
}
long childCount = node.getChildNodeCount();
if (inclVirtualProps) {
builder.key(":childNodeCount").value(childCount);
}
if (childCount > 0 && depth >= 0) {
- for (Iterator<ChildNodeEntry> it = node.getChildNodeEntries(offset, count); it.hasNext(); ) {
- ChildNodeEntry cne = it.next();
- builder.key(cne.getName()).object();
+ // TODO: Use an import once the conflict with .mk.model is resolved
+ for (org.apache.jackrabbit.oak.tree.ChildNodeEntry entry
+ : node.getChildNodeEntries(offset, count)) {
+ builder.key(entry.getName()).object();
if (depth > 0) {
- toJson(builder, rep.getRevisionStore().getNode(cne.getId()), depth - 1, 0, -1, inclVirtualProps);
+ toJson(builder, entry.getNode(), depth - 1, 0, -1, inclVirtualProps);
}
builder.endObject();
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/Repository.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/Repository.java?rev=1297932&r1=1297931&r2=1297932&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/Repository.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/Repository.java Wed Mar 7 11:03:21 2012
@@ -30,6 +30,7 @@ import org.apache.jackrabbit.mk.store.No
import org.apache.jackrabbit.mk.store.RevisionStore;
import org.apache.jackrabbit.mk.util.IOUtils;
import org.apache.jackrabbit.mk.util.PathUtils;
+import org.apache.jackrabbit.oak.tree.NodeState;
/**
*
@@ -110,6 +111,10 @@ public class Repository {
return rs.getCommit(id);
}
+ public NodeState getNodeState(String revId, String path) throws NotFoundException, Exception {
+ return rs.getNodeState(getNode(revId, path));
+ }
+
/**
*
* @param revId
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/CopyingGC.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/CopyingGC.java?rev=1297932&r1=1297931&r2=1297932&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/CopyingGC.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/CopyingGC.java Wed Mar 7 11:03:21 2012
@@ -27,6 +27,7 @@ import org.apache.jackrabbit.mk.model.Mu
import org.apache.jackrabbit.mk.model.StoredCommit;
import org.apache.jackrabbit.mk.model.StoredNode;
import org.apache.jackrabbit.mk.util.IOUtils;
+import org.apache.jackrabbit.oak.tree.NodeState;
/**
* Revision garbage collector that copies reachable revisions from a "from" revision
@@ -137,6 +138,10 @@ public class CopyingGC implements Revisi
// ---------------------------------------------------------- RevisionStore
+ public NodeState getNodeState(StoredNode node) {
+ return new StoredNodeAsState(node, this);
+ }
+
public StoredNode getNode(String id) throws NotFoundException, Exception {
if (running) {
try {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java?rev=1297932&r1=1297931&r2=1297932&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java Wed Mar 7 11:03:21 2012
@@ -27,6 +27,7 @@ import org.apache.jackrabbit.mk.store.pm
import org.apache.jackrabbit.mk.store.pm.PersistenceManager;
import org.apache.jackrabbit.mk.util.SimpleLRUCache;
import org.apache.jackrabbit.mk.util.StringUtils;
+import org.apache.jackrabbit.oak.tree.NodeState;
import java.io.Closeable;
import java.io.File;
@@ -255,6 +256,10 @@ public class DefaultRevisionStore implem
//-----------------------------------------------------< RevisionProvider >
+ public NodeState getNodeState(StoredNode node) {
+ return new StoredNodeAsState(node, this);
+ }
+
public StoredNode getNode(String id) throws NotFoundException, Exception {
verifyInitialized();
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/RevisionProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/RevisionProvider.java?rev=1297932&r1=1297931&r2=1297932&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/RevisionProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/RevisionProvider.java Wed Mar 7 11:03:21 2012
@@ -19,12 +19,22 @@ package org.apache.jackrabbit.mk.store;
import org.apache.jackrabbit.mk.model.ChildNodeEntriesMap;
import org.apache.jackrabbit.mk.model.StoredCommit;
import org.apache.jackrabbit.mk.model.StoredNode;
+import org.apache.jackrabbit.oak.tree.NodeState;
/**
*
*/
public interface RevisionProvider {
+ /**
+ * Adapts the given {@link StoredNode} to a corresponding
+ * {@link NodeState} instance.
+ *
+ * @param node stored node instance
+ * @return node state adapter
+ */
+ NodeState getNodeState(StoredNode node);
+
StoredNode getNode(String id) throws NotFoundException, Exception;
StoredCommit getCommit(String id) throws NotFoundException, Exception;
ChildNodeEntriesMap getCNEMap(String id) throws NotFoundException, Exception;
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java?rev=1297932&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java Wed Mar 7 11:03:21 2012
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mk.store;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.jackrabbit.mk.model.StoredNode;
+import org.apache.jackrabbit.oak.tree.ChildNodeEntry;
+import org.apache.jackrabbit.oak.tree.NodeState;
+import org.apache.jackrabbit.oak.tree.PropertyState;
+
+class StoredNodeAsState implements NodeState {
+
+ private final StoredNode node;
+
+ private final RevisionProvider provider;
+
+ public StoredNodeAsState(StoredNode node, RevisionProvider provider) {
+ this.node = node;
+ this.provider = provider;
+ }
+
+ private static class SimplePropertyState implements PropertyState {
+
+ private final String name;
+
+ private final String value;
+
+ public SimplePropertyState(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getEncodedValue() {
+ return value;
+ }
+
+ }
+
+ public PropertyState getProperty(String name) {
+ String value = node.getProperties().get(name);
+ if (value != null) {
+ return new SimplePropertyState(name, value);
+ } else {
+ return null;
+ }
+ }
+
+ public long getPropertyCount() {
+ return node.getProperties().size();
+ }
+
+ public Iterable<PropertyState> getProperties() {
+ return new Iterable<PropertyState>() {
+ public Iterator<PropertyState> iterator() {
+ final Iterator<Map.Entry<String, String>> iterator =
+ node.getProperties().entrySet().iterator();
+ return new Iterator<PropertyState>() {
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+ public PropertyState next() {
+ Map.Entry<String, String> entry = iterator.next();
+ return new SimplePropertyState(
+ entry.getKey(), entry.getValue());
+ }
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+ };
+ }
+
+ public NodeState getChildNode(String name) {
+ org.apache.jackrabbit.mk.model.ChildNodeEntry entry =
+ node.getChildNodeEntry(name);
+ if (entry != null) {
+ return getChildNodeEntry(entry).getNode();
+ } else {
+ return null;
+ }
+ }
+
+ public long getChildNodeCount() {
+ return node.getChildNodeCount();
+ }
+
+ public Iterable<ChildNodeEntry> getChildNodeEntries(
+ final long offset, final long length) {
+ if (length < -1) {
+ throw new IllegalArgumentException("Illegal length: " + length);
+ } else if (offset > Integer.MAX_VALUE) {
+ return Collections.emptyList();
+ } else {
+ return new Iterable<ChildNodeEntry>() {
+ public Iterator<ChildNodeEntry> iterator() {
+ int count = -1;
+ if (length < Integer.MAX_VALUE) {
+ count = (int) length;
+ }
+ final Iterator<org.apache.jackrabbit.mk.model.ChildNodeEntry> iterator =
+ node.getChildNodeEntries((int) offset, count);
+ return new Iterator<ChildNodeEntry>() {
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+ public ChildNodeEntry next() {
+ return getChildNodeEntry(iterator.next());
+ }
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+ };
+ }
+ }
+
+ private ChildNodeEntry getChildNodeEntry(
+ final org.apache.jackrabbit.mk.model.ChildNodeEntry entry) {
+ return new ChildNodeEntry() {
+ public String getName() {
+ return entry.getName();
+ }
+ public NodeState getNode() {
+ try {
+ StoredNode child = provider.getNode(entry.getId());
+ return new StoredNodeAsState(child, provider);
+ } catch (Exception e) {
+ throw new RuntimeException("Unexpected error", e);
+ }
+ }
+ };
+ }
+
+}
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java
------------------------------------------------------------------------------
svn:eol-style = native