Usecase: I had a situation to fetch properties from node/page/cloud configurations from sling servlet.
Issue: In wcmusepojo we can get these cloud configuarations using getInheritedPageProperties(). But inheritedPageProperties variable is not accessible in osgi service or sling servlet.
Solution:
To get properties of a node/page/cloud configurations from sling servlet do the following.
Issue: In wcmusepojo we can get these cloud configuarations using getInheritedPageProperties(). But inheritedPageProperties variable is not accessible in osgi service or sling servlet.
Solution:
To get properties of a node/page/cloud configurations from sling servlet do the following.
- Pass the node path from ajax to servlet.
- Create a system user to read the properties.
Below is sample servlet code.
/** * Author: Kishore Polsani */ @Component(name = "com.kishore.aem.GetProperties", label = "Get Properties", immediate = true, metatype = true) @Service @Properties({ @Property(name = "service.description", value = "Get Properties"), @Property(name = "sling.servlet.paths", value = "/services/aemquickstart/getproperties", propertyPrivate = true), @Property(name = "service.vendor", value = "AEMQuickstart") }) public class GetProperties extends SlingAllMethodsServlet implements Serializable { private static final long serialVersionUID = 1L; private Logger log = LoggerFactory.getLogger(GetProperties.class); @Reference protected SlingRepository repository; @Reference private ResourceResolverFactory resolverFactory; @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException { try { Map<String, Object> param = new HashMap<String, Object>(); param.put(ResourceResolverFactory.SUBSERVICE, "readService"); ResourceResolver resourceResolver=null; resourceResolver = resolverFactory.getServiceResourceResolver(param); /* Get this path from ajax call request*/ Resource pageResource = resourceResolver.getResource("/etc/cloudservices/salesforce/kishore/jcr:content"); Node configNode = pageResource.adaptTo(Node.class); configNode.getProperty("accesstoken"); log.info("Access token from cloud config"+configNode.getProperty("accesstoken")); Session session = resourceResolver.adaptTo(Session.class); session.save(); } catch (AccessDeniedException e) { log.error(e.getMessage()); } catch (PathNotFoundException e) { log.error(e.getMessage()); } catch (ItemExistsException e) { log.error(e.getMessage()); } catch (ReferentialIntegrityException e) { log.error(e.getMessage()); } catch (ConstraintViolationException e) { log.error(e.getMessage()); } catch (InvalidItemStateException e) { log.error(e.getMessage()); } catch (VersionException e) { log.error(e.getMessage()); } catch (LockException e) { log.error(e.getMessage()); } catch (NoSuchNodeTypeException e) { log.error(e.getMessage()); } catch (LoginException e) { log.error(e.getMessage()); } catch (RepositoryException e) { log.error(e.getMessage()); } } }
Check this post to get properties in different way: Registering a Servlet for every Page in AEM
Why would you use the Node API to do this? Why not just adjust the permissions on the referenced resource instead of creating a service user and exposing the property this way?
ReplyDeleteI would HIGHLY recommend not following this approach!