Saturday, 10 June 2023

Generic Code snippets

Code Snippets


Creating a resource resolver

public interface ResourceResolverService {

    public ResourceResolver getResourceResolver() throws LoginException;
}
Creating a service
@Component(service = ResourceResolverService.class, immediate = true)
public class ResourceResolverServiceImpl implements ResourceResolverService {
    private static final String SYSTEM_USER = "practiceService";
    @Reference
    ResourceResolverFactory resourceResolverFactory;
    @Override
    public ResourceResolver getResourceResolver() throws LoginException {
        Map<String, Object> param = new HashMap<>();
        param.put(ResourceResolverFactory.SUBSERVICE, SYSTEM_USER);
        return resourceResolverFactory.getServiceResourceResolver(param);
    }

}

Using it in another class.
@Reference
ResourceResolverService resourceResolverService;
try (ResourceResolver resourceResolver = resourceResolverService.getResourceResolver()) {
    // Code Implementation
} catch (Exception e) {
    LOGGER.error("Exception occurred: {}", e.getMessage());
}

OSGi configurations

configuration name : org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.practice.xml
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
   xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="sling:OsgiConfig"
    service.ranking="100"
    user.mapping="[practice.core:practiceService\=practiceuser]"/>


Updating Node in CRX repository

Method 1, Programmatically Update AEM JCR nodes in JAVA with org.apache.sling.api.resource.ModifiableValueMap

@Reference
ResourceResolverService resourceResolverService;
try (ResourceResolver resolver = resourceResolverService.getResourceResolver()) {
    Resource resource = resolver.getResource("/content/sourcedcode/jcr:content");
    if (Objects.nonNull(resource)) {
        ModifiableValueMap map = resource.adaptTo(ModifiableValueMap.class);
        map.put("newProperty", "value");
        map.put("existingProperty", "value");
        map.remove("existingProperty"); //remove
        resolver.commit();
    }
} catch (Exception e) {
    e.printStackTrace();
}

Method 2, Programmatically Update AEM JCR nodes in JAVA with
javax.jcr.Node

@Reference
ResourceResolverService resourceResolverService;
try (ResourceResolver resolver = resourceResolverService.getResourceResolver()) {
    Session session = resolver.adaptTo(Session.class);
    Node contentNode = session.getNode("/content/sourcedcode/jcr:content");
    if (Objects.nonNull(contentNode)) {
        contentNode.setProperty("newProperty", "value");
        contentNode.setProperty("existingProperty", "value");
        contentNode.setProperty("existingProperty", (Value)null); //remove
        session.save();
    }
} catch (Exception e) {
    e.printStackTrace();
}


Create the API service

This service create a sample page in Adobe Experience Manager(AEM).

import javax.jcr.Node;
import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.ComponentContext;

import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;

@Component(immediate = true, label = "Create Page Service", description = "Create Sample Page", metatype = true)
@Service(value = CreateSamplePage.class)
public class CreateSamplePage {

  @Reference
  private ResourceResolverFactory resolverFactory;
  @Reference
  private ResourceResolverService resourceResolverService;
  private ResourceResolver resourceResolver;

  private void createPage() throws Exception {
    String path = "/content/poc";
    String pageName = "samplePage";
    String pageTitle = "Sample Page";
    String template = "/apps/geometrixx/templates/homepage";
    String renderer = "geometrixx/components/homepage";

    this.resourceResolver = resourceResolverService.getResourceResolver();
    Page prodPage = null;
    Session session = this.resourceResolver.adaptTo(Session.class);
    try {
      if (session != null) {

        // Create Page      
        PageManager pageManager = this.resourceResolver.adaptTo(PageManager.class);
        prodPage = pageManager.create(path, pageName, template, pageTitle);
        Node pageNode = prodPage.adaptTo(Node.class);

        Node jcrNode = null;
        if (prodPage.hasContent()) {

          jcrNode = prodPage.getContentResource().adaptTo(Node.class);
        } else {
          jcrNode = pageNode.addNode("jcr:content", "cq:PageContent");
        }
        jcrNode.setProperty("sling:resourceType", renderer);

        Node parNode = jcrNode.addNode("par");
        parNode.setProperty("sling:resourceType", "foundation/components/parsys");

        Node textNode = parNode.addNode("text");
        textNode.setProperty("sling:resourceType", "foundation/components/text");
        textNode.setProperty("textIsRich", "true");
        textNode.setProperty("text", "Test page");

        session.save();
        session.refresh(true);
      }

    } catch (Exception e) {
      throw e;
    }
  }
}

Update page properties using ValueMap


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

public class PagePropertiesUpdater {

    private ResourceResolver resourceResolver;

    public void updatePageProperties(String pagePath, String propertyName, String newValue) {
        Resource pageResource = resourceResolver.getResource(pagePath);
        
        if (pageResource != null) {
            ValueMap properties = pageResource.adaptTo(ValueMap.class);
            
            if (properties != null) {
                properties.put(propertyName, newValue);
                resourceResolver.commit();
                System.out.println("Page property updated successfully.");
            } else {
                System.out.println("Failed to adapt page resource to ValueMap.");
            }
        } else {
            System.out.println("Page does not exist.");
        }
    }
}

No comments:

Post a Comment

Dispatcher configurations in AEM - 2

 Dispatcher configuration 1. The Dispatcher configuration is stored in the dispatcher.any text file. 2. The file contains a series of single...