Expand my Community achievements bar.

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.