Monday, October 5, 2015

How to Create and Update the Content Package in AEM using Java?

How to Create  and Update the Content Package in AEM using Java?

The scenario is after authoring of the page, content implementer tries to activate, deactivate and update the page.

When Content Implementer activate the page then we have  to check for any existing content package  with in a session. If no Content Package exists, then a new Content package has to be created and add the respective page path as filter path into the Content Package.

When Content Implementer deactivate the page, then page path(filter path) has to be removed from the Content package.

When page is updated by the Content Implementer, then package has to be re-built gain.

Note: In every case Content Package has to be rebuilt, after every Operation.

The Code is as follows: ( This  Code is just for the reference. There  may some tweaks needs to be done. This article is created, just to give an understanding).





package com.sample.priceless.cms.utilities.servlets;

import java.io.IOException;
import java.util.List;

import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.jcr.vault.fs.api.PathFilterSet;
import com.day.jcr.vault.fs.api.ProgressTrackerListener;
import com.day.jcr.vault.fs.config.DefaultWorkspaceFilter;
import com.day.jcr.vault.packaging.JcrPackage;
import com.day.jcr.vault.packaging.JcrPackageDefinition;
import com.day.jcr.vault.packaging.JcrPackageManager;
import com.day.jcr.vault.packaging.PackagingService;
import com.day.jcr.vault.util.DefaultProgressListener;

@Component(immediate = true)
@Service(Servlet.class)
@Properties({ @Property(name = "service.description", value = "Create Package Servlet"), @Property(name = "service.vendor", value = "Priceless"),
@Property(name = "sling.servlet.paths", value = "/bin/cps" ),
@Property(name = "sling.servlet.methods", value = "GET") })
public class CreatePackageServlet extends SlingSafeMethodsServlet {

    /**
*
*/
private static final long serialVersionUID = 1L;

private final Logger mLogger = LoggerFactory.getLogger(this.getClass());

    private Session session;

    @Reference
    private ResourceResolverFactory resolverFactory;

    public CreatePackageServlet() {
    }

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        try {
            String packageGroup = "my_packages";
            String packageName = "abc123";
            String version = "1.0";
            StringBuffer packagePathBuffer = new StringBuffer();
            packagePathBuffer.append("/etc/packages/");
            packagePathBuffer.append(packageGroup);
            packagePathBuffer.append("/");
            packagePathBuffer.append(packageName);
            packagePathBuffer.append("-");
            packagePathBuffer.append(version);
            packagePathBuffer.append(".zip");

            String packagePath  = packagePathBuffer.toString();

           
            ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);
            session = resourceResolver.adaptTo(Session.class);
           
            JcrPackageManager packageManager =  (JcrPackageManager) PackagingService.getPackageManager(session);
            JcrPackage jcrPackage = null;
            DefaultWorkspaceFilter filter = null;
           
            if(request.getParameter("requestId").equalsIgnoreCase("activate")){
            if(session.itemExists(packagePath)) {
            jcrPackage =  packageManager.open(session.getNode(packagePath));
            }

            if (jcrPackage == null) {
                jcrPackage = packageManager.create(packageGroup, packageName, version);
                }
                filter = new DefaultWorkspaceFilter();
               
                filter.add(new PathFilterSet("/content/geometrixx-outdoors/en/men/coats/edmonton-winter"));
               
                filter.add(new PathFilterSet("/content/geometrixx-outdoors/en/men/pants/fulani-nomad"));
               
                filter.add(new PathFilterSet("/content/geometrixx-outdoors/en/men/shirts/ashanti-nomad"));

            } else if (request.getParameter("requestId").equalsIgnoreCase("deactivate")){
            if(session.itemExists(packagePath)) {
            jcrPackage = packageManager.open(session.getNode(packagePath));
                DefaultWorkspaceFilter defaultWorkspaceFilter = (DefaultWorkspaceFilter) jcrPackage.getDefinition().getMetaInf().getFilter();
               
                List<PathFilterSet> filterSets = defaultWorkspaceFilter.getFilterSets();
                int index = -1;
                for(int i = 0; i < filterSets.size() ; i++) {
                if(filterSets.get(i).getRoot().equals("/content/geometrixx-outdoors/en/men/shirts/ashanti-nomad")) {
                index = i;
                break;
                }
                }
               
                if(index != -1) {
                filterSets.remove(index);
                }
               
                filter = new DefaultWorkspaceFilter();
                for(PathFilterSet filterSet : filterSets) {
                filter.add(filterSet);
                }
            } else {
            mLogger.info("Packag doesnot exist::" + packagePath);
            }
           
            }
           
           
            JcrPackageDefinition definition = jcrPackage.getDefinition();
            mLogger.info("JcrPackage"+jcrPackage.toString());
            boolean autoSave = true;
            definition.setFilter(filter, autoSave);
            mLogger.info("filter was set");
            ProgressTrackerListener listener = new DefaultProgressListener();
            packageManager.assemble(jcrPackage, listener);
            mLogger.info("jcrPackage manager is assembeld ---------------------done");
           
            session.save();
            session.logout();
           
            response.getWriter().print("Package created. Check your package manager console with name " + packageName);
        }catch (Exception e){
        e.printStackTrace();
        }
    }
}

No comments:

Post a Comment