Created
January 19, 2017 15:11
-
-
Save kuckmc01/8fa10234dc3dbc55447adf1b621c2ed9 to your computer and use it in GitHub Desktop.
Sample Replication Event Listener
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.mk.core.services; | |
import com.adobe.granite.workflow.PayloadMap; | |
import com.day.cq.replication.ReplicationAction; | |
import com.day.cq.replication.ReplicationActionType; | |
import com.day.cq.wcm.api.NameConstants; | |
import com.day.cq.workflow.WorkflowException; | |
import com.day.cq.workflow.WorkflowService; | |
import com.day.cq.workflow.WorkflowSession; | |
import com.day.cq.workflow.exec.WorkflowData; | |
import com.day.cq.workflow.model.WorkflowModel; | |
import org.apache.felix.scr.annotations.Component; | |
import org.apache.felix.scr.annotations.Property; | |
import org.apache.felix.scr.annotations.Reference; | |
import org.apache.felix.scr.annotations.Service; | |
import org.apache.sling.api.resource.LoginException; | |
import org.apache.sling.api.resource.Resource; | |
import org.apache.sling.api.resource.ResourceResolver; | |
import org.apache.sling.api.resource.ResourceResolverFactory; | |
import org.apache.sling.settings.SlingSettingsService; | |
import org.osgi.framework.BundleContext; | |
import org.osgi.service.component.ComponentContext; | |
import org.osgi.service.event.Event; | |
import org.osgi.service.event.EventHandler; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
import javax.jcr.RepositoryException; | |
import javax.jcr.Session; | |
import javax.jcr.SimpleCredentials; | |
import java.util.Collections; | |
import java.util.Set; | |
@Component | |
@Service | |
@Property(name="event.topics",value= ReplicationAction.EVENT_TOPIC) | |
public class PublishAuditEventListener implements EventHandler { | |
private Logger log = LoggerFactory.getLogger(this.getClass()); | |
private BundleContext bundleContext; | |
private Set<String> runmodes = Collections.emptySet(); | |
@Reference | |
private SlingSettingsService slingSettingsService; | |
@Reference | |
private ResourceResolverFactory rrf; | |
@Reference | |
private WorkflowService workflowService; | |
private ResourceResolver resourceResolver; | |
public static final String AUTHOR_RUN_MODE = "author"; | |
public void handleEvent(Event event) { | |
if(runmodes.contains(AUTHOR_RUN_MODE) && resourceResolver != null){ | |
log.trace("Replication Event triggered on author"); | |
final ReplicationAction action = ReplicationAction.fromEvent(event); | |
if(action != null) { | |
final String userId = action.getUserId(); | |
log.debug("Replication action {} at path {} ", action.getType().getName(), action.getPath()); | |
final Resource resource = resourceResolver.resolve(action.getPath()); | |
if(resource != null){ | |
if(resource.getResourceType().equalsIgnoreCase(NameConstants.NT_PAGE)){ | |
if(ReplicationActionType.ACTIVATE == action.getType()){ | |
performWorkflow( | |
"/etc/workflow/models/scheduled_activation/jcr:content/model", | |
userId, | |
action.getPath()); | |
}else if(ReplicationActionType.DEACTIVATE == action.getType()){ | |
performWorkflow( | |
"/etc/workflow/models/scheduled_activation/jcr:content/model", | |
userId, | |
action.getPath()); | |
} | |
} | |
} | |
} | |
} | |
} | |
private void performWorkflow(final String model, final String userId, final String path){ | |
try { | |
log.debug("Attempting to configure workflow"); | |
final Session adminSession = resourceResolver.adaptTo(Session.class); | |
final Session userSession = adminSession.impersonate (new SimpleCredentials(userId,new char[0])); | |
WorkflowSession wfSession = workflowService.getWorkflowSession(userSession); | |
WorkflowModel wfModel = wfSession.getModel(model); | |
if(wfModel != null){ | |
WorkflowData wfData = wfSession.newWorkflowData(PayloadMap.TYPE_JCR_PATH, path); | |
log.debug("Starting workflow using model: {}",wfModel.getId()); | |
wfSession.startWorkflow(wfModel, wfData); | |
}else{ | |
log.warn("No workflow model found. Skipping transaction."); | |
} | |
} catch (WorkflowException ex) { | |
log.error("Error starting workflow.", ex); | |
} catch (javax.jcr.LoginException e) { | |
log.error("Error starting workflow.", e); | |
} catch (RepositoryException e) { | |
log.error("Error starting workflow.", e); | |
} | |
} | |
protected void activate(ComponentContext ctx) { | |
this.bundleContext = ctx.getBundleContext(); | |
runmodes = slingSettingsService.getRunModes(); | |
try { | |
//TODO: change to service resolver | |
resourceResolver = rrf.getAdministrativeResourceResolver(null); | |
} catch (LoginException e) { | |
e.printStackTrace(); | |
} | |
} | |
protected void deactivate(ComponentContext ctx) { | |
this.bundleContext = null; | |
if(resourceResolver != null && resourceResolver.isLive()){ | |
resourceResolver.close(); | |
resourceResolver = null; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment