Expand my Community achievements bar.

SOLVED

how we can checks the replication status of the content (e.g., an asset or a page) using code

Avatar

Level 1

how we can checks the replication status of the content (e.g., an asset or a page) using code, i have a usecase to implement where i need to check whether a content is in replication or published 

1 Accepted Solution

Avatar

Correct answer by
Level 7

Hi @NickAd1 

Below is a demo servlet which you can use to get the replication status of any content passed through parameters like : 

http://localhost:4502/bin/checkReplicationStatus?path=/content/dam/myProject/image.jpg

 

import com.day.cq.replication.ReplicationStatus;
import com.google.gson.JsonObject;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.framework.Constants;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component(
    service = Servlet.class,
    property = {
        Constants.SERVICE_DESCRIPTION + "=Replication Status Servlet",
        "sling.servlet.methods=" + HttpConstants.METHOD_GET,
        "sling.servlet.paths=" + "/bin/checkReplicationStatus"
    }
)
public class ReplicationStatusServlet extends SlingAllMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String contentPath = request.getParameter("path");
        JsonObject jsonResponse = new JsonObject();

        if (contentPath == null || contentPath.isEmpty()) {
            jsonResponse.addProperty("error", "Content path is required");
            response.setStatus(SlingHttpServletResponse.SC_BAD_REQUEST);
        } else {
            Resource resource = request.getResourceResolver().getResource(contentPath);
            if (resource == null) {
                jsonResponse.addProperty("error", "Resource not found");
                response.setStatus(SlingHttpServletResponse.SC_NOT_FOUND);
            } else {
                ReplicationStatus replicationStatus = resource.adaptTo(ReplicationStatus.class);
                if (replicationStatus != null) {
                    jsonResponse.addProperty("path", contentPath);
                    jsonResponse.addProperty("isPublished", replicationStatus.isActivated());
                    jsonResponse.addProperty("lastReplicationAction", replicationStatus.getLastReplicationAction() != null ? replicationStatus.getLastReplicationAction().toString() : "N/A");
                    jsonResponse.addProperty("lastReplicationDate", replicationStatus.getLastReplicationDate() != null ? formatDate(replicationStatus.getLastReplicationDate().getTime()) : "N/A");
                    jsonResponse.addProperty("isInReplicationQueue", replicationStatus.isPending());
                } else {
                    jsonResponse.addProperty("error", "Replication status not available for this resource");
                    response.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                }
            }
        }

        response.setContentType("application/json");
        response.getWriter().write(jsonResponse.toString());
    }

    private String formatDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        return sdf.format(date);
    }
}

This will return a json response.

Hope this helps!

View solution in original post

5 Replies

Avatar

Community Advisor

you can try like this :

For Asset:

public String checkReplicationStatusForAsset(String path) {
AssetManager assetManager = resourceResolver.adaptTo(AssetManager.class);
Asset asset = assetManager.getAsset(path);
if (asset != null) {
ReplicationStatus replicationStatus = asset.adaptTo(ReplicationStatus.class);
if (replicationStatus != null) {
boolean isActivated = replicationStatus.isActivated();
return "Asset " + path + " is " + (isActivated ? "activated" : "not activated");
} else {
return "Could not get replication status for asset " + path;
}
} else {
return "Asset " + path + " does not exist";
}
}

For Page:

Using PageManager - by passing the path of the page

public void checkReplicationStatusForPage(String path) {
PageManager pageManager = resourceResolver.adaptTo(PageManager.class);
Page page = pageManager.getPage(path);
if (page != null) {
ReplicationStatus replicationStatus = page.adaptTo(ReplicationStatus.class);
if (replicationStatus != null) {
boolean isActivated = replicationStatus.isActivated();
System.out.println("Page " + path + " is " + (isActivated ? "activated" : "not activated"));
} else {
System.out.println("Could not get replication status for page " + path);
}
} else {
System.out.println("Page " + path + " does not exist");
}
}

Avatar

Community Advisor

Hi @NickAd1,

You can have a ReplicationStatusCheck class to check the "cq:lastReplicated" property for a particular path
Here's a sample code - 

if (resource != null) {
 ValueMap properties = resource.adaptTo(ValueMap.class);
 if (properties != null) {
  StringreplicationStatus = properties.get("cq:lastReplicated", String.class);
  return replicationStatus != null ? replicationStatus : "Not replicated yet.";
 }
}

Alternatively, you can also use Replication API to hit the end point - bin/receive?path=

This returns the replication status in JSON format, which includes details like whether the page is replicated, the last replication time, etc.

Hope this helps!

Avatar

Community Advisor

This is an example of checking the status of a single page, but using your java skills, you should be able to send in a particular param and applying Java patterns like SOLID principals when creating methods utils, etc...  in this example, we are checking the status of /content/wknd/en/adventure

 

import com.day.cq.replication.ReplicationStatus;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import javax.servlet.Servlet;
import java.io.IOException;

@Component(
    service = {Servlet.class},
    property = {
        "sling.servlet.paths=/bin/checkReplicationStatusHardcoded",
        "sling.servlet.methods=GET"
    }
)
public class CheckReplicationStatusHardcodedServlet extends SlingAllMethodsServlet {

    
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        String path = "/content/wknd/en/adventure/jcr:content";
        ResourceResolver resourceResolver = request.getResourceResolver();
        Resource resource = resourceResolver.getResource(path);
        if (resource == null) {
            response.getWriter().write("Resource not found at path: " + path);
            return;
        }

        // Get the ReplicationStatus of the resource
        ReplicationStatus replicationStatus = resource.adaptTo(ReplicationStatus.class);
        if (replicationStatus == null) {
            response.getWriter().write("Replication status not available for this resource.");
            return;
        }

        // Check if the resource is published
        boolean isPublished = replicationStatus.isActivated();
        boolean isInReplication = replicationStatus.isStale(); // Checks if the resource is out of sync with publish

        // Respond with the replication status
        response.getWriter().write("Path: " + path + "\n");
        response.getWriter().write("Is Published: " + isPublished + "\n");
        response.getWriter().write("Is In Replication (Out of Sync): " + isInReplication + "\n");
    }
}

 

 

Example URL: http://localhost:4502/bin/checkReplicationStatusHardcoded
Example Output:

 

Path: /content/wknd/en/adventure/jcr:content
Is Published: true
Is In Replication (Out of Sync): false

 

Avatar

Correct answer by
Level 7

Hi @NickAd1 

Below is a demo servlet which you can use to get the replication status of any content passed through parameters like : 

http://localhost:4502/bin/checkReplicationStatus?path=/content/dam/myProject/image.jpg

 

import com.day.cq.replication.ReplicationStatus;
import com.google.gson.JsonObject;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.framework.Constants;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component(
    service = Servlet.class,
    property = {
        Constants.SERVICE_DESCRIPTION + "=Replication Status Servlet",
        "sling.servlet.methods=" + HttpConstants.METHOD_GET,
        "sling.servlet.paths=" + "/bin/checkReplicationStatus"
    }
)
public class ReplicationStatusServlet extends SlingAllMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String contentPath = request.getParameter("path");
        JsonObject jsonResponse = new JsonObject();

        if (contentPath == null || contentPath.isEmpty()) {
            jsonResponse.addProperty("error", "Content path is required");
            response.setStatus(SlingHttpServletResponse.SC_BAD_REQUEST);
        } else {
            Resource resource = request.getResourceResolver().getResource(contentPath);
            if (resource == null) {
                jsonResponse.addProperty("error", "Resource not found");
                response.setStatus(SlingHttpServletResponse.SC_NOT_FOUND);
            } else {
                ReplicationStatus replicationStatus = resource.adaptTo(ReplicationStatus.class);
                if (replicationStatus != null) {
                    jsonResponse.addProperty("path", contentPath);
                    jsonResponse.addProperty("isPublished", replicationStatus.isActivated());
                    jsonResponse.addProperty("lastReplicationAction", replicationStatus.getLastReplicationAction() != null ? replicationStatus.getLastReplicationAction().toString() : "N/A");
                    jsonResponse.addProperty("lastReplicationDate", replicationStatus.getLastReplicationDate() != null ? formatDate(replicationStatus.getLastReplicationDate().getTime()) : "N/A");
                    jsonResponse.addProperty("isInReplicationQueue", replicationStatus.isPending());
                } else {
                    jsonResponse.addProperty("error", "Replication status not available for this resource");
                    response.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                }
            }
        }

        response.setContentType("application/json");
        response.getWriter().write(jsonResponse.toString());
    }

    private String formatDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        return sdf.format(date);
    }
}

This will return a json response.

Hope this helps!

Avatar

Administrator

@NickAd1 Did you find the suggestions helpful? Please let us know if you require more information. Otherwise, please mark the answer as correct for posterity. If you've discovered a solution yourself, we would appreciate it if you could share it with the community. Thank you!



Kautuk Sahni