How to Manage Events in SlingPage edited by Jean-Christophe KAUTZMANNChanges (4)
Full ContentApache Sling provides some mechanisms and support for managing events. The event mechanism is leveraging the OSGi Event Admin Specification (OSGi Compendium 113). The OSGi API is very simple and leightweight. Sending an event is just generating the event object and calling the event admin. Receiving the event is implementing a single interface and declaring through properties which topics one is interested in. For more details please refer to the following resources:
This page drives you through the implementation of two services that rely on the Sling eventing mechanisms. The services implement the following use case: whenever a file is uploaded to a temporary location in your web application, the file is moved to a specific location according to its MIME type. IntroductionYou will now implement the logic to listen to files posted to /tmp/dropbox and to move them to the appropriate locations depending on the MIME type:
To do that, you will implement two services. The first one, called DropBoxService:
The second one, called DropBoxEventHandler:
Listening to OSGI EventsTo listen to the specific OSGI event "resource added":
* @scr.property name="event.topics" valueRef="org.apache.sling.api.SlingConstants.TOPIC_RESOURCE_ADDED"
public class DropBoxService implements JobProcessor, EventHandler { To send the job event the Event Admin service needs to be referenced: /** * The OSGI event admin used for sending events * @scr.reference */ private EventAdmin eventAdmin; The job topic for dropbox job events needs to be defined: /** The job topic for dropbox job events. */ public static final String JOB_TOPIC = "com/sling/eventing/dropbox/job"; The org.osgi.service.event.EventHandler#handleEvent(Event event) method needs to be implemented: public void handleEvent(Event event) { if (EventUtil.isLocal(event)) { EventUtil.processJob(event, this); } } The org.apache.sling.event.JobProcessor#process(Event event) method needs to be implemented. Its logic is as follows:
public boolean process(Event event) { String propPath = (String) event.getProperty(SlingConstants.PROPERTY_PATH); String propResType = (String) event.getProperty(SlingConstants.PROPERTY_RESOURCE_TYPE); // an event is sent if a file is added to /tmp/dropbox if (propPath.startsWith("/tmp/dropbox") && propResType.equals("nt:file")) { final Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(EventUtil.PROPERTY_JOB_TOPIC, JOB_TOPIC); props.put("resourcePath", propPath); Event dropboxJobEvent = new Event(EventUtil.TOPIC_JOB, props); eventAdmin.sendEvent(dropboxJobEvent); log.info("the dropbox job has been sent: {}", propPath); } return true; } The complete code for the DropBoxService service is available here. Listening to Job EventsNow that you have implemented a service that sends a job event when a file is uploaded to /tmp/dropbox, you will implement the service DropBoxEventHandler that listens to those job events and moves the files to a location according to their MIME types. To listen to the job events that have been defined before:
* @scr.property name="event.topics" valueRef="mypackage.DropBoxService.JOB_TOPIC" Handling Job EventsTo move the files the service needs to implement:
public class DropBoxEventHandler implements JobProcessor, EventHandler { Some class fields needs to be defined for:
/** Default log. */ protected final Logger log = LoggerFactory.getLogger(this.getClass()); /** @scr.reference */ private SlingRepository repository; /** * @scr.reference */ private JcrResourceResolverFactory resolverFactory; private final static String IMAGES_PATH = "/dropbox/images/"; private final static String MUSIC_PATH = "/dropbox/music/"; private final static String MOVIES_PATH = "/dropbox/movies/"; private final static String OTHER_PATH = "/dropbox/other/"; The org.osgi.service.event.EventHandler#handleEvent(Event event) method needs to be implemented: public void handleEvent(Event event) { if (EventUtil.isLocal(event)) { EventUtil.processJob(event, this); } } The org.apache.sling.event.JobProcessor#process(Event event) method needs to be implemented. Its logic is as follows:
public boolean process(Event event) { Session adminSession = null; try { String resourcePath = (String) event.getProperty("resourcePath"); String resourceName = resourcePath.substring(resourcePath.lastIndexOf("/") + 1); adminSession = repository.loginAdministrative(null); ResourceResolver resourceResolver = resolverFactory.getResourceResolver(adminSession); Resource res = resourceResolver.getResource(resourcePath); if (ResourceUtil.isA(res, "nt:file")) { String mimeType = res.getResourceMetadata().getContentType(); String destDir; if (mimeType.equals("image/png")) { destDir = IMAGES_PATH; } else if (mimeType.equals("audio/mpeg")) { destDir = MUSIC_PATH; } else if (mimeType.equals("video/x-msvideo")) { destDir = MOVIES_PATH; } else { destDir = OTHER_PATH; } adminSession.move(resourcePath, destDir + resourceName); adminSession.save(); log.info("The file {} has been moved to {}", resourceName, destDir); } return true; } catch (RepositoryException e) { log.error("RepositoryException: " + e); return false; } finally { if (adminSession != null && adminSession.isLive()) { adminSession.logout(); adminSession = null; } } } The complete code for the DropBoxEventHandler service is available here.
Change Notification Preferences
View Online
|
View Changes
|
Add Comment
|
- [CONF] Apache Sling Website > How to Manage Events in Sling confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence
- [CONF] Apache Sling Website > How to Manage Events in S... confluence