Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
Bedrock Mission!

Learn more

View all

Sign in to view all badges

Adobe Summit 2023 [19th to 23rd March, Las Vegas and Virtual] | Complete AEM Session & Lab list
SOLVED

[AEM6.5] Create a service which receives the path of a folder in DAM as input, and Output as JSON

Avatar

Level 5

Hi Team,
I have a requirement, where
Create a service which receives the path of a folder in DAM as input and iterates through all image assets in that folder and returns a json response capturing the name and altText of each image in that folder. The output format should be -

 

[

{

"name":"<imageName>",

"altText": "<imageAltText>"

},

{

"name":"<imageName>",

"altText": "<imageAltText>"

},

...

]

Can anyone help me with this.

@Vijayalakshmi_S   @Himanshu_Singhal  @arunpatidar 

Topics

Topics help categorize Community content and increase your ability to discover relevant content.

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

Hi @tushaar_srivastava,

Please find below sample snippet making use of Query Builder API to bring in the AEM assets under specific path.

  • Result sets are adapted to Asset object (com.day.cq.dam.api.Asset)
  • Assuming altText is a custom Metadata property, we can gain access to the same via Asset object.
  • org.json API(org.json.JSONObject & org.json.JSONArray) is used for JSON output. 
@Component(service = Servlet.class, property = {"sling.servlet.methods=" + HttpConstants.METHOD_GET,
        "sling.servlet.paths=/bin/assetdetails", "sling.servlet.extensions=json"})
public class AssetDetailsJSON extends SlingSafeMethodsServlet {

    private static final long serialVersionUID = 1L;
    private final Logger LOG = LoggerFactory.getLogger(this.getClass());

    @Reference
    private QueryBuilder queryBuilder;

    @Override
    protected void doGet(final SlingHttpServletRequest req, final SlingHttpServletResponse resp) {
        //String assetFolderPath = req.getParameter("assetFolder");
        String assetFolderPath = "/content/dam/we-retail/en/features";
        Map<String, String> predicatesMap = new HashMap<String, String>();

        ResourceResolver rescResolver = req.getResourceResolver();
        Session session = rescResolver.adaptTo(Session.class);

        if (null != assetFolderPath) {
            predicatesMap.put("path", assetFolderPath);
            predicatesMap.put("type", "dam:Asset");
            predicatesMap.put("p.limit", "-1");
            Query query = queryBuilder.createQuery(PredicateGroup.create(predicatesMap), session);
            SearchResult queryResults = query.getResult();            
            JSONArray jsonArr = new JSONArray();
            queryResults.getHits().forEach((hit) -> {
                try {
                    String assetPath = hit.getPath();
                    Resource assetResc = rescResolver.resolve(assetPath);
                    Asset assetObj = assetResc.adaptTo(Asset.class);
                    String assetName = assetObj.getName();
                    String assetDAMPath = assetObj.getPath();
                    String assetFormat = assetObj.getMetadataValue("dc:format"); // can use getMetadataValueFromJcr as well

                    JSONObject jsonObj = new JSONObject();
                    jsonObj.put("name", assetName);
                    jsonObj.put("path", assetDAMPath); // can have altText here
                    jsonObj.put("assetFormat", assetFormat);
                    jsonArr.put(jsonObj);
                } catch (RepositoryException e) {
                    LOG.error("RepositoryException={}", e.getMessage());
                } catch (JSONException e) {
                    LOG.error("JSONException={}", e.getMessage());
                }
            });
            try {
                LOG.debug("JSON Output={}", jsonArr.toString());
                resp.setContentType("application/json");
                resp.setCharacterEncoding("UTF-8");
                resp.getWriter().write(jsonArr.toString());
            } catch (IOException e) {
                LOG.error("IOException={}", e.getMessage());
            }

        }
        else{
            LOG.debug("No asset folder input !!");
        }


    }
}

Vijayalakshmi_S_0-1624393253952.png

 

View solution in original post

3 Replies

Avatar

Community Advisor

@tushaar_srivastava ,

Assuming that your use will be used within the author environment, I would create a Sling Servlet that will accept "path". The servlet will utilise the Query Manager, JCR-SQL2. Once when the results are obtained, then the backend logic will transform the result object, which will then output the formatted JSON.

// just a brief example below...

 

private static final String JCR_SQL_QUERY = "SELECT * FROM [dam:AssetContent] AS nodes WHERE ISDESCENDANTNODE ([{my_query}]";
...

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {
    
    ...
    
    String formattedQuery = JCR_SQL_QUERY.replace("{my_query}", request.getParameter("path"));

    // JCR-SQL2 API (PICK ONE);
    Workspace workspace = session.getWorkspace();
    QueryManager queryManager = workspace.getQueryManager();
    Query query = queryManager.createQuery(formattedQuery, Query.JCR_SQL2);
    QueryResult result = query.execute();

    // return transform and return JSON
    Object formattedJSON = formattedJSON(result);

    // output the response in JSON 
    response.setContentType("application/json");
    response.setCharacterEncoding("utf-8");
    response.getWriter().write(formattedJSON);
}

 

 

 

 

Avatar

Level 5
Thank you BrianKasingli for this approach, I have created a textbox and on click on submit button invoked the servlet and based on that able to get the json.

Avatar

Correct answer by
Community Advisor

Hi @tushaar_srivastava,

Please find below sample snippet making use of Query Builder API to bring in the AEM assets under specific path.

  • Result sets are adapted to Asset object (com.day.cq.dam.api.Asset)
  • Assuming altText is a custom Metadata property, we can gain access to the same via Asset object.
  • org.json API(org.json.JSONObject & org.json.JSONArray) is used for JSON output. 
@Component(service = Servlet.class, property = {"sling.servlet.methods=" + HttpConstants.METHOD_GET,
        "sling.servlet.paths=/bin/assetdetails", "sling.servlet.extensions=json"})
public class AssetDetailsJSON extends SlingSafeMethodsServlet {

    private static final long serialVersionUID = 1L;
    private final Logger LOG = LoggerFactory.getLogger(this.getClass());

    @Reference
    private QueryBuilder queryBuilder;

    @Override
    protected void doGet(final SlingHttpServletRequest req, final SlingHttpServletResponse resp) {
        //String assetFolderPath = req.getParameter("assetFolder");
        String assetFolderPath = "/content/dam/we-retail/en/features";
        Map<String, String> predicatesMap = new HashMap<String, String>();

        ResourceResolver rescResolver = req.getResourceResolver();
        Session session = rescResolver.adaptTo(Session.class);

        if (null != assetFolderPath) {
            predicatesMap.put("path", assetFolderPath);
            predicatesMap.put("type", "dam:Asset");
            predicatesMap.put("p.limit", "-1");
            Query query = queryBuilder.createQuery(PredicateGroup.create(predicatesMap), session);
            SearchResult queryResults = query.getResult();            
            JSONArray jsonArr = new JSONArray();
            queryResults.getHits().forEach((hit) -> {
                try {
                    String assetPath = hit.getPath();
                    Resource assetResc = rescResolver.resolve(assetPath);
                    Asset assetObj = assetResc.adaptTo(Asset.class);
                    String assetName = assetObj.getName();
                    String assetDAMPath = assetObj.getPath();
                    String assetFormat = assetObj.getMetadataValue("dc:format"); // can use getMetadataValueFromJcr as well

                    JSONObject jsonObj = new JSONObject();
                    jsonObj.put("name", assetName);
                    jsonObj.put("path", assetDAMPath); // can have altText here
                    jsonObj.put("assetFormat", assetFormat);
                    jsonArr.put(jsonObj);
                } catch (RepositoryException e) {
                    LOG.error("RepositoryException={}", e.getMessage());
                } catch (JSONException e) {
                    LOG.error("JSONException={}", e.getMessage());
                }
            });
            try {
                LOG.debug("JSON Output={}", jsonArr.toString());
                resp.setContentType("application/json");
                resp.setCharacterEncoding("UTF-8");
                resp.getWriter().write(jsonArr.toString());
            } catch (IOException e) {
                LOG.error("IOException={}", e.getMessage());
            }

        }
        else{
            LOG.debug("No asset folder input !!");
        }


    }
}

Vijayalakshmi_S_0-1624393253952.png