import com.day.cq.replication.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.http.HttpStatus;
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.SlingAllMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Session;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Sample URL http://localhost:4502/bin/support/content/publisher?path=etc/packages/abc.zip&destEnvName=QA&publishChildNodes=true
*/
@SlingServlet (paths = "/bin/support/content/publisher",
methods = "GET", metatype = true, label = "Content publisher to publish content across environments")
public class PackagePublisher extends SlingAllMethodsServlet {
private static final Logger LOGGER = LoggerFactory.getLogger(PackagePublisher.class);
@Reference
private Replicator replicator;
private List<String> activatedPathsList;
@Override
public final void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws IOException {
String requestPath = request.getParameter("path");
String publishChildNodes = request.getParameter("publishChildNodes");
final String destEnvName = request.getParameter("destEnvName");
if (StringUtils.isNotBlank(requestPath) && StringUtils.isNotBlank(destEnvName)) {
activatedPathsList = new ArrayList<String>();
Session userSession = request.getResourceResolver().adaptTo(Session.class);
ReplicationOptions replicationOptions = new ReplicationOptions();
AgentFilter agentFilter = new AgentFilter() {
public boolean isIncluded(Agent agent) {
if(agent.getId().toLowerCase().contains(destEnvName.toLowerCase())) { return true;
}
return false;
}
};
replicationOptions.setFilter(agentFilter);
LOGGER.info("replication starting ");
try {
replicator.replicate(userSession, ReplicationActionType.ACTIVATE, requestPath, replicationOptions);
Resource childResource = request.getResourceResolver().getResource(requestPath);
if ("true".equalsIgnoreCase(publishChildNodes)) {
publishChildPages(childResource, userSession, replicationOptions);
}
for (String path: activatedPathsList){
LOGGER.info("Activate paths" + path );
}
response.setStatus(HttpStatus.SC_OK);
response.getWriter().print("given path is replicated to given environment. Check in destination env.");
} catch (ReplicationException e) {
response.setStatus(HttpStatus.SC_BAD_REQUEST);
response.getWriter().print("Check Parameters. Also check author replication agents for " + destEnvName);
e.printStackTrace();
}catch (Exception ex){
response.setStatus(HttpStatus.SC_BAD_REQUEST);
response.getWriter().print("Something was wrong!!");
}
} else{
response.setStatus(HttpStatus.SC_BAD_REQUEST);
response.getWriter().print("Parameters are not passed.");
}
}
private void publishChildPages(Resource childResource, Session userSession,
ReplicationOptions replicationOptions) throws ReplicationException {
if (childResource != null) {
Iterator<Resource> itr = childResource.listChildren();
while (itr.hasNext()) {
Resource temp = itr.next();
if (!temp.getPath().contains("rep:policy") && !temp.getPath().contains("jcr:content")) {
if (temp.hasChildren()) {
publishChildPages(temp, userSession, replicationOptions);
}
activatedPathsList.add(temp.getPath());
replicator.replicate(userSession, ReplicationActionType.ACTIVATE, temp.getPath(), replicationOptions);
}
}
}
}
}
Final Thought
I found it very easy in day to day work when you want to move the content here & there. However, if there is any confusion & question. leave a comment. will respond asap. thanks.