How to get AEM data using AEM project. | Community
Skip to main content
Level 6
June 13, 2022

How to get AEM data using AEM project.

  • June 13, 2022
  • 4 replies
  • 2914 views

Hi 

I am working on getting aem data. For that I have setup AEM project using maven but I am not getting how I can use resourcereolver instance to get the aem data. 

Can you please help in which approach should I go .

I am stuck at this point.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.

4 replies

Himanshu_Jain
Community Advisor
Community Advisor
June 13, 2022

Are you referring to get content pages as AEM data ?

Kindly elaborate the use case . 

Himanshu Jain
Level 6
June 13, 2022

Hi @himanshu_jain 

Basically I want to crawl all content from aem like assets, sites, pages, forms, users/groups data.

I have tried using rest api but there is not api for getting users and groups data so I am trying using sdk api provided by aem.

To use this api we compulsarily require osgi multimodule project so I have created one AEM project using maven but got stuck at how to go forward.

I am completely new to AEM. 

 

sunil_kumar_
Level 5
June 13, 2022

@akshaybhujbale,
Are you creating maven aem project, which will be deployed to aem
Or you are writing standalone java project outside aem and trying to access aem repo.
If you have aem project, It is straight forward. I can give you some example code. But if you are having standard java project and making rest call to aem, then we have to look how you can get required information.

Level 6
June 13, 2022

Hi @sunil_kumar_ 

I am looking either way.

But with aem project how to do I am not sure.

I have created aem project using maven but then after I stuck.

what will be my approach to crawl aem data.

If you have any sample code please share.

 

sunil_kumar_
Level 5
June 13, 2022

@akshaybhujbaleWriting in aem maven project is simple. There tons of sample code available here and over internet. I can try to share some code examples sometime

SantoshSai
Community Advisor
Community Advisor
June 13, 2022

Hi @akshaybhujbale 

In one of my past project I'm fetching JCR data in multiple ways and returning in JSON format - please refer to my github code here: https://github.com/sansai2011/demo/blob/master/demo.demo/core/src/main/java/demo/core/servlets/JCRIterator.java

Hope that helps you!

Regards,

Santosh

Santosh Sai
Level 6
June 14, 2022

HI @santoshsai 

I have refered this tutorial you shared by doing so I am getting below error.

 

Please help me to let know where I am getting wrong.

Thanks

sunil_kumar_
Level 5
June 15, 2022

@akshaybhujbale 

Why are you writing main method here? We don't write main method. What are you trying to achieve here?

sunil_kumar_
Level 5
June 15, 2022

Hi @akshaybhujbale , As you did not mention, what are you trying to achieve using this data. If you are trying to achieve search, Probabilty you should go for third party search like solar search. But for sake of answer. 
There are two ways you can do it. 

1. Iterate pages/assets/users and prepared result. 

2. Use query either query builder to SQL2. Write service to execute query in service code and get result. 


I am sharing example of both.  But first you have to get Resource resolver as below. 

https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/how-to-initialize-resourceresolver-reference-variable/m-p/455538#M131047

1. Giving some example code for iteration. Make sure your Resource Resolver object has proper permission to access required data/content/pages/users
Getting pages

 Page page = resourceResolver.adaptTo(PageManager.class).getPage("/content");
            Iterator<Page> childPages = page.listChildren(null,true);
            while (childPages.hasNext()) {
                Page childPage = childPages.next();
           }

Getting User and Groups. Printing in logs. You can use as per your need.

            ResourceResolver resourceResolver = ResolverUtil.newResolver(resourceResolverFactory);
            Session session = resourceResolver.adaptTo(Session.class);
            UserManager userManager = ((JackrabbitSession) session).getUserManager();
            Iterator<Authorizable> userIterator = userManager.findAuthorizables("jcr:primaryType", "rep:User");
            LOG.info("\n ----------GETTING USERS-------------");
            while (userIterator.hasNext()) {
                Authorizable user = userIterator.next();
                    LOG.info("\n User : {}", user.getPath());
            }
            Iterator<Authorizable> systemUserIterator = userManager.findAuthorizables("jcr:primaryType", "rep:SystemUser");
            LOG.info("\n ----------GETTING System USERS-------------");
            while (systemUserIterator.hasNext()) {
                Authorizable serviceUser = systemUserIterator.next();
                LOG.info("\n Service User : {}", serviceUser.getPath());
            }

            Iterator<Authorizable> groupIterator = userManager.findAuthorizables("jcr:primaryType", "rep:Group");
            LOG.info("\n ----------GETTING Groups-------------");
            while (groupIterator.hasNext()) {
                Authorizable group = groupIterator.next();
                LOG.info("\n Group : {}", group.getPath());
            }

2. Sharing some sample queries and code implementations. 
Query Builder query to get page and assets. I am sharing simplest one. create as per your need. 

/* ---To get Assets----*/
path=/content/dam
type=dam:Asset
p.limit=-1

/* ---To get Pages----*/
/* ---Adjust type as per your content----*/
path=/content
type=cq:PageContent
p.limit=-1

How to implement in backend 

@Reference
QueryBuilder queryBuilder;
       
 Map<String,String> queryMap=new HashMap<>();
   queryMap.put("path","/content/dam/we-retail");
   queryMap.put("type","dam:Asset");
   queryMap.put("p.limit",Long.toString(-1));
   final Session session = resourceResolver.adaptTo(Session.class);
   Query query = queryBuilder.createQuery(PredicateGroup.create(queryMap), session);
    SearchResult result = query.getResult();
    int perPageResults = result.getHits().size();
    long totalResults = result.getTotalMatches();
     List<Hit> hits =result.getHits();
        for(Hit hit: hits){
            Asset asset=hit.getResource().adaptTo(Asset.class);
           LOG.info("\n Page {} ",asset.getPath());
        }

In Case you use SQL 2

            String searchPath="/content/we-retail";
            String sql2Query = "SELECT * FROM [cq:PageContent] AS node WHERE ISDESCENDANTNODE ("+searchPath+") ORDER BY node.[jcr:title]";
            ResourceResolver resourceResolver = ResolverUtil.newResolver(resourceResolverFactory);
            final Session session = resourceResolver.adaptTo(Session.class);
            final javax.jcr.query.Query query = session.getWorkspace().getQueryManager().createQuery(sql2Query,javax.jcr.query.Query.JCR_SQL2);
            final QueryResult result = query.execute();
            NodeIterator pages=result.getNodes();
            JSONArray resultArray=new JSONArray();
            while(pages.hasNext()){
                Node page=pages.nextNode();
            }

These are just sample codes. Get Resource Resolver with proper permissions.