April 3, 2020
Estimated Post Reading Time ~

Workflow to remove renditions other than the original one

In my previous post here, I explained the process to remove the renditions from any given path. But don’t you think this is cumbersome because every time at particular location, if multiple dam assets are submitted, developer/support guy has to check and run the servlet to remove the renditions.

Wouldn’t it nice to create a generic process like a workflow which automatically triggers and remove the rendition as soon as any dam asset is submitted. Today we are going to look as to how we can achieve renditions removal using workflow. I will post some sample code and will detail out the process for people who might not be familiar in writing a workflow process in CQ5.

1) First of all, you will have to create a new workflow model.

2) Use the source code below to create a workflow process step. The label in the code below will help you identify the process step explained below with help of screenshot.

3) If you look closely in the image attached, i dragged a process step component on the demo workflow and the process step label in the code can be seen in the dropdown on the right. If this label is not appearing then there is something wrong with your code.

4) Once you have configured these steps, click on save.

5) You now will have to create a launcher which will bind these workflows with specific file types and on specific path. If you need the functionality on a whole dam then the path that would be given would be /content/dam. You can look at the samples provided in workflow launcher console for rendtions, a similar launcher would be created for this code as well.



 @Component
 @Service
 @Properties({
  @Property(name = Constants.SERVICE_DESCRIPTION, value = "The logic can be used to remove rendition from all the subnodes below a certain path"),
  @Property(name = Constants.SERVICE_VENDOR, value = "Sahil Thadhani Test"),
  @Property(name = "process.label", value = "Rendition Remover")
 })
 public class RenditionRemoverWorkflow implements WorkflowProcess {
  @Reference
  private ResourceResolverFactory resourceResolverFactory;
  private ResourceResolver resourceResolver;
  @Reference
  private QueryBuilder builder;
  private Session session;
  @Override
  public void execute(WorkItem item, WorkflowSession wfsession, MetaDataMap args)
  throws WorkflowException {
   try {
    resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
    WorkflowData workflowData = item.getWorkflowData();
    String path = workflowData.getPayload().toString();
    path = path.replace("/jcr:content/renditions", "");
    session = resourceResolver.adaptTo(Session.class);
    Map < String, String > map = new HashMap < String, String > ();
    map.put("path", path);
    map.put("property", "jcr:primaryType");
    map.put("property.1_value", "nt:folder");
    Query query = builder.createQuery(PredicateGroup.create(map), session);
    SearchResult result = query.getResult();
    List < Hit > hits = result.getHits();
    Resource renditionResource = resourceResolver.resolve(hits.get(0).getPath());
    LoggerUtil.debugLog(this.getClass(), "renditionRersour path is{}", renditionResource.getPath());
    Iterator < Resource > reneditionIterator = renditionResource.listChildren();
    while (reneditionIterator.hasNext()) {
     Resource specificResource = reneditionIterator.next();
     Node renditionNode = specificResource.adaptTo(Node.class);
     if (!renditionNode.getName().equals("original")) {
      renditionNode.remove();
     }
    }
    session.save();
    session.logout();
   } catch (Exception e) {
    // TODO Auto-generated catch block  
    e.printStackTrace();
   }
  }


By aem4beginner

No comments:

Post a Comment

If you have any doubts or questions, please let us know.