use of javax.jcr.observation.Event in project sling by apache.
the class JcrResourceListener method onEvent.
/**
* @see javax.jcr.observation.EventListener#onEvent(javax.jcr.observation.EventIterator)
*/
@Override
public void onEvent(final EventIterator events) {
final Map<String, ResourceChange> addedEvents = new HashMap<String, ResourceChange>();
final Map<String, ResourceChange> changedEvents = new HashMap<String, ResourceChange>();
final Map<String, ResourceChange> removedEvents = new HashMap<String, ResourceChange>();
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) {
// 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<ResourceChange>();
changes.addAll(addedEvents.values());
changes.addAll(removedEvents.values());
changes.addAll(changedEvents.values());
this.baseConfig.getReporter().reportChanges(this.config, changes, false);
}
use of javax.jcr.observation.Event in project camel by apache.
the class JcrConsumerTest method testJcrConsumer.
@Test
public void testJcrConsumer() throws Exception {
// start consumer thread first
JcrConsumerThread consumerThread = new JcrConsumerThread();
consumerThread.start();
// wait until the consumer thread has tried to receive event at least once
while (consumerThread.getReceiveTrialTimes() < 1) {
Thread.sleep(10L);
}
// now create a node under the specified event node path
Session session = openSession();
try {
Node folderNode = session.getRootNode();
for (String folderNodeName : absPath.split("\\/")) {
if (!"".equals(folderNodeName)) {
if (folderNode.hasNode(folderNodeName)) {
folderNode.getNode(folderNodeName).remove();
}
folderNode = folderNode.addNode(folderNodeName, "nt:unstructured");
}
}
folderNode.addNode("node", "nt:unstructured");
session.save();
} finally {
if (session != null && session.isLive()) {
session.logout();
}
}
// wait until the consumer thread captures an event
consumerThread.join();
Exchange exchange = consumerThread.getExchange();
assertNotNull(exchange);
Message message = exchange.getIn();
assertNotNull(message);
assertTrue(message instanceof JcrMessage);
EventIterator eventIterator = ((JcrMessage) message).getEventIterator();
assertNotNull(eventIterator);
assertEquals(1, eventIterator.getSize());
List<?> eventList = message.getBody(List.class);
assertEquals(1, eventList.size());
Event event = (Event) eventList.get(0);
assertEquals(Event.NODE_ADDED, event.getType());
assertNotNull(event.getPath());
assertTrue(event.getPath().startsWith(absPath));
}
use of javax.jcr.observation.Event in project sling by apache.
the class AbstractJcrEventTriggerTest method addToListTest.
//"SLING-6054"
@Test
public void addToListTest() throws Exception {
SlingRepository repository = mock(SlingRepository.class);
Scheduler scheduler = mock(Scheduler.class);
String path = "/";
String serviceUser = "service-user";
AbstractJcrEventTrigger trigger = new AbstractJcrEventTrigger(repository, scheduler, rrf, path, serviceUser) {
@Override
protected DistributionRequest processEvent(Event event) throws RepositoryException {
return null;
}
};
String descendant = "/a/b/c/d/e/f/h";
String ancestor = "/a/b/c/d";
List<DistributionRequest> requests = new LinkedList<DistributionRequest>();
requests.add(new SimpleDistributionRequest(DistributionRequestType.ADD, descendant));
DistributionRequest newRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, ancestor);
trigger.addToList(newRequest, requests);
assertEquals(1, requests.size());
assertEquals(3, requests.get(0).getPaths().length);
String[] paths = requests.get(0).getPaths();
assertEquals(ancestor, paths[0]);
// the missing path is added
assertEquals("/a/b/c/d/e/f/g", paths[1]);
assertEquals(descendant, paths[2]);
// invert order of requests
requests = new LinkedList<DistributionRequest>();
requests.add(new SimpleDistributionRequest(DistributionRequestType.ADD, ancestor));
newRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, descendant);
trigger.addToList(newRequest, requests);
assertEquals(1, requests.size());
assertEquals(3, requests.get(0).getPaths().length);
paths = requests.get(0).getPaths();
assertEquals(ancestor, paths[0]);
// the missing path is added
assertEquals("/a/b/c/d/e/f/g", paths[1]);
assertEquals(descendant, paths[2]);
}
use of javax.jcr.observation.Event in project sling by apache.
the class JcrEventDistributionTriggerTest method testProcessEventOnMultipleIgnoredPattern.
@Test
public void testProcessEventOnMultipleIgnoredPattern() throws Exception {
SlingRepository repository = mock(SlingRepository.class);
Scheduler scheduler = mock(Scheduler.class);
ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
String path = "/home/users";
String serviceName = "serviceId";
String[] ignoredPaths = new String[] { ".*/.tokens.*", ".*/.rep:cache.*" };
JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, false, serviceName, ignoredPaths);
Event event = mock(Event.class);
when(event.getPath()).thenReturn("/home/users/3/3U3HxUUzJJ60BdN4lEDJ/.tokens/2017-01-10T15.52.37.842+01.00");
DistributionRequest distributionRequest = jcrEventdistributionTrigger.processEvent(event);
assertNull(distributionRequest);
}
use of javax.jcr.observation.Event in project sling by apache.
the class JcrEventDistributionTriggerTest method testProcessEventWithoutPathProperty.
@Test
public void testProcessEventWithoutPathProperty() throws Exception {
SlingRepository repository = mock(SlingRepository.class);
Scheduler scheduler = mock(Scheduler.class);
ResourceResolverFactory resolverFactory = mock(ResourceResolverFactory.class);
String path = "/some/path";
String serviceName = "serviceId";
JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, false, serviceName, null);
Event event = mock(Event.class);
DistributionRequest distributionRequest = jcrEventdistributionTrigger.processEvent(event);
assertNull(distributionRequest);
}
Aggregations