Expand my Community achievements bar.

Dive into Adobe Summit 2024! Explore curated list of AEM sessions & labs, register, connect with experts, ask questions, engage, and share insights. Don't miss the excitement.
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".