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 md...@apache.org on 2012/04/16 20:42:23 UTC
svn commit: r1326735 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak:
api/TransientNodeState.java kernel/KernelBranch.java
kernel/TransientKernelNodeState.java
Author: mduerig
Date: Mon Apr 16 18:42:23 2012
New Revision: 1326735
URL: http://svn.apache.org/viewvc?rev=1326735&view=rev
Log:
OAK-18: Define Oak API
decouple TransientKernelNodeState from KernelBranch and Branch
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java?rev=1326735&r1=1326734&r2=1326735&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/TransientNodeState.java Mon Apr 16 18:42:23 2012
@@ -48,11 +48,6 @@ public interface TransientNodeState {
TransientNodeState getParent();
/**
- * @return the branch this state belongs to
- */
- Branch getBranch();
-
- /**
* Get a property state
* @param name name of the property state
* @return the property state with the given {@code name} or {@code null}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java?rev=1326735&r1=1326734&r2=1326735&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelBranch.java Mon Apr 16 18:42:23 2012
@@ -23,6 +23,7 @@ import org.apache.jackrabbit.mk.json.Jso
import org.apache.jackrabbit.oak.api.Branch;
import org.apache.jackrabbit.oak.api.Scalar;
import org.apache.jackrabbit.oak.api.TransientNodeState;
+import org.apache.jackrabbit.oak.kernel.TransientKernelNodeState.Listener;
import java.util.List;
@@ -45,23 +46,22 @@ import static org.apache.jackrabbit.mk.u
*/
public class KernelBranch implements Branch {
+ /** Log of changes to this branch */
+ private final ChangeLog changeLog = new ChangeLog();
+
/** Base node state of this private branch */
private final NodeState base;
/** Root state of this branch */
private final TransientKernelNodeState root;
- /** Json diff of this private branch */
- private final StringBuilder jsop;
-
/**
* Create a new branch for the given base node state
* @param base base node state of the private branch
*/
KernelBranch(NodeState base) {
this.base = base;
- root = new TransientKernelNodeState(this, base);
- jsop = new StringBuilder();
+ root = new TransientKernelNodeState(base, changeLog);
}
@Override
@@ -78,7 +78,6 @@ public class KernelBranch implements Bra
}
sourceNode.move(destParent, destName);
- jsop.append(">\"").append(sourcePath).append("\":\"").append(destPath).append('"');
}
@Override
@@ -95,7 +94,6 @@ public class KernelBranch implements Bra
}
sourceNode.copy(destParent, destName);
- jsop.append("*\"").append(sourcePath).append("\":\"").append(destPath).append('"');
}
@Override
@@ -124,30 +122,10 @@ public class KernelBranch implements Bra
KernelNodeState mergeInto(MicroKernel microkernel, KernelNodeState target) {
String targetPath = target.getPath();
String targetRevision = target.getRevision();
- String rev = microkernel.commit(targetPath, jsop.toString(), targetRevision, null);
+ String rev = microkernel.commit(targetPath, changeLog.toJsop(), targetRevision, null);
return new KernelNodeState(microkernel, targetPath, rev);
}
- void addNode(TransientKernelNodeState state, String name) {
- jsop.append("+\"").append(path(state, name)).append("\":{}");
- }
-
- void removeNode(TransientKernelNodeState state, String name) {
- jsop.append("-\"").append(path(state, name)).append('"');
- }
-
- void setProperty(TransientKernelNodeState state, String name, Scalar value) {
- jsop.append("^\"").append(path(state, name)).append("\":").append(encode(value));
- }
-
- void setProperty(TransientKernelNodeState state, String name, List<Scalar> values) {
- jsop.append("^\"").append(path(state, name)).append("\":").append(encode(values));
- }
-
- void removeProperty(TransientKernelNodeState state, String name) {
- jsop.append("^\"").append(path(state, name)).append("\":null");
- }
-
/**
* Get a transient node state for the node identified by
* {@code path}
@@ -173,7 +151,7 @@ public class KernelBranch implements Bra
* @param name The item name.
* @return relative path of the item {@code name}
*/
- private static String path(TransientKernelNodeState state, String name) {
+ private static String path(TransientNodeState state, String name) {
String path = state.getPath();
return path.isEmpty() ? name : path + '/' + name;
}
@@ -204,4 +182,52 @@ public class KernelBranch implements Bra
return sb.toString();
}
+ /**
+ * This {@code Listener} implementation records all changes to
+ * a associated branch as JSOP.
+ */
+ private static class ChangeLog implements Listener {
+ private final StringBuilder jsop = new StringBuilder();
+
+ @Override
+ public void addNode(TransientKernelNodeState state, String name) {
+ jsop.append("+\"").append(path(state, name)).append("\":{}");
+ }
+
+ @Override
+ public void removeNode(TransientKernelNodeState state, String name) {
+ jsop.append("-\"").append(path(state, name)).append('"');
+ }
+
+ @Override
+ public void setProperty(TransientKernelNodeState state, String name, Scalar value) {
+ jsop.append("^\"").append(path(state, name)).append("\":").append(encode(value));
+ }
+
+ @Override
+ public void setProperty(TransientKernelNodeState state, String name, List<Scalar> values) {
+ jsop.append("^\"").append(path(state, name)).append("\":").append(encode(values));
+ }
+
+ @Override
+ public void removeProperty(TransientKernelNodeState state, String name) {
+ jsop.append("^\"").append(path(state, name)).append("\":null");
+ }
+
+ @Override
+ public void move(TransientKernelNodeState state, String name, TransientKernelNodeState moved) {
+ jsop.append(">\"").append(path(state, name)).append("\":\"")
+ .append(moved.getPath()).append('"');
+ }
+
+ @Override
+ public void copy(TransientKernelNodeState state, String name, TransientKernelNodeState copied) {
+ jsop.append("*\"").append(path(state, name)).append("\":\"")
+ .append(copied.getPath()).append('"');
+ }
+
+ public String toJsop() {
+ return jsop.toString();
+ }
+ }
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java?rev=1326735&r1=1326734&r2=1326735&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientKernelNodeState.java Mon Apr 16 18:42:23 2012
@@ -41,8 +41,6 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.util.Iterators.map;
public class TransientKernelNodeState implements TransientNodeState {
- /** Branch this state belongs to */
- private final KernelBranch branch;
/**
* Underlying persistent state or {@code null} if this instance represents an
@@ -50,6 +48,15 @@ public class TransientKernelNodeState im
*/
private final NodeState persistentState;
+ /** Parent of this state */
+ private TransientKernelNodeState parent;
+
+ /** Name of this state */
+ private String name;
+
+ /** Listener for changes on this node state */
+ private final Listener listener;
+
/** Resolved persistent child states */
private final Map<String, TransientKernelNodeState> existingChildNodes =
new HashMap<String, TransientKernelNodeState>();
@@ -68,45 +75,98 @@ public class TransientKernelNodeState im
/** Transiently removed property states */
private final Set<String> removedProperties = new HashSet<String>();
- /** Name of this state */
- private String name;
+ /**
+ * Listener for changes on {@code TransientKernelNodeState}s
+ */
+ interface Listener {
- /** Parent of this state */
- private TransientKernelNodeState parent;
+ /**
+ * The node of the given {@code name} has been added to {@code state}.
+ * @param state parent state to which a node was added
+ * @param name name of the added node
+ */
+ void addNode(TransientKernelNodeState state, String name);
+
+ /**
+ * The node of the given {@code name} has been removed from {@code state}
+ * @param state parent state from which a node was removed
+ * @param name name of the removed node
+ */
+ void removeNode(TransientKernelNodeState state, String name);
+
+ /**
+ * The property of the given {@code name} and {@code value} has been set.
+ * @param state state on which the property was set.
+ * @param name name of the property
+ * @param value value of the property
+ */
+ void setProperty(TransientKernelNodeState state, String name, Scalar value);
+
+ /**
+ * The property of the given {@code name} and {@code values} has been set.
+ * @param state state on which the property was set.
+ * @param name name of the property
+ * @param values values of the property
+ */
+ void setProperty(TransientKernelNodeState state, String name, List<Scalar> values);
+
+ /**
+ * The property of the given {@code name} has been removed.
+ * @param state state on which the property was removed.
+ * @param name name of the property
+ */
+ void removeProperty(TransientKernelNodeState state, String name);
+
+ /**
+ * The node of the given {@code name} has been moved.
+ * @param state parent state from which the property was moved
+ * @param name name of the moved property
+ * @param moved moved property
+ */
+ void move(TransientKernelNodeState state, String name, TransientKernelNodeState moved);
+
+ /**
+ * The node of the given {@code name} been copies.
+ * @param state parent state from which the property way copies
+ * @param name name of the copied property
+ * @param copied copied property
+ */
+ void copy(TransientKernelNodeState state, String name, TransientKernelNodeState copied);
+ }
/**
* Create a new instance representing the root of a branch.
- * @param branch the branch this state belongs to
* @param persistentState underlying persistent state
+ * @param listener change listener
*/
- TransientKernelNodeState(KernelBranch branch, NodeState persistentState) {
- this(branch, persistentState, null, "");
+ TransientKernelNodeState(NodeState persistentState, Listener listener) {
+ this(persistentState, null, "", listener);
}
/**
* Create a new instance representing a added node state
- * @param branch the branch the state belongs to
* @param parent the parent state of the state
* @param name name of the state
+ * @param listener change listener
*/
- private TransientKernelNodeState(KernelBranch branch, TransientKernelNodeState parent, String name) {
- this(branch, null, parent, name);
+ private TransientKernelNodeState(TransientKernelNodeState parent, String name, Listener listener) {
+ this(null, parent, name, listener);
}
/**
* Create a new instance with an underlying persistent state
- * @param branch the branch the state belongs to
* @param persistedState underlying persistent state
* @param parent the parent state of the state
* @param name name of the state
+ * @param listener change listener
*/
- private TransientKernelNodeState(KernelBranch branch, NodeState persistedState,
- TransientKernelNodeState parent, String name) {
+ private TransientKernelNodeState(NodeState persistedState, TransientKernelNodeState parent,
+ String name, Listener listener) {
- this.branch = branch;
this.persistentState = persistedState;
this.parent = parent;
this.name = name;
+ this.listener = listener;
}
/**
@@ -119,7 +179,7 @@ public class TransientKernelNodeState im
private TransientKernelNodeState(TransientKernelNodeState state, TransientKernelNodeState parent,
String name) {
- branch = state.branch;
+ listener = state.listener;
persistentState = state.persistentState;
this.parent = parent;
this.name = name;
@@ -167,11 +227,6 @@ public class TransientKernelNodeState im
}
@Override
- public KernelBranch getBranch() {
- return branch;
- }
-
- @Override
public PropertyState getProperty(String name) {
PropertyState state = addedProperties.get(name);
if (state != null) {
@@ -316,8 +371,10 @@ public class TransientKernelNodeState im
@Override
public TransientNodeState addNode(String name) {
if (!hasNode(name)) {
- addedNodes.put(name, new TransientKernelNodeState(branch, this, name));
- branch.addNode(this, name);
+ addedNodes.put(name, new TransientKernelNodeState(this, name, listener));
+ if (listener != null) {
+ listener.addNode(this, name);
+ }
}
return getChildNode(name);
@@ -327,7 +384,9 @@ public class TransientKernelNodeState im
public void removeNode(String name) {
if (hasNode(name)) {
markNodeRemoved(name);
- branch.removeNode(this, name);
+ if (listener != null) {
+ listener.removeNode(this, name);
+ }
}
}
@@ -335,14 +394,18 @@ public class TransientKernelNodeState im
public void setProperty(String name, Scalar value) {
PropertyState propertyState = new KernelPropertyState(name, value);
setProperty(propertyState);
- branch.setProperty(this, name, value);
+ if (listener != null) {
+ listener.setProperty(this, name, value);
+ }
}
@Override
public void setProperty(String name, List<Scalar> values) {
PropertyState propertyState = new KernelPropertyState(name, values);
setProperty(propertyState);
- branch.setProperty(this, name, values);
+ if (listener != null) {
+ listener.setProperty(this, name, values);
+ }
}
@Override
@@ -352,11 +415,11 @@ public class TransientKernelNodeState im
// Mark as removed if removing existing
removedProperties.add(name);
}
- branch.removeProperty(this, name);
+ if (listener != null) {
+ listener.removeProperty(this, name);
+ }
}
- //------------------------------------------------------------< internal >---
-
/**
* Move this node state to the parent node state at {@code destParent}
* with the new name {@code destName}.
@@ -364,12 +427,18 @@ public class TransientKernelNodeState im
* @param destParent new parent for this node state
* @param destName new name for this node state
*/
- void move(TransientKernelNodeState destParent, String destName) {
+ public void move(TransientKernelNodeState destParent, String destName) {
parent.markNodeRemoved(name);
+ TransientKernelNodeState oldParent = parent;
+ String oldName = name;
+
name = destName;
parent = destParent;
destParent.addedNodes.put(destName, this);
+ if (listener != null) {
+ listener.move(oldParent, oldName, this);
+ }
}
/**
@@ -379,11 +448,16 @@ public class TransientKernelNodeState im
* @param destParent parent for the copied node state
* @param destName name for the copied node state
*/
- void copy(TransientKernelNodeState destParent, String destName) {
- destParent.addedNodes.put(destName,
- new TransientKernelNodeState(this, destParent, destName));
+ public void copy(TransientKernelNodeState destParent, String destName) {
+ TransientKernelNodeState copy = new TransientKernelNodeState(this, destParent, destName);
+ destParent.addedNodes.put(destName, copy);
+ if (listener != null) {
+ listener.copy(parent, name, copy);
+ }
}
+ //------------------------------------------------------------< internal >---
+
private void markNodeRemoved(String name) {
addedNodes.remove(name);
if (hasExistingNode(name)) {
@@ -420,7 +494,7 @@ public class TransientKernelNodeState im
if (state == null) {
return null;
}
- transientState = new TransientKernelNodeState(branch, state, this, name);
+ transientState = new TransientKernelNodeState(state, this, name, listener);
existingChildNodes.put(name, transientState);
}
return transientState;