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);
}
@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());
}
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]"/>
<?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;
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;
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