Saturday, October 24, 2015

Basic commands and stuff to remember when working on AEM projects

Commands to do maven build to install the stuff from code to AEM instances:

mvn clean install -PautoInstallPackage -Daem.host=localhost -Daem.port=4502 -Dvault.password=admin

mvn clean install -PautoInstallBundle -Daem.host=localhost -Daem.port=4502 -Dvault.password=admin

Note: Port number is depending on what port you are running AEM instance. In the above commands, I gave 4502 as some example.

Command to open the AEM instance in debug mode:


java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=30303 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxPermSize=512M -Xmx1024m -jar cq-author-p4502.jar -p 4502 -verbose -nofork

Note: The above marked one in the red is port number on which debug instance runs.
       
In Eclipse, open the debug mode and under Run select debug configurations and from there select Remote Java Application --> right click --> New --> give port number same as above marked in the red.

Command to start the AEM Author instance:

java -Xmx1024m -jar cq-author-4502.jar

Note: Xmx means  maximum allocation of the RAM for the aem service

java -Xms1024m -jar cq-author-4502.jar

note: Xms means  Minimum allocation of the RAM for  the arm service

Using JAX-RS AND JERSY to write RESTFUL services in OSGI(APACHE FELIX, AEM)

https://chanchal.wordpress.com/2015/01/11/using-jax-rs-and-jersey-to-write-restful-services-in-osgi-apache-felix-adobe-cq5aem/

https://helpx.adobe.com/experience-manager/using/restful-services.html

Link Checker Transformer  and it's role in validating the page links:
Link checker Transformer can be used to disable or enable the external links validation on the content pages. It is up to us to decide on which one we have to choose from options like Disable entire Link checker transformer, mark entire links are valid or skip the validation of the link.

To Disable the entire Link Checker Transformer:
Go to http://localhost:4502/system/console/configMgr  and search for Day CQ Link Checker Transformer and in that select the Disable Checking option.

For certain Domain we can disable the link by adding overriding pattern:
For Example Link Check Override patterns: if we add ^hello/, then any external link starting with System will not be checked. You can add additional pattern to it.

How to make sure some links are always valid or always skip?
We can use x-cq-linkchecker="valid" parameter in anchor tags to make always make that particular link as valid or
x-cq-linkchecker="skip" parameter in anchor tags to make always make that particular link as skip, since it even didn't check the links.
Useful links for Link checking:
http://tostring.me/206/how-to-disable-adobe-cq-link-checker/

AEM CHEAT SHEET:
https://github.com/paulrohrbeck/aem-links/blob/master/cheatsheet.md

HOW TO CHECK THE USAGE OF THE COMPONENT IN THE WEBSITE?
1. In local instance or any AEM environment go 
    to http://localhost:6502/libs/cq/search/content/querydebug.html
2. Start building the query something like this:
    path=/content/<Specific site>
    property=sling:resourceType
    property.value=<project-name>/components/content/text
            Note: we can skip /app and directly give the path of component as stated above.
3. Hit search

   
   





Will keep on Adding the points.






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();
        }
    }
}