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 2013/06/07 15:57:08 UTC
svn commit: r1490651 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
Author: mduerig
Date: Fri Jun 7 13:57:07 2013
New Revision: 1490651
URL: http://svn.apache.org/r1490651
Log:
OAK-775 Implement backward compatible observation
add support for Event.getIdentifier(): use id of former state on delete
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java?rev=1490651&r1=1490650&r2=1490651&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java Fri Jun 7 13:57:07 2013
@@ -193,7 +193,8 @@ class ChangeProcessor implements Runnabl
private final ChangeSet changes;
private final String path;
- private final NodeState associatedParentNode;
+ private final NodeState beforeParentNode;
+ private final NodeState afterParentNode;
private final EventGeneratingNodeStateDiff parent;
private final String name;
@@ -201,19 +202,21 @@ class ChangeProcessor implements Runnabl
private int childNodeCount;
EventGeneratingNodeStateDiff(ChangeSet changes, String path, List<Iterator<Event>> events,
- NodeState associatedParentNode, EventGeneratingNodeStateDiff parent, String name) {
+ NodeState beforeParentNode, NodeState afterParentNode,
+ EventGeneratingNodeStateDiff parent, String name) {
this.changes = changes;
this.path = path;
this.events = events;
- this.associatedParentNode = associatedParentNode;
+ this.beforeParentNode = beforeParentNode;
+ this.afterParentNode = afterParentNode;
this.parent = parent;
this.name = name;
}
public EventGeneratingNodeStateDiff(ChangeSet changes) {
- // FIXME associatedParentNode should be the root node here
- this(changes, "/", new ArrayList<Iterator<Event>>(PURGE_LIMIT), null, null, "");
+ // FIXME parent nodes should be the root here
+ this(changes, "/", new ArrayList<Iterator<Event>>(PURGE_LIMIT), null, null, null, "");
}
public void sendEvents() {
@@ -236,8 +239,8 @@ class ChangeProcessor implements Runnabl
@Override
public boolean propertyAdded(PropertyState after) {
- if (filterRef.get().include(Event.PROPERTY_ADDED, jcrPath(), associatedParentNode)) {
- Event event = generatePropertyEvent(Event.PROPERTY_ADDED, path, after);
+ if (filterRef.get().include(Event.PROPERTY_ADDED, jcrPath(), afterParentNode)) {
+ Event event = generatePropertyEvent(Event.PROPERTY_ADDED, path, after, parent.getAfterId(name));
events.add(Iterators.singletonIterator(event));
}
return !stopping;
@@ -245,8 +248,8 @@ class ChangeProcessor implements Runnabl
@Override
public boolean propertyChanged(PropertyState before, PropertyState after) {
- if (filterRef.get().include(Event.PROPERTY_CHANGED, jcrPath(), associatedParentNode)) {
- Event event = generatePropertyEvent(Event.PROPERTY_CHANGED, path, after);
+ if (filterRef.get().include(Event.PROPERTY_CHANGED, jcrPath(), afterParentNode)) {
+ Event event = generatePropertyEvent(Event.PROPERTY_CHANGED, path, after, parent.getAfterId(name));
events.add(Iterators.singletonIterator(event));
}
return !stopping;
@@ -254,8 +257,8 @@ class ChangeProcessor implements Runnabl
@Override
public boolean propertyDeleted(PropertyState before) {
- if (filterRef.get().include(Event.PROPERTY_REMOVED, jcrPath(), associatedParentNode)) {
- Event event = generatePropertyEvent(Event.PROPERTY_REMOVED, path, before);
+ if (filterRef.get().include(Event.PROPERTY_REMOVED, jcrPath(), afterParentNode)) {
+ Event event = generatePropertyEvent(Event.PROPERTY_REMOVED, path, before, parent.getBeforeId(name));
events.add(Iterators.singletonIterator(event));
}
return !stopping;
@@ -264,7 +267,7 @@ class ChangeProcessor implements Runnabl
@Override
public boolean childNodeAdded(String name, NodeState after) {
if (filterRef.get().includeChildren(jcrPath())) {
- Iterator<Event> events = generateNodeEvents(Event.NODE_ADDED, path, name, after);
+ Iterator<Event> events = generateNodeEvents(Event.NODE_ADDED, path, name, after, getAfterId(name));
this.events.add(events);
if (++childNodeCount > PURGE_LIMIT) {
sendEvents();
@@ -276,7 +279,7 @@ class ChangeProcessor implements Runnabl
@Override
public boolean childNodeDeleted(String name, NodeState before) {
if (filterRef.get().includeChildren(jcrPath())) {
- Iterator<Event> events = generateNodeEvents(Event.NODE_REMOVED, path, name, before);
+ Iterator<Event> events = generateNodeEvents(Event.NODE_REMOVED, path, name, before, getBeforeId(name));
this.events.add(events);
}
return !stopping;
@@ -292,7 +295,7 @@ class ChangeProcessor implements Runnabl
public RecursingNodeStateDiff createChildDiff(String name, NodeState before, NodeState after) {
if (filterRef.get().includeChildren(jcrPath())) {
EventGeneratingNodeStateDiff diff = new EventGeneratingNodeStateDiff(
- changes, PathUtils.concat(path, name), events, after, this, name);
+ changes, PathUtils.concat(path, name), events, before, after, this, name);
return VisibleDiff.wrap(diff);
} else {
return new RecursingNodeStateDiff();
@@ -305,33 +308,47 @@ class ChangeProcessor implements Runnabl
id, null, changes.getDate(), userDataRef.get(), changes.isExternal());
}
- private String getId(String childName) {
+ private String getBeforeId(String childName) {
if (parent == null) {
return '/' + namePathMapper.getJcrName(childName);
}
- PropertyState uuid = associatedParentNode.getProperty(JcrConstants.JCR_UUID);
+ PropertyState uuid = beforeParentNode.getProperty(JcrConstants.JCR_UUID);
if (uuid == null) {
- return parent.getId(name) + '/' + namePathMapper.getJcrName(childName);
+ return parent.getBeforeId(name) + '/' + namePathMapper.getJcrName(childName);
}
return uuid.getValue(Type.STRING);
}
- private Event generatePropertyEvent(int eventType, String parentPath, PropertyState property) {
+ private String getAfterId(String childName) {
+ if (parent == null) {
+ return '/' + namePathMapper.getJcrName(childName);
+ }
+
+ PropertyState uuid = afterParentNode.getProperty(JcrConstants.JCR_UUID);
+ if (uuid == null) {
+ return parent.getAfterId(name) + '/' + namePathMapper.getJcrName(childName);
+ }
+
+ return uuid.getValue(Type.STRING);
+ }
+
+ private Event generatePropertyEvent(int eventType, String parentPath, PropertyState property, String id) {
String jcrPath = namePathMapper.getJcrPath(PathUtils.concat(parentPath, property.getName()));
- return createEvent(eventType, jcrPath, parent.getId(name));
+ return createEvent(eventType, jcrPath, id);
}
- private Iterator<Event> generateNodeEvents(int eventType, String parentPath, String childName, NodeState node) {
+ private Iterator<Event> generateNodeEvents(int eventType, String parentPath, String childName,
+ NodeState node, String id) {
EventFilter filter = filterRef.get();
final String path = PathUtils.concat(parentPath, childName);
String jcrParentPath = namePathMapper.getJcrPath(parentPath);
String jcrPath = namePathMapper.getJcrPath(path);
Iterator<Event> nodeEvent;
- if (filter.include(eventType, jcrParentPath, associatedParentNode)) {
- Event event = createEvent(eventType, jcrPath, getId(childName));
+ if (filter.include(eventType, jcrParentPath, afterParentNode)) {
+ Event event = createEvent(eventType, jcrPath, id);
nodeEvent = Iterators.singletonIterator(event);
} else {
nodeEvent = Iterators.emptyIterator();
@@ -342,7 +359,7 @@ class ChangeProcessor implements Runnabl
: Event.PROPERTY_REMOVED;
Iterator<Event> propertyEvents;
- if (filter.include(propertyEventType, jcrPath, associatedParentNode)) {
+ if (filter.include(propertyEventType, jcrPath, afterParentNode)) {
propertyEvents = Iterators.transform(
Iterators.filter(
node.getProperties().iterator(),
@@ -355,7 +372,7 @@ class ChangeProcessor implements Runnabl
new Function<PropertyState, Event>() {
@Override
public Event apply(PropertyState property) {
- return generatePropertyEvent(propertyEventType, path, property);
+ return generatePropertyEvent(propertyEventType, path, property, "TODO"); // FIXME
}
});
} else {
@@ -382,7 +399,7 @@ class ChangeProcessor implements Runnabl
new Function<ChildNodeEntry, Iterator<Event>>() {
@Override
public Iterator<Event> apply(ChildNodeEntry entry) {
- return generateNodeEvents(eventType, parentPath, entry.getName(), entry.getNodeState());
+ return generateNodeEvents(eventType, parentPath, entry.getName(), entry.getNodeState(), "TODO"); // FIXME
}
});
}