/** * This method is called when a bundle of events is dispatched. * * @param events The event set received. */ public void onEvent(EventIterator events) { final Cache depCache = cacheProvider.getDependenciesCache(); final Cache regexpDepCache = cacheProvider.getRegexpDependenciesCache(); final Set<String> flushed = new HashSet<String>(); while (events.hasNext()) { Event event = (Event) events.next(); boolean propageToOtherClusterNodes = !isExternal(event); try { String path = event.getPath(); if (!path.startsWith("/jcr:system")) { boolean flushParent = false; boolean flushRoles = false; if (path.contains("j:view")) { flushParent = true; } final int type = event.getType(); if (type == Event.PROPERTY_ADDED || type == Event.PROPERTY_CHANGED || type == Event.PROPERTY_REMOVED) { if (path.endsWith("/j:published")) { flushParent = true; } if (path.endsWith("j:roles")) { flushRoles = true; } path = path.substring(0, path.lastIndexOf("/")); } else if (type == Event.NODE_ADDED || type == Event.NODE_MOVED || type == Event.NODE_REMOVED) { flushParent = true; } if (path.contains("vanityUrlMapping")) { flushParent = true; } if (path.contains("j:acl") || path.contains("jnt:group") || flushRoles || type == Event.NODE_MOVED) { // Flushing cache of acl key for users as a group or an acl has been updated CacheKeyGenerator cacheKeyGenerator = cacheProvider.getKeyGenerator(); if (cacheKeyGenerator instanceof DefaultCacheKeyGenerator) { DefaultCacheKeyGenerator generator = (DefaultCacheKeyGenerator) cacheKeyGenerator; generator.flushUsersGroupsKey(propageToOtherClusterNodes); } flushParent = true; } path = StringUtils.substringBeforeLast( StringUtils.substringBeforeLast(path, "/j:translation"), "/j:acl"); flushDependenciesOfPath(depCache, flushed, path, propageToOtherClusterNodes); try { flushDependenciesOfPath( depCache, flushed, ((JCREventIterator) events).getSession().getNode(path).getIdentifier(), propageToOtherClusterNodes); } catch (PathNotFoundException e) { if (event instanceof EventImpl && (((EventImpl) event).getChildId() != null)) { flushDependenciesOfPath( depCache, flushed, ((EventImpl) event).getChildId().toString(), propageToOtherClusterNodes); } } flushRegexpDependenciesOfPath(regexpDepCache, path, propageToOtherClusterNodes); if (flushParent) { path = StringUtils.substringBeforeLast(path, "/"); flushDependenciesOfPath(depCache, flushed, path, propageToOtherClusterNodes); try { flushDependenciesOfPath( depCache, flushed, ((JCREventIterator) events).getSession().getNode(path).getIdentifier(), propageToOtherClusterNodes); } catch (PathNotFoundException e) { if (event instanceof EventImpl && (((EventImpl) event).getParentId() != null)) { flushDependenciesOfPath( depCache, flushed, ((EventImpl) event).getParentId().toString(), propageToOtherClusterNodes); } } flushRegexpDependenciesOfPath(regexpDepCache, path, propageToOtherClusterNodes); } } } catch (RepositoryException e) { logger.error(e.getMessage(), e); } } }