Meet the Adobe@Adobe team

CQ Tips and Tricks #4 – Switching SiteCatalyst Reporting Suite at runtime based on host

Recently I was configuring a new CQ install and we needed to switch SiteCatalyst reporting suites based on the host the application was running on.

The way we ended up doing this was by adding some custom javascript in the General SiteCatalyst Settings section of the framework.

//check for communities.dev|qa|stage.adobe.com or prod
s.dynamicAccountSelection=true;
s.dynamicAccountList="adbecush=communities.adobe.com;adbecush=communities.adobe.com;adbecush=cush-author.corp.adobe.com";

Here is a screen shot for reference.
sitecatlyst_settings

CQ Tips and Tricks #3 – Getting a service from JSP

This is just a quick little example of my two favorite ways to grab a service in a JSP page.

adaptTo is super handy

<%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0"%>
<sling:defineObjects />

<%@ page session="false" import="com.day.cq.security.UserManager"%>

<%
    UserManager userManager = resource.adaptTo(UserManager.class);
%>

see this page for more details on Adaptors make sure what your trying to adaptTo is mapped correctly. For example in this case I went from Resource to UserManager not all classes support AdaptTo.

Another simple way it to get a service is using the slingScriptHelper

<%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0"%>
<sling:defineObjects />
<%@ page session="false" import="com.day.cq.contentsync.handler.util.RequestResponseFactory"%>

<%
    RequestResponseFactory requestResponseFactory = sling.getService(RequestResponseFactory.class);
%>

Adobe Saves Thousands Using Adobe EchoSign

Some of the happiest surprises here at Adobe are the results we realize from using our own products.

Our team members want performance, value, engagement, and experiences that make their jobs productive and rewarding, just like our customers. To make that happen, we’ve been encouraging teams throughout Adobe—such as sales, procurement, and people resources—to integrate Adobe EchoSign into their e-signature workflows.

So far, the results have been spectacular:

·         Procurement has slashed $250,000 from its operating overhead

·         Vendor contract completion is three times faster

·         People resources has cut printing costs 80% and shipping costs by $35,000

Many of my colleagues are impressed at how well automating signature processes improves productivity while it cuts costs.  We also had a really easy time integrating EchoSign with our existing technology. The Adobe EchoSign API integrated with our legacy system in only three weeks, using only one analyst, one developer, and a few software QA people.

Our sales department uses Apttus enterprise contract management system (ECM), powered by Salesforce.com to manage nondisclosure agreements. The sales team can leverage EchoSign e-sign workflows within the ECM, generating clear audit trails to expedite workflows and verify the legality of agreements. The forthcoming companywide rollout and integration of ECM with Adobe EchoSign will make contracting even faster and more reliable.

Learn more about Adobe and the benefits we yield from Adobe EchoSign by clicking here

CQ Tips and Tricks #2 – Handy Urls

This is by no means an exhaustive list of all the handy URL’s found in the CQ 5.5 – 5.6 platform.  This is my short list of clipboard handy URLS.

URLS

/crx/explorer/index.jsp  - CRX explorer

/crx/de/index.jsp – CRXDE Lite url

/libs/cq/search/content/querydebug.html – Query debug tool

/libs/granite/security/content/admin.html – New user manager standalone ui  [5.6 only?]

/libs/cq/contentsync/content/console.html – Content sync console

/system/console/bundles – Felix web admin console

/system/console/jmx/com.adobe.granite.workflow%3Atype%3DMaintenance - Felix web admin console JMX / Workflow maintenance tasks

/system/console/jmx/com.adobe.granite%3Atype%3DRepository - Felix web admin console JMX / Repository maintenance tasks

/system/console/depfinder – This new 5.6 tool will help you figure out what package exports a class and also prints a Maven Dependency for the class.

/libs/granite/ui/content/dumplibs.rebuild.html?rebuild=true – Helpful link for debugging caching problems. Wipes the clientlibs and designs and forces it to rebuild it. Thanks to Mark Ellis for this link.

/system/console/adapters – This link shows you the Adapters are registered in the system. This helps you figure out what you can adaptTo() from resource to resource.

/libs/cq/compat/components/ntupgrade.html – This link allows you to update Node Types in the system. Thanks Tamer.

https://www.adobeaemcloud.com/content/packageshare.html – Link to the external interface for the CQ Package Share.

http://localhost:4502/crx/explorer/diagnostic/prof.jsp – Shows you the built in profiler

http://localhost:4502/system/console/profiler – Shows you the built in profiler

Params

wcmmode=DISABLED - This handy publisher parameter turns off CQ authoring features so you can preview a page cleanly
debugClientLibs=true – This will help to debug clientLibs includes

If you have more handy URL’s and or parameters that you think others should know about please comment on this blog entry and I will add them to the list.

CQ Tips and Tricks #1 – How to define a SlingServlet [CQ5.5-5.6]

There are many ways to define an OSGI service.
This is the preferred coding style for CQ version 5.5-5.6 that we follow on our team.

Registering the servlet by path

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    paths={"/services/unicom/v1/"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }
}

OR  registering the servlet by resource type and extension

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    resourceTypes = {"rep:User"},
    methods = {"GET", "POST"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }
}

To handle all requests and filter on selector you can change the example above to read something like this.

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    resourceTypes = {"sling/servlet/default"},
    methods = {"GET"},
    selectors = {"report"},
    extensions = {"json"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
........

For more details on the Felix Annotations see

Introducing the new CQ Typekit integration component

After it was announced that we were acquiring Typekit I had to go see what we were buying. I was pleased to find a great new tool for my web toolbox. Over the years I have had the displeasure of having to reject comp from designers because of their use of beautiful fonts. In some cases I had to cut up comps into a million pieces to try to perserve the intergerty of the design. Over all non standard web fonts have been a real pain to deal with. Yes, there have been other solutions to help me deal with custom fonts overtime but none I really liked. I really like Typekit and the website itself is a work of art.
I am going over the top a bit but its a great platform and I am glad we acquired the company.

Now that I have found a new friend in Typekit, I needed to introduce it to my best friend CQ. After my first integration I thought “Wouldn’t it be cool if an author could do this without any coding or IT help?”. So I went off and created a simple page property extension that allows a author to bind a page and its children to a Typekit kit ID.

The following is a video I shot demoing our new integration component which can be found on the CQ package share. Please forgive my lack of enthusiasm in the video. I was very tired on the day of the shoot.

Our customer package share recently underwent a major upgrade. While I am working on getting this package re-hosted in the package share here is a link to the current version.

Adobe’s social media strategy + Adobe Digital Marketing Suite = Awesome ROI

As a leader in digital marketing and digital media software, Adobe doesn’t have to turn far to find the products and technology that it needs to create, deploy, measure, and optimize digital marketing campaigns. For the launch of Adobe Creative Suite 6 and Adobe Creative Cloud, Adobe took the opportunity to showcase its robust social media initiatives and Adobe Digital Marketing Suite.

“We wanted to engage customers and drive solid business results through social media, so we had to clearly understand the impact of all our strategies,” says Maria Poveromo, director of social media for Adobe. “We not only set out to generate as much buzz as possible, but we also wanted to continually adapt our strategies along the way and see the returns.” Continue reading…

How to delete a Folder/Node in CQ repository from a JSP component

Problem:

In one of my projects I needed to show some content nodes in Tree structure in my JSP and then need to delete few of them with inline editing without leaving the page i.e. asynchronously. So I started looking for possible solutions.

Solution:

This blog is about all those findings.

There are two most common ways to manipulate a Node in CQ repository and so for deletion of a node.
Continue reading…

SxSW Interactive 2012 Memories

Opening days.
At first, this year’s South by Southwest seemed like a bust, it is one of the biggest design, new media, social media, technology, and film and media conferences in the world. Gray skies, relentless rain, a labyrinthine of taxis and registration lines and traffic jams put a damper on the start of the show. But a few days in, after the sun came out in a blaze of glory, people pulled off their rain suits and started to mingle. After that, the conference was in full swing — dozens of panels, hundreds of sessions, some awesome barbecue and many cameos and keynotes by some of interactive’ s famous, the whirlwind week ended just as quickly as it began. Here are some of my crucial takeaways from the week. Continue reading…