package org.exoplatform.faq.service; import java.util.HashSet; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; import javax.jcr.observation.EventListener; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; public class QuestionNodeListener implements EventListener { private Log log = ExoLogger.getLogger(QuestionNodeListener.class); public QuestionNodeListener() { } @Override public void onEvent(EventIterator events) { ExoContainer container = ExoContainerContext.getCurrentContainer(); FAQService service = (FAQService) container.getComponentInstanceOfType(FAQService.class); try { // this map is used to watch an answer node is checked activated and approved properties or not yet. HashSet<String> checkedAnswerNodes = new HashSet<String>(); while (events.hasNext()) { Event event = events.nextEvent(); String pathString = event.getPath(); if (pathString.substring(0, pathString.length() - 1).indexOf(Utils.COMMENT_HOME) > 0) { // if there is a change in comment home node... if ((event.getType() == Event.NODE_ADDED || event.getType() == Event.NODE_REMOVED)) service.reCalculateLastActivityOfQuestion(pathString); } if (pathString.substring(0, pathString.length() - 3).indexOf(Utils.ANSWER_HOME) > 0) { if (event.getType() == Event.NODE_REMOVED) { service.reCalculateLastActivityOfQuestion(pathString); continue; } // if there is a change in answer home node... if (event.getType() == Event.PROPERTY_ADDED || event.getType() == Event.PROPERTY_CHANGED || event.getType() == Event.PROPERTY_REMOVED) { int lastSlash = pathString.lastIndexOf("/"); String propName = pathString.substring(lastSlash + 1); if (propName.equalsIgnoreCase("exo:activateResponses") || propName.equalsIgnoreCase("exo:approveResponses")) { // if activate or approve properties of an answer was changed. String answerNodePath = pathString.substring(0, lastSlash); if (!checkedAnswerNodes.contains(answerNodePath)) { checkedAnswerNodes.add(answerNodePath); service.reCalculateLastActivityOfQuestion(pathString); } } } } } } catch (Exception re) { log.error("can not update last activity of question", re); } } }