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

Access project data via sling servlet.

Avatar

Level 2

Hi,

I'm trying to access project data in AEM via a sling servlet. The servlet is working and I'm able to make an ajax POST call to retrieve a simple JSON object on the client side. As the next step, I'd like to be able to iterate over projects under /content/projects/<foldername> using the project API. So far, I'm just trying to get the titles for all projects as a String, but it doesn't seem to be working. If I remove the project iterator in the getProjectList() method, it returns the JSON object correctly, otherwise, there's an empty response. I tried passing a filter into the projectManager.getProjects() as well, that didn't seem to help either.

I am a Java newbie, so any pointers would be helpful.

This is what I have so far in my servlet:

package ca.rogers.core.servlets;

import org.apache.felix.scr.annotations.Reference;

import org.apache.felix.scr.annotations.sling.SlingServlet;

import org.apache.sling.api.SlingHttpServletRequest;

import org.apache.sling.api.SlingHttpServletResponse;

import org.apache.sling.api.resource.Resource;

import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import org.apache.sling.api.servlets.SlingSafeMethodsServlet;

import org.apache.sling.commons.json.JSONException;

import org.apache.sling.commons.json.JSONObject;

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

import org.apache.sling.api.servlets.HttpConstants;

import javax.servlet.Servlet;

import javax.jcr.Repository;

import javax.servlet.ServletException;

import java.io.IOException;

import org.osgi.framework.Constants;

import org.apache.sling.jcr.api.SlingRepository;

import java.rmi.ServerException;

import java.util.UUID;

import com.adobe.cq.projects.api.Project;

import com.adobe.cq.projects.api.ProjectFilter;

import com.adobe.cq.projects.api.ProjectManager;

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.api.resource.ValueMap;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.util.Iterator;

@Component(service=Servlet.class,

property={

        Constants.SERVICE_DESCRIPTION + "=Project Servlet",

        "sling.servlet.methods=" + HttpConstants.METHOD_POST,

        "sling.servlet.paths="+ "/bin/cceprojectservlet",

        "sling.servlet.metatype=" + true,

})

public class ProjectServlet extends SlingAllMethodsServlet {

     

     @Reference

     private SlingRepository repository;

     

     public void bindRepository(SlingRepository repository) {

            this.repository = repository;

            }

   

    @Reference

    private ProjectManager projectManager;

          

     @Override

     protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException {

      try{

         

          String PROJECT_REQUEST_PATH = request.getParameter("rootFolder");

          String projectList = getProjectList();         

         

          JSONObject obj = new JSONObject();

         

          obj.put("rootFolder", PROJECT_REQUEST_PATH);

          obj.put("projectsList", projectList);

         

          String jsonData = obj.toString();

         

          response.getWriter().write(jsonData);

      }

      catch(Exception e){

          e.printStackTrace();

      }

    }

   

    private String getProjectList(){

        Iterator<Project> projects = projectManager.getProjects(null, 0, 10);

        String projectsList = "";

        while(projects.hasNext()){

            Project px = projects.next();

            projectsList += px.getTitle();

        }

        return projectsList;

    }

}

1 Accepted Solution

Avatar

Correct answer by
Employee

usmankhalidbutt

Every project has a jcr:content and contains all details like created date, created by user, project path, experience fragments associated with project etc

Resource parent = resourceResolver.getResource(rootPath);

Iterator<Resource> children = parent.listChildren();
 
while (children.hasNext()) {
 
Resource child = children.next();

  Resource jcrResource=child.getChild("jcr:content");

  ValueMap vm = jcrResource.getValueMap();

//Use valuemap object to pass propertyname(go through jcr:content of that project ) and get value for each property

  String title = vm.get("jcr:title","defaultValue");

//Please use the same way to get other property values

}

Please let me know ,if this helps.

View solution in original post

5 Replies

Avatar

Employee

Hi Usman,

Try this code

List<String> projectsList=new ArrayList<String> ();

ProjectManager projectManager = resourceResolver.adaptTo(ProjectManager.class);

ProjectFilter filters = new ProjectFilter();

List<String> templates = new ArrayList<String>();

templates.add("/libs/cq/core/content/projects/templates/default");//Add templates  of your projects

filters.setProjectTemplates(templates);

Iterator<Project> projects = pm.getProjects(filters, 0, 10);

while (projects.hasNext()) {

Project project = projects.next();

projectsList.add(project.getTitle());

}

Add projectsList to your json response.

Let me know, if it works.

Regards,

Neelesh

Avatar

Level 2

Thanks neeleshkumar

Any ideas on how I could get the remaining properties (created date, created by user, project path, experience fragments associated with project etc)?

Avatar

Correct answer by
Employee

usmankhalidbutt

Every project has a jcr:content and contains all details like created date, created by user, project path, experience fragments associated with project etc

Resource parent = resourceResolver.getResource(rootPath);

Iterator<Resource> children = parent.listChildren();
 
while (children.hasNext()) {
 
Resource child = children.next();

  Resource jcrResource=child.getChild("jcr:content");

  ValueMap vm = jcrResource.getValueMap();

//Use valuemap object to pass propertyname(go through jcr:content of that project ) and get value for each property

  String title = vm.get("jcr:title","defaultValue");

//Please use the same way to get other property values

}

Please let me know ,if this helps.

Avatar

Employee

usmankhalidbutt

rootPath is your project folder path i.e "rootFolder".