in src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java [97:160]
public void onEvent(final EventIterator events) {
final Map<String, ResourceChange> addedEvents = new HashMap<>();
final Map<String, ResourceChange> changedEvents = new HashMap<>();
final Map<String, ResourceChange> removedEvents = new HashMap<>();
while (events.hasNext()) {
final Event event = events.nextEvent();
final String identifier;
final String path;
try {
identifier = event.getIdentifier();
path = event.getPath();
} catch (final RepositoryException e) {
// event.getPath or event.getIdentifier threw an exception
// there is nothing we can do about it anyway
continue;
}
final String eventPath = (identifier != null && identifier.startsWith("/") ? identifier : path);
final int type = event.getType();
if (type == PROPERTY_ADDED && path.endsWith("/jcr:primaryType")) {
final int lastSlash = path.lastIndexOf('/');
final String rsrcPath = path.substring(0, lastSlash);
// add is stronger than update
changedEvents.remove(rsrcPath);
addedEvents.put(rsrcPath, createResourceChange(event, rsrcPath, ChangeType.ADDED));
} else if (type == PROPERTY_ADDED
|| type == PROPERTY_REMOVED
|| type == PROPERTY_CHANGED) {
final String rsrcPath;
if (identifier == null || !identifier.startsWith("/")) {
final int lastSlash = eventPath.lastIndexOf('/');
rsrcPath = eventPath.substring(0, lastSlash);
} else {
rsrcPath = eventPath;
}
if (!addedEvents.containsKey(rsrcPath)
&& !removedEvents.containsKey(rsrcPath)
&& !changedEvents.containsKey(rsrcPath)) {
changedEvents.put(rsrcPath, createResourceChange(event, rsrcPath, ChangeType.CHANGED));
}
} else if (type == NODE_ADDED) {
// add is stronger than update
changedEvents.remove(eventPath);
addedEvents.put(eventPath, createResourceChange(event, eventPath, ChangeType.ADDED));
} else if (type == NODE_REMOVED) {
// remove is stronger than add and change
addedEvents.remove(eventPath);
changedEvents.remove(eventPath);
removedEvents.put(eventPath, createResourceChange(event, eventPath, ChangeType.REMOVED));
}
}
final List<ResourceChange> changes = new ArrayList<>();
changes.addAll(addedEvents.values());
changes.addAll(removedEvents.values());
changes.addAll(changedEvents.values());
this.baseConfig.getReporter().reportChanges(this.config, changes, false);
}