Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

AEM 6.3: session is null in Event listener

Avatar

Level 4

I have created in an even listener and this is the code. What I am looking to do in my Listener is to check if a particular property has been updated. If it is then take an action.

package com.aem.sites.interfaces;

import javax.jcr.observation.Event;

import org.osgi.service.metatype.annotations.AttributeDefinition;

import org.osgi.service.metatype.annotations.AttributeType;

import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(name = "Temperature Listener Configuration")

public @interface TemperatureListenerConfiguration {

@AttributeDefinition(

name = "propertyPath",

description = "Configurable paths for temperature event listener",

type = AttributeType.STRING

)

String getPath() default "/content/aemsite/en/jcr:content/root/responsivegrid/banner";

@AttributeDefinition(

name = "propetyName",

description = "Name of property",

type = AttributeType.STRING

)

String getPropertyName() default "temperature";

@AttributeDefinition(

name = "event types",

description = "Name of property",

type = AttributeType.INTEGER

)

int getEvent() default Event.PROPERTY_CHANGED;

}

package com.aem.sites.listeners;

import java.util.HashMap;

import java.util.Map;

import javax.jcr.Property;

import javax.jcr.RepositoryException;

import javax.jcr.Session;

import javax.jcr.observation.Event;

import javax.jcr.observation.EventIterator;

import javax.jcr.observation.EventListener;

import javax.jcr.observation.ObservationManager;

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.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.Modified;

import org.osgi.service.component.annotations.Reference;

import org.osgi.service.metatype.annotations.Designate;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.aem.sites.interfaces.TemperatureListenerConfiguration;

@Component(immediate=true,

service= EventListener.class,

configurationPid = "com.aem.sites.listeners.TemperaturePropertyListener")

@Designate(ocd=TemperatureListenerConfiguration.class)

public class TemperaturePropertyListener implements EventListener{

/** The logger. */

  private final Logger logger = LoggerFactory.getLogger(getClass());

/** The path. */

  private String path;

/** The property name. */

  private String propertyName;

/** The resolver factory. */

  @Reference

private ResourceResolverFactory resolverFactory;

/** The resource resolver. */

  private ResourceResolver resourceResolver;

/** The observation manager. */

  private ObservationManager observationManager;

/** The session. */

  private Session session;

/**

* Activate.

*

* @param config the config

*/

@Activate

@Modified

public void activate(TemperatureListenerConfiguration config) {

logger.info("**********************TemperatureListenerConfiguration:::activate********************** ");

path = config.getPath();

propertyName = config.getPropertyName();

int event = config.getEvent();

ObservationManager observationManager = getObservationManager();

registerListener(observationManager, event);

}

/**

* Gets the observation manager.

*

* @return the observation manager

*/

private ObservationManager getObservationManager() {

Map<String, Object> param = new HashMap<String, Object>();

param.put(ResourceResolverFactory.SUBSERVICE, "readService");

Resource resource = null;

try {

resourceResolver = resolverFactory.getServiceResourceResolver(param);

resource = resourceResolver.getResource(path);

session = resource.adaptTo(Session.class);

observationManager = session.getWorkspace().getObservationManager();

} catch (LoginException | RepositoryException e) {

logger.info("**********************Exception in get observation manager********************** "+e.getMessage());

}

return observationManager;

}

/**

* Register listener.

*

* @param observationManager the observation manager

* @param event the event

*/

private void registerListener(ObservationManager observationManager, int event) {

try {

observationManager.addEventListener(this, event, path, true, null, null, false);

logger.info("**********************TemperaturePropertyListener:::registerListener********************** ");

} catch (RepositoryException e) {

logger.info("**********************Exception in register add listener********************** "+e.getMessage());

}

}

/* (non-Javadoc)

* @see javax.jcr.observation.EventListener#onEvent(javax.jcr.observation.EventIterator)

*/

@Override

public void onEvent(EventIterator events) {

// TODO Auto-generated method stub

while(events.hasNext()) {

Event event = events.nextEvent();

logger.info("**********************TemperaturePropertyListener:::onEvent********************** ");

if(Event.PROPERTY_CHANGED == event.getType()) {

try {

Property changedProperty = session.getProperty(event.getPath());

if(changedProperty.getName().equalsIgnoreCase(propertyName)) {

logger.info("******************TemperaturePropertyListener::the name of the property changed is**************"+propertyName);

}

} catch (RepositoryException e) {

// TODO Auto-generated catch block

logger.info("**********************Repository exception in on event********************** "+e.getMessage());

}

}

}

}

/**

* Deactivate.

*

* @throws RepositoryException the repository exception

*/

@Deactivate

public void deactivate()  throws RepositoryException {

if(observationManager != null) {

            observationManager.removeEventListener(this);

        }

        if (session != null) {

            session.logout();

            session = null;

          }

        if(resourceResolver != null && resourceResolver.isLive()){

resourceResolver.close();

}

}

}

The value of the session in the method getObservationManager is null. The system user has all the privileges and is working fine elsewhere. Not sure what is wrong here.

I also tried to implement org.osgi.service.event.EventHandler following the aem-osgi-annotation-demo/SampleOsgiResourceListener.java at master · nateyolles/aem-osgi-annotation-... but turns out org.apache.sling.api.SlingConstants is now deprecated. So, I moved to using ResourceChangeListener and followed this acs-aem-samples/SampleResourceChangeListener.java at master · Adobe-Consulting-Services/acs-aem-samp...  but found out that several methods in org.apache.sling.api.resource.observation.ResourceChange are now deprecated.

Thanks in advance

1 Accepted Solution

Avatar

Correct answer by
Level 4

I could get session now after whitelisting the bundle and using administrative session.

View solution in original post

2 Replies

Avatar

Level 10

For a test - try to put in this code and whitelist the bundle:

ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);

This will tell if issue is with the user or code in 6.3. If you are not sure about white list -see:

AEM 6.3 migration osgi bundle whitelist error-osgi-service is NOT whitelisted to use SlingRepositor...

Avatar

Correct answer by
Level 4

I could get session now after whitelisting the bundle and using administrative session.