Created
July 4, 2021 07:31
-
-
Save sreeni-b/fa7ac714d390718b6565a861d783bf45 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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