Skip to content

Instantly share code, notes, and snippets.

@sreeni-b
Created July 4, 2021 07:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sreeni-b/fa7ac714d390718b6565a861d783bf45 to your computer and use it in GitHub Desktop.
Save sreeni-b/fa7ac714d390718b6565a861d783bf45 to your computer and use it in GitHub Desktop.
package com.aemks.core.listeners;
import com.day.cq.commons.jcr.JcrConstants;
import com.day.cq.wcm.api.NameConstants;
import org.apache.jackrabbit.api.observation.JackrabbitEventFilter;
import org.apache.jackrabbit.api.observation.JackrabbitObservationManager;
import org.apache.sling.event.jobs.JobManager;
import org.apache.sling.jcr.api.SlingRepository;
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.Workspace;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
import java.util.HashMap;
/**
* This is a JCR event listener which listens to
* copy/paste event in Touch UI.
* (event = NODE_ADDED && event-user-data=changedByPageManagerCopy)
*/
@Component(service = EventListener.class, immediate = true)
public class CopyPasteEventListener implements EventListener {
@Reference
private SlingRepository repository;
@Reference
private JobManager jobManager;
private final Logger logger = LoggerFactory.getLogger(getClass());
private Session session; // NOSONAR
private JackrabbitObservationManager observationManager;
public static final String CHANGED_BY_PAGE_MANAGER_COPY = "changedByPageManagerCopy";
public static final String EVENT_HANDLER_JOB="com/aemks/core/jobs/handleCopyPasteEvent";
private final String[] nodeTypes = new String[] { NameConstants.NT_PAGE, JcrConstants.NT_UNSTRUCTURED };
/**
* The event handler delegates the event handling to
* a sling job.
* @param eventIterator the events iterator
*/
@Override public void onEvent(EventIterator eventIterator) {
while (eventIterator.hasNext()) {
Event event = eventIterator.nextEvent();
String path = null;
try {
path = event.getPath();
if (CHANGED_BY_PAGE_MANAGER_COPY.equalsIgnoreCase(event.getUserData())) {
logger.info("Found the page event path {} triggered by {}", event.getPath(),
CHANGED_BY_PAGE_MANAGER_COPY);
HashMap<String, Object> jobProps = new HashMap<>();
jobProps.put("eventPath", path);
jobManager.addJob(EVENT_HANDLER_JOB, jobProps);
break;
}
} catch (RepositoryException e) {
logger.error("An error occurred while getting event path",e);
}
}
}
/**
* Login using the service user and register the event listener
* for the appropriate content path, node types.
*/
@Activate
protected void activate() {
try {
session = repository.loginService("listener-service", null);
JackrabbitEventFilter jackrabbitEventFilter = new JackrabbitEventFilter().setAbsPath("/content/aemks")
.setNodeTypes(nodeTypes).setEventTypes(Event.NODE_ADDED).setIsDeep(true).setNoExternal(true)
.setNoLocal(false);
Workspace workSpace = session.getWorkspace();
if (null != workSpace) {
observationManager = (JackrabbitObservationManager) workSpace.getObservationManager();
observationManager.addEventListener(this, jackrabbitEventFilter);
logger.info("The Page Event Listener is Registered at {} for the event type {}.", "/content/aemks",
Event.NODE_ADDED);
}
} catch (RepositoryException e) {
logger.error("An error occurred while getting session",e);
}
}
/**
* On deactivate, close/logout the long running session.
*/
@Deactivate
protected void deactivate() {
try {
if (null != observationManager) {
observationManager.removeEventListener(this);
logger.info("The Page Event Listener is removed.");
}
} catch (RepositoryException e) {
logger.error("An error occurred while removing event listener",e);
} finally {
if (null != session) {
session.logout();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment