final List<Object> list = new ArrayList<Object>();
try {
final List<Event> events = new ArrayList<Event>();
while (eventIterator.hasNext()) {
Event event = eventIterator.nextEvent();
events.add(event);
}
JCRTemplate.getInstance().doExecuteWithSystemSession(userId, workspace, locale, new JCRCallback<Object>() {
public Object doInJCR(JCRSessionWrapper s) throws RepositoryException {
Iterator<Event> it = events.iterator();
while (it.hasNext()) {
Event event = it.next();
if (isExternal(event)) {
continue;
}
try {
if (!event.getPath().startsWith("/jcr:system/")) {
if (event.getType() == Event.NODE_ADDED) {
JCRNodeWrapper n = s.getNode(event.getPath());
if (n.isNodeType("jmix:observable") && !n.isNodeType("jnt:translation")) {
final String identifier = n.getIdentifier();
AddedNodeFact rn = eventsMap.get(identifier);
if (rn == null) {
rn = new AddedNodeFact(n);
eventsMap.put(identifier, rn);
}
list.add(rn);
}
} else if (event.getType() == Event.PROPERTY_ADDED ||
event.getType() == Event.PROPERTY_CHANGED) {
String path = event.getPath();
String propertyName = path.substring(path.lastIndexOf('/') + 1);
if (!propertiesToIgnore.contains(propertyName)) {
try {
JCRPropertyWrapper p = (JCRPropertyWrapper) s.getItem(path);
JCRNodeWrapper parent = p.getParent();
if (parent.isNodeType("jnt:translation")) {
parent = parent.getParent();
}
if (parent.isNodeType(Constants.NT_RESOURCE) ||
parent.isNodeType("jmix:observable")) {
AddedNodeFact rn;
if (parent.isNodeType(Constants.MIX_REFERENCEABLE)) {
final String identifier = parent.getIdentifier();
rn = eventsMap.get(identifier);
if (rn == null) {
rn = new AddedNodeFact(parent);
eventsMap.put(identifier, rn);
}
} else {
rn = new AddedNodeFact(parent);
}
list.add(new ChangedPropertyFact(rn, p));
}
} catch (PathNotFoundException pnfe) {
if (logger.isDebugEnabled()) {
logger.debug("Path " + path + " not found, might be normal if using VFS", pnfe);
}
logger.warn("Couldn't access path " + path + ", ignoring it since it's not supported on some external repositories... ");
}
}
} else if (event.getType() == Event.NODE_REMOVED) {
String parentPath = null;
try {
parentPath = StringUtils.substringBeforeLast(event.getPath(), "/");
JCRNodeWrapper parent = s.getNode(parentPath);
final String identifier = parent.getIdentifier();
AddedNodeFact w = eventsMap.get(identifier);
if (w == null) {
w = new AddedNodeFact(parent);
eventsMap.put(identifier, w);
}
final DeletedNodeFact e = new DeletedNodeFact(w, event.getPath());
e.setIdentifier(event.getIdentifier());
e.setSession(s);
list.add(e);
} catch (PathNotFoundException e) {
}
} else if (event.getType() == Event.PROPERTY_REMOVED) {
String path = event.getPath();
int index = path.lastIndexOf('/');
String nodePath = path.substring(0, index);
String propertyName = path.substring(index + 1);
if (!propertiesToIgnore.contains(propertyName)) {
try {
JCRNodeWrapper n = s.getNode(nodePath);
String key = n.isNodeType(Constants.MIX_REFERENCEABLE) ? n.getIdentifier() :
n.getPath();
AddedNodeFact rn = eventsMap.get(key);
if (rn == null) {
rn = new AddedNodeFact(n);
eventsMap.put(key, rn);
}
list.add(new DeletedPropertyFact(rn, propertyName));
} catch (PathNotFoundException e) {
// ignore if parent has also been deleted ?
}
}
}
}
} catch (PathNotFoundException pnfe) {
logger.error("Error when executing event. Unable to find node or property for path: " +
event.getPath(), pnfe);
} catch (Exception e) {
logger.error("Error when executing event", e);
}
}
if (!list.isEmpty()) {