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?