Hi guys,
I'm trying to implement a javax.jcr.observation.EventListener:
import com.google.common.collect.Lists;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.jcr.api.SlingRepository;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
import java.util.List;
@Component(immediate=true,
service= EventListener.class)
public class KeyValueChangeListener implements EventListener{
Logger log = LoggerFactory.getLogger(this.getClass());
private Session adminSession;
@Reference
SlingRepository repository;
@Reference
ResourceResolverFactory resourceResolverFactory;
@Activate
public void activate(ComponentContext context) throws Exception {
log.info("activating Observation");
try {
//adminSession = repository.loginAdministrative(null);
ResourceResolver resourceResolver = null;
adminSession = repository.loginService("service-name", null);
adminSession.getWorkspace().getObservationManager().addEventListener(
this, //handler
Event.PROPERTY_ADDED|Event.PROPERTY_CHANGED|Event.PROPERTY_REMOVED, //binary combination of event types
"/content/service/keys", //path
true, //is Deep?
null, //uuids filter
null, //nodetypes filter
false);
} catch (RepositoryException e){
log.error("unable to register session",e);
throw new Exception(e);
}
}
@Deactivate
public void deactivate(){
if (adminSession != null){
adminSession.logout();
}
}
public void onEvent(EventIterator eventIterator) {
try {
List<Event> events = Lists.newArrayList(eventIterator);
Object beforeValue, afterValue;
for (Event event : events){
switch (event.getType()) {
case Event.PROPERTY_ADDED:
afterValue = event.getInfo().get("afterValue");
log.info("Added property: [{}] with value: [{}]", event.getIdentifier(), afterValue);
break;
case Event.PROPERTY_CHANGED:
beforeValue = event.getInfo().get("beforeValue");
afterValue = event.getInfo().get("afterValue");
log.info("Changed property: [{}] from value: [{}] to value [{}]", event.getIdentifier(), beforeValue, afterValue);
break;
case Event.PROPERTY_REMOVED:
beforeValue = event.getInfo().get("beforeValue");
log.info("Removed property: [{}] had value: [{}]", event.getIdentifier(), beforeValue);
break;
}
}
} catch(RepositoryException e){
log.error("Error while treating events",e);
}
}
}
but it's being flakey. Sometimes I'm getting the events I expect. Sometimes not. I enabled debug logging for javax.jcr.observation but nothing is logged.
Does anyone see what I'm doing wrong? Any help?
What package should I use to see debugging info for these events?
Solved! Go to Solution.
Views
Replies
Total Likes
So it seems that the events have been going through reliably, but the Java debugger does not reliably stop in the onEvent method. Strange.
The packages org.apache.jackrabbit.oak.jcr and org.apache.jackrabbit.commons have some good logging info for this situation.
Views
Replies
Total Likes
So it seems that the events have been going through reliably, but the Java debugger does not reliably stop in the onEvent method. Strange.
The packages org.apache.jackrabbit.oak.jcr and org.apache.jackrabbit.commons have some good logging info for this situation.
Views
Replies
Total Likes
Views
Likes
Replies
Views
Likes
Replies
Views
Likes
Replies