Digital experiences are powerful. They can defy the imagination create wonder and inspire endless possibilities. That’s why we love digital — and we want to share those experiences with you.

A primer on programmatic tagging in AEM

The purpose of this blog is to introduce the AEM developer to writing tags in AEM Applications via the Tagging API. This post assumes that the reader is familiar with basic tagging in AEM, but here and there, things will be explained for the ease of the reader. For the sake of simplicity, the links to the local AEM console in the post assumes the port number where the author AEM instance is running in the reader's machine to be 4502. Overview What is Tagging? Adobe says: "Tagging allows content to be categorized and organized". Basically tagging is assigning one or more keywords to a piece of Content so that it can be identified whenever necessary based on its categorization. That piece of content could be a page, an asset etc. The entire Adobe guide on tagging is here. Tags are generally assigned to Pages and Assets. You can create tags via the ... READ MORE

AEM DTM Integration: Step-by-Step Process

The purpose of this blog is to go over AEM DTM Integration process step by step, using the recommended configuration options. There is documentation available for integration by Adobe here. Although, for someone who is integrating AEM DTM for the first time or with limited knowledge of one or the other, it is quite overwhelming to be exposed to the technicalities of all the available options at once. This post will also elaborate and expand on embedding DTM code on various experiences built within a single AEM instance. I hope this blog helps in simplifying the process for you. Assuming you have an author instance of AEM running, there are the three majors steps you need to perform to add the DTM code on your site via the cloud-hosted services integration: Create web property in DTM Configure AEM DTM Integration Embed DTM code in a specific AEM site ... READ MORE

Sightly/HTL Javascript Use Class Logging, Where's my log statements dude?

Recently on an engagement I was given the stipulations that the client could use Sightly, but not in Java Use class bundles. If any helper classes are used, they need to be in Javascript and live at the same location as the component. With these stipulations on development I took off converting their codebase to Sightly, with Sightly Javascript Use classes for any heavy lifting that couldn't be accomplished in Sightly/HTL alone. During development on their codebase I continuously relied on console.log(someVar); as a way of logging what was going on in my Javascript Use class (sure I could have setup a big boy logger using the log global variable, but due to time constraints, I just relied on console.log). One of the issues with using this kind of logging in a Javascript Use class is that your log messages get dumped into the error.log by default, not some pretty log file that contains log messages only belonging to your code. After a work day of scrolling through useless log messages r ... READ MORE

The Issue with Updating Inherited Groups in AEM 6.2 Using the Classic User Admin Interface

If you still prefer to use the classic UI for user administration for whatever reason (easier to get to/shorter URL to type/whatever), then there’s a new "feature" to be aware of in AEM 6.2 which has to do with modifying groups to which users belong. As all AEM documentation suggests, the best way to maintain user access rights is by maintaining a carefully structured set of groups whose members are other groups (and/or users). When you have a user belonging to a group which inherits from other groups, all the inherited group names get listed explicitly when viewing the groups to which a user belongs. This has the unfortunate consequence of updating everything that’s visible in the list upon save. In order to illustrate this behavior, navigating to the Classic User Admin interface at http://localhost:4502/useradmin, I set up a semi-arbitrary structure of groups where each have their own specific increased or decreased permissions. Th ... READ MORE

Kick Start your UI tests using Hobbes.js in AEM

This post will discuss a quick way to write automated UI tests in AEM using Hobbes.js and execute them from within the browser. Introduction This blog will discuss the usage of the Hobbes.js testing library available in AEM 6.0 and above, to run UI tests from within the browser. This framework technically relies on clientlibs, and the dependencies and categories settings of the clientlibs differentiates them from regular clientlibs. The 4 quick setup steps: Create a Client Library Folder in the desired location, say, in a component as apps/myProject/components/myComponent/tests. Create Test Suite(s), w ... READ MORE

Logging in Operations Dashboard in AEM 6.0 and beyond

This post will discuss logging via the Operations Dashboard in AEM 6.0 and beyond, and will also include a short tutorial to set it up for quick troubleshooting for developers and system operators alike. Introduction Have you ever wondered how some developers find the root cause of a lot of AEM problems faster than you can think of ? Yes, you guessed it right. Reading the logs! This blog is going to discuss in brief an alternative way to read logs in AEM 6.0 and above. This method utilizes the Operations Dashboard. Please note that this is NOT a tutorial to set up regular logging in AEM. For that you may want to read ... READ MORE

Using Grunt in an AEM Maven build

This post is a guide on how to establish a functional Maven build for AEM that includes Bower front-end dependency management and Grunt task management. The Grunt build will download Bower dependencies, move them to a client library, then create their respective .content.xml, css.txt, and js.txt to be used at the AEM component level. Prerequisites for this post: AEM instance (requires Java SDK) Maven (Link) NodeJS w/ npm (Link) Grunt (Link) Bower (Link) Optional reference file packet (Link) After installing above dependencies, set up a mvn project using the below code in a terminal or command prompt: mvn archetype:generate -DarchetypeRepository= -DarchetypeGrou ... READ MORE

Bulk file transfers with WebDAV

Bulk asset transfers to a JCR are sometimes tedious especially when using AEM's Assets Manager or Site Admin. Adobe has tutorials on how to upload to the DAM and accessing AEM via WebDAV. This tutorial will make accessing AEM's JCR via WebDAV clear for current versions of Windows and OSX, and provide an alternate solution to the upload to the DAM article. WebDav stands for Web-based Distributed Authoring and Versioning. All tutorial examples will need an instance to connect to, for the examples below a local author server will be used (http://localhost:4502). WebDAV on Windows (Windows 10) Specific to Win ... READ MORE

Adding to the Create Page Wizard in Touch UI

In this blog post, I will describe how you can add a new property to the Page dialog and make it available in the Create Page wizard and Touch UI Dialog in AEM 6.1. It is common to add new properties to dialogs whenever you need to give authors additional options for configuring components or pages. Whenever you need to add a new property into the Page dialog, it typically will not be required by authors at the time of Page creation. For those rare cases when you need some detail specified about a page upon page creation, you will need to add properties into the Create Page wizard. Below is what the out-of-the-box Create Page wizard looks like. Adding an existing page level property into the Create Page wizard is very simple. The only additional node property you need to add into your Touch UI Dialog is cq:showOnCreate. Add this inside /apps/projectName/components/page/pa ... READ MORE

The JCR Installer Pause Issue

On a recent client we found ourselves battling what became known as JCR installer hell. No, it wasn't quite as bad as whatever hell you might imagine. Yes, it was quite the inconvenience. If you've experienced yourself, you'll immediately start nodding your head. Let me know if you've heard this one: You make some updates to a bundle or three locally. Your pull request is merged or the watched branch is updated via push and your CI box kicks off the build. You get notified of build success (or just keep Jenkins open and auto-refreshing if you're OCD like me) and anxiously hop onto the relevant environment to take a look at your changes. After 10 minutes of furiously clicking around you begin scratching that spot on your head you always scratch when the code you know was just built out and succeeded locally doesn't seem to be working anymore. You quietly contemplate your own existence... As a good developer you paired your updates with some prope ... READ MORE

Granite UI: Empowering the Select Field

There have been vast improvements to the new touch ui interface since its inception back with version 5.6. Some of the authoring form fields however are still catching up to their extjs predecessors. One such field that lacks some helpful functionality is the select field(or /libs/granite/ui/components/foundation/form/select). Let's take a look at what is missing and how we can enhance the granite ui select field. What's missing? Let's start with an example. Say we are attempting to create a dropdown selection from a list of holidays authored elsewhere in the repository. For this example we are making the assumption that each holiday has been authored as a resource. First let's take a look at how we would achieve generating the dropdown with the old xtype="selection" and type="select: <holidays jcr:primaryType="cq:Widget" fieldLabel="Holiday" name="./holiday" type="select" options="path/to/holidays.-1.json." optionsTextFie ... READ MORE

AEM With Freemarker Templating Language

Not every developer in the AEM space is overwhelmed by enthusiasm when choosing between sightly or jsp. While the masses argue about the advantages of one over the other, everyone can agree neither is perfect. Whether turned off by the adolescence of Sightly or the rampant use of scriptlet that can make JSPs unreadable (and difficult to maintain), you might be looking for something new to implement. Fortunately, AEM gives us the power to leverage different templating languages with just a few custom java classes. Freemarker? While these steps can be replicated for any type of script rendering, I will be making references specifically the Freemarker Templating Language. If it is something you are unfamiliar with, I highly recommended reading about what it has to offer. I think you will be pleasantly surprised by how robust of a templating language it is. Part I: Creating a Custom Script Engine Step 1 - ... READ MORE

Vaulting to AEM

.post-content > ul { margin-bottom: 20px; } ul li img { margin: 10px 0; } Image Credit: "DK Vault" By Dinoenthusiastguy Licensed under CC BY-SA via Wikia Using the CRX (Content Repository eXtreme) via CRXDE can be cumbersome especially for testing, the following are easier ways to interact with the CRX via common IDEs. The basic concept is similar to git where as to pull and push from the content repository using an IDE as a catalyst. Note: This post assumes a standard jcr_root structure is being used ex:[repository-base]\content\src\main\content\jcr_root\... Warning: Transfe ... READ MORE

Installing AEM 6.1 Hotfixes

This post details a technique and a proper sequence for installing hotfixes on top of AEM 6.1 General Availability (GA) which is version Until the Service Pack 1 for AEM 6.1 drops, with a target of Q1 2016, this is a good method for quickly deploying all relevant hotfixes on top of the GA version. Your instance is now up to date, with the latest security patches, bug fixes, and feature packs added on. The source data is this article on the Adobe CQ Help site. There's some work involved in understanding the list of hotfixes on that article, and correctly ordering them for installation. What I have done is order the hotfixes chronologically, while also taking into consideration the dependencies for the Touch UI Feature Pack. Note that we're excluding hotfixes for AEM Forms. Here's the same data, but reprinted chronologically: May 28th, 2015 - ... READ MORE

Resizing Touch UI component dialogs

In this blog post I lay out a technique that I've recently put together to have more control over component dialog "windows" or modals in AEM 6.1's Touch UI interface. This user-interface is set to replace Classic UI. It's thus a good idea to get acquainted with the way it works. The good news is that by ditching the monolithic ExtJS framework and embracing more modern web technologies (jQuery, HTML5, CSS3), Coral UI and Granite UI offer the web developer a wider entry into customizability. Moreover, the web developer, in my experience, is better equipped in these technologies. The problem One of the things that we had in Classic UI was the ability to set custom heights and widths on dialog xtypes. With the concept of xtypes gone, we have to find an alternative way to resize dialogs in Touch UI. We can accomplish this with jQuery and Granite. The default size of component dialogs ... READ MORE

Introduction to Apache Camel

In a recent AEM project I was introduced to Apache Camel, a solution for migrating content from one endpoint/platform to another. As it applies to an AEM migration, a Camel implementation may be vital to saving time and resources, particularly in cases where the amount of content to migrate is enormous, where it would be prohibitively tedious for authors to attempt recreating pages by hand in AEM’s Site Author mode. Camel uses abstraction and uniformity to bring content from one area to another, in a repeatable way without over-customization. The goal is all about not reinventing the wheel, allowing developers to 1)write simple statements and 2)avoid having to build lower-level functionality such as XML parsing and retry logic. Basic themes I will discuss are EIPs, DSLs, Routes, Processors, Components, and automated testing. Enterprise Integration Patterns ... READ MORE

AEM 6.1 - Filter RequestDispatcher Forward breaks i18n

I just noticed that on AEM 6, in my Filter, when I call RequestDispatcher forward, i.e. request.getRequestDispatcher(...).forward(req, res);, it cause i18n to break. Here's a snippet of my codes: ... boolean filtered = false; SlingHttpServletRequest request = req instanceof SlingHttpServletRequest ? (SlingHttpServletRequest) req : null; SlingHttpServletResponse response = res instanceof SlingHttpServletResponse ? (SlingHttpServletResponse) res : null; if (request != null && response != null) { // block of codes to resolve the request uri and get the new desired URI if (this.resolvedUriResource != null) { String uri = this.resolvedUriResource.getPath() + ".html"; RequestDispatcherOptions options = new RequestDispatcherOptions(); options.setAddSelectors(uriSelectors); this.filterConfig.getServletContext().getRequestDispatcher(uri).forward(req, res); // OR //request.getRequestDispatcher(this.resolvedUriResource, options ... READ MORE

Decompile AEM: How to get a jar from AEM

AEM development is sometimes difficult to get started due to limited documentation. By having some code examples or a clearer understanding of what is under the hood, this could be the difference from good code to great code. Having the ability to decompile a jar can be very helpful in the development process. Decompiling the jar is the easy part. Finding and getting the jar in AEM can be more difficult. There are two ways that this can be accomplished in AEM, with Vault or without Vault. Check it out! With Vault (vlt) Go to http://localhost:4502/system/console/bundles Search for webservice, click Day Communique 5 WCM Webservice Support Notice Bundle Location copy the path after jcrinstall: (If you don't see jcrinstall, go to without vlt section) Open ... READ MORE

Apache Felix SCR Plugin Compatibility Chart

One of the issues I've run into during the past when setting up AEM / CQ5 projects is incompatibility between the various versions of the Apache Felix SCR Annotations and the Apache Felix Maven SCR Plugin. Usually, when this occurs, you will see an error like this when building the project: [ERROR] Failed to execute goal org.apache.felix:maven-scr-plugin:1.20.0:scr (generate-scr-descriptor) on project felix-annotation-test-bundle: Please use org.apache.felix:org.apache.felix.scr.annotations version 1.9.0 or newer. -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.felix:maven-scr-plugin:1.20.0:scr (generate-scr-descriptor) on project felix-annotation-test-bundle: Please use org.apache.felix ... READ MORE

Chrome Console Magic

Chrome has many timesaving and neat tools built into it, many of these tools are not necessarily obvious on the surface. This post is a deeper dive into what is available. If you are not familiar with Chrome Dev Tools at all, this post is probably not for you. $ selectors Chrome has built-in selectors much like jquery. Open selectors example file in Chrome Open dev tools, console On this page you will see 3 divs, two with a selector-test class and one with selector-test id. There are 4 useful types of $ selectors in Chrome. $() $() selects the first matching element. (If jquery is active on the page, it will select all matching elements). It will match classes prefaced with ‘.’, IDs prefaced w ... READ MORE

Breaking Through

Approximately 4 years ago, a senior developer at the company I was working for responded to a feedback request for my annual review. While the phrasing of this particular piece of feedback made it immediately apparent who authored it, I'll forgo sharing his name. The feedback itself left an immediate impression and remains with me to this day, as vibrant as when I first received it: "CoE asks a lot of good questions and, often, his questions have the effect of bringing everyone to a uniform level of understanding." While I pride myself on finding the right questions to ask, I'm not sharing the above to sound my own trumpet. Instead, I'm sharing it as there's a powerful message within. Before I attempt to convey it, however, allow me to paint a rather plausible picture for you. You're on a project and a developer on your team is tasked with the troubleshooting and resolution of a particular defect. Further, the project manager informs this devel ... READ MORE

CQ 5.6 Tipping Point

Image Credit: "Woodwards building Vancouver demolition 1" by Tannoy at English Wikipedia. Licensed under CC BY-SA 3.0 via Wikimedia Commons. Recently, I spent a bit of time running performance tests against various versions of CQ5/AEM to understand the performance characteristics of the different versions. ... READ MORE

Installing Bundles by Runmode

If I had a dollar for every bundle configuration I've looked at where there was a little checkbox titled "Enabled", I'd have, like, maybe $31 dollars and I could afford a new Indie Steam game or perhaps 12 of them if I waited for the summer or holiday sales... In reality, I've been on countless projects where the prevailing approach for ensuring a bundle only runs for a specific runmode is to make it configurable via the aformentioned checkbox. While this approach certainly works, there's a much easier and, in my opinion, cleaner and better way to handle this that I think gets overlooked For starters, consider that you can provide runmode-specific configurations for your bundles via simple naming convention. I'd cover this myself, but Krtisian Wright does an excellent job of doing so here. In short, you'll typically see structures along the following lines: ... READ MORE

Dealing with DNS Changer

DNS Changer is a malware that attackers use to modify a users DNS settings to a separate set of rouge DNS servers this is critical because an attacker that controls your DNS server also controls the content that is served to the user this makes it possible for attackers to use your sessions to unintentionally surf sites that contain other malicious content. One major issue that can occur is web-masking which could potentially allow an attacker to route websites that you browse on a daily basis to their own mock sites for example online banking sites, email, social network sites. Prior to this being used for malicious use it was primarily used by attackers to control the ad settings for search sessions. Controlling your search session would allow an attacker to embed ad network affiliate id’s that would allow them to earn money off o ... READ MORE

What Core Components are Involved in a Data Solution?

Author: Nicholas Varner, Big Data Senior Solution Architect As I mentioned in the “Kicking Off a BI Project – Who is involved?” post, some of the key personnel of a BI project are: Data Architect, ETL engineers, Business Analysts, Report Developers, Application Developers, Data Governance, and a Project Manager, which all have the common goal of providing stakeholders with the right information at the right time. The goal of this blog post is to get you thinking about the strategies that can provide the best Data Solutions for your company at the best price. The Data Solutions strategies we will detail include Data Integration, Data Storage, Web Analytics, Reporting, and Database as a Service (DaaS) solutions, also re ... READ MORE

Creating a Column Control in Adobe CQ

Column Controls in Adobe CQ allow authors to easily create and configure column-based layouts.  This guide shows advanced users and developers how to create and configure a column control.   Step 1: Add a Parsys to a Component JSP Include a Paragraph System into the page’s component JSP.  You can use any node name for the path, the resource type is ‘foundation/components/parsys’ &lt;cq:includepath="par"resourceType="foundation/components/parsys "/> Step 2: Configure the Paragraph System To add a Column Control to the Paragraph System, you will first need to update the design.  Select design mode on the sidekick. Design mode allows you to configure the Paragraph System for all pages with the same template.  Onc ... READ MORE

Adobe CQ5 Service Level Agreement

  Looking to implement Adobe CQ5? Are you maximizing Adobe CQ5 with its complementary products and integration capabilities? With an Adobe CQ5 SLA from Six Dimensions, you gain access to an Adobe partner with a proven best-in-breed CQ5 certified team who knows how to implement quickly and take advantage of the additional WCM capabilities Adobe continues to add on. Participate now and your business will gain the expertise you need to support an expanding, multichannel digital world – quickly, efficiently and cost effectively.   Accelerate deployment of enterprise integrated applications and products Eliminate recruitment costs and time to acquire experienced CQ5 developers Leverage the Adobe broad offering like S ... READ MORE

CQ5 Project Start-Up Package

Six Dimensions will be offering a two week hands-on “CQ5 Project Start-Up Package”. Package engages a CQ Project Manager / Solutions Architect as well as a CQ Developer over video and screen sharing. Package can be customized as needed. Week 1: On-Boarding with CQ Licensing and Product Overview Intro to Daycare, Ticketing and CQ Documentation Project Planning and Scoping Technology Solutions Strategy Basic Architecture and Configuration Content Editing Strategy Week 2: Getting Inside CQ CQ Author Training (Hands-on), CQ Developer Training (Hands-on), Code Promotion and Team Strategy, AGILE/SCRUM Coaching, Infrastructure and Technical Environment Building ... READ MORE

CQ Project Planning: Development Strategy

Several questions come up to me consistently while I move from client to client as a technical PM or solution architect. I felt compelled to list my responses to these questions so that you ask yourself the same questions every time you approach a new CQ5 project. MY response questions often lead to longer brainstorming sessions. Here are a few situations. Components Initial Topic: What gets “componentized” versus consumed, integrated or remain separated with regard to CQ5? My Response: How reusable is this functionality? What is the current life-cycle of this development? How frequently is it changed? How modular does this need to be? Will this functionality be replaced by another ... READ MORE

CQ5 Expert Available for Engagements

CQ5.x Senior developers available! We have two Senior Adobe/Day CQ developers available for direct clients only! Expertise in CQ Customizations, Tags, OSGI Bundles, JSR-170, CRX, Templates, Authoring, Publishing, Workflows, Sling, Java, REST, JavaScript, JSP, CSS, Apache, Sling, CRX, batch content importing, project management, technical leadership and solutions design. Matthew Sullivan, Sr. CMS Practice Director  Six Dimensions San Ramon, CA. Cell (408) 771-3543 Phone (925) 365-1457 ... READ MORE

CQ5 Development Setup: Maven Build and Deployment

Six Dimensions and 6D-Labs are pleased to announce its 2nd CQ webinar “CQ5 Development Setup: Maven Build and Deployment” The second of ten webinar series, will explore: • Project Structure • Creating a Maven Reactor • Creating Bundles • Multi-Project Setups • IDEs and Tools • Maven Plugins • Eclipse Plugins • Continuous Integration • Creating a Single Package • Deploying to CQ This webinar is complete, click here to download the video! ... READ MORE

CQ Scheduling Basics

In CQ there are a few ways to perform a scheduled action.  I will go over basics for the easiest way to achieve this, a custom class running a cron expressions to fire off a run() method. An alternative to this tutorial would be to create a scheduled or event workflow that is triggered at a specific time, I won’t go over this but as with most things there is usually more than one way to reach your goal. Scheduling in CQ uses the open source Quartz library, part Sling Commons:‘’.  The scheduler can be used in two ways, by registering a job method or even more simply by using the scheduler’s whiteboard pattern supported by scheduler’s API. Let’s begin, we will start with the more simple of the two ways to use scheduler in a ... READ MORE

Creating a Better Web User Experience for Intranets & Portals

Author: Travis Estell is a content management system (CMS) web developer and consultant at Six Dimensions. He has led complex content management integrations and implementations using the Adobe Experience Manager platform for over five years.   6D White Paper: The paper identifies ways to create a better user experience for the visitor and author, and  5 key considerations when moving to a new CMS for Intranets and Portals. Moving to a Content Management System Websites are usually moved into a content management system (CMS) for a couple of reasons. The new CMS usually provides a much better user experience for the person editing the site, often called the si ... READ MORE

August Webinar-Stravaganza!

Tis the season for webinars! 6D will be presenting some great webinars in August.  6D DPS Entitlement System Webinar Tuesday, August 18, 201512:30-1:00pm EST / 9:30-10:00am PST First up, Jason Porath and Cecelia Wren will be leading a webinar introducing the new 6D DPS Entitlement System. This product integrates with Adobe’s DPS and Publish platforms and allows non-technical administrators to easily manage user and group entitlement for multiple apps in an organization. We focused on its intuitive and easy to use web interface that is accessible on any device. If you are using Adobe D ... READ MORE

Fiddle or Servlet?

Introduced by Adobe Consulting is an extremely useful set of tools for AEM. If you haven't installed them already, I'd highly recommend it: ACS Tools Of particular note herein is the AEM Fiddle tool. Whereas we have wonderful free tools on the web such as JSFiddle or Codepen wherein we can mock things up and sketch out some code before dropping it in our repo, there really wasn't a good solution for AEM-specific "fiddling" until now. The AEM Fiddle tool does exactly what you'd expect: Enter some JSP code Run said JSP code See result in real time That alone makes the tool worth having but why stop there? Adobe has also baked in the following features: Can run JSPs, Sightly templates, ECMAScript, Handlebars templates, Javascript Te ... READ MORE

Hooking up OAuth to DPS

One goal of pairing OAuth with an Adobe DPS app is to create a smooth transition between a 3rd party login (such as Salesforce, Twitter, or Facebook) and the private or subscriber-only folios in your DPS app. The reality is that the developer is often on the hook for a lot of work to make this happen. 6D's Entitlement Server for DPS provides normal login and registration functionality directly through DPS apps, but now it also supports OAuth login and registration. To make it easier on developers and clients, I've created an open source Javascript library to simplify the use of Adobe's OAuthRedirectService which drives OAuth functionality in DPS apps. First, some background on what Adobe gives us to handle OAuth requests from a DPS App. The OAuthRedirectService object's purpose is to start and stop listening for any requests to a cu ... READ MORE

Using XMLBeans in Adobe CQ

Apache XMLBeans is a powerful tool for reading, writing and updating XML files.  XMLBeans dynamically creates Java classes based on an XSD Schema.  This makes it powerful and easy to use, however can make it more complicated to integrate into OSGi based applications, such as Adobe CQ, as the XML Element to Java Class mapping uses the Java Classloader. This guide shows you how to integrate XMLBeans in your Adobe CQ application.   Step 1: Install XMLBeans Bundle Download and install  ... READ MORE

Web Application Security & Your SDLC

Companies for years have neglected the importance of building security into their Software Development Life-cycle they always have had to deal with security matters once an intrusion happens. Over the years this has shown to cost enterprises billions of dollars in lost income, potential income as well as loss of client confidence. Data securitybreeches have impacted millions of users from having credit card, and social information security stolen to having their personal privacy exploited because of insecure passwords. It is important more so now than ever to look at security from an organic perspective, and to build security from within and not an after thought.  After thoughts are best saved for  missed attractions during a vacation trip not when dealing with ... READ MORE

Three AEM / DPS Tips

I recently created a reference integration between Adobe Experience Manager (AEM) and Adobe Digital Pubishing Suite (DPS). AEM 6.1 ships with an integration between the two tools, along with a reference implementation, Geometrixx Media. This is a very exciting solution, as it allows non-technical authors to publish content to DPS apps. The AEM / DPS Integration provides organizations opportunities to reuse content, more frequent mobile updates and a more consistent, branded experience across web and mobile properties. But of course, this does not come without a few challenges. Hopefully, the following tips will help ease your journey in implementing and AEM / DPS integration: T ... READ MORE

The Communication Firehose

There is a dramatic increase of usage for the term “omni-channel” or “multichannel” marketing. It’s truly the hot button term today. Is it really good for your customers? And therefore your bottom-line? Wikipedia defines omni-channel as … …the use of a variety of channels in a customer's shopping experience including research before a purchase. Such channels include: retail stores, online stores, mobile stores, mobile app stores, telephone sales and any other method of transacting with a customer. Transacting includes browsing, buying, returning as well as pre-sale and after-sale service. [link] In the enterprise marketing space, this concept ... READ MORE

How to add AEM Dependency that is missing from public repository

So you just updated to the nice and shiny AEM 6.1, looking at new functionality and exploring around. Then you decide to tap into the new api documentation. Then reality comes back in, the boss wants to connect a new product into AEM 6.1. Too easy! I'll use a custom cloud configuration. Google to the rescue... Adobe documentation here I come. Oh no! The documentation is a CRXDE Lite tutorial. Following the tutorial and testing it out, the screen explodes into a torrent of letters and characters...stack trace! Who would of thought... Turns out ConfigurationManager is turned off by default for security reasons ... READ MORE

New in Apache Sling: FSClassLoader Console

In AEM 6.1, the default repository based ClassLoader was replaced with the new FSClassLoader (File System ClassLoader).  This ClassLoader offers higher performance and throughput, however it removes a valuable tool for developers to debug errors in JSP scripts. In previous versions of AEM, developers could navigate to /var/classes and drill down through the heirarchy to find the Java file generated from the JSP scripts. In AEM 6.1, as the class and java files are now stored in the filesystem, this is no longer possible. Surprised ! Since AEM 6.1 no more compiled JSP files in /var/classes #AEM6 — Przemo Pakulski (@pacoolsky) June 3, 2015 ... READ MORE

Changing User Passwords in AEM 6.1 via cURL

In AEM 6.1, there have been a number of changes make to the structure of users.  In older versions of AEM, users could be found under a directory structure based on thier user name.  For example the user admin, would be found at /home/users/a/admin, in AEM 6.1, this has been changed, likely to support a larger number of users without performance issues.  Unfortunately, the method used to create this path does not seem to be predictable, so the path for an individual user is not stable across different AEM instances. Users in AEM 6.0   Users in AEM 6.1 Normally, this isn't an issue.  However, if you want to change the password on a user through cURL, this is a big issue as ... READ MORE

Agile Best Practices Webinar

This webinar covers approaches and best practices in running projects in an Agile Methodology, including: Agile vs Waterfall Agile Terms Project Lifecycle User Story Cycle Lifecycle Retrospectives This webinar gives a great outline of how to run agile projects and the agile methodology, explaining the best practices and providing recommendations based on real world experience. Watch / Download the Webinar ... READ MORE

Whats New in 6.1: Layouting Mode

Responsive Design has been a must have since the web was accessible on the go.  Normally Responsive Design calls for many layers of CSS or a premade javascript based framework. In AEM 6.1, Adobe has added a new feature in an effort to reduce design induced headaches.  Layouting Mode is the proposed feature that allows authors to have control over the responsiveness of components and pages.  There are three pieces play an integral part in providing authors to easily design a responsive page; Layout Container, Layouting Mode, and the emulator. The Layout Container is a newly added component that can now be added to your pages through Design Mode. Simply put the Layout Container is a paragraph system, which can contain other components. When added to a page, the Layout Container provides a grid which can be used to position, and resize, components added into it. The Layout Container may also be used as the default container, taking place the place of the default parsys cont ... READ MORE

New in AEM 6.1: Human Translation API

When AEM 6.0 was introduced, we we were excited to present a webinar on Six Dimensions's contributions to the new Translation API in Adobe Experience Manager. Now, with the release of AEM 6.1, we're excited to introduce Six Dimension's latest contribution in supporting the new AEM Translation API with support for Human Translation. The version 1 of the AEM Translation API only supported machine translation such as the service provided by Google Translate or Microsoft Translate. The latest iteration of the API now supports professional, human translation through a new asynchronous API. This API works by sending the content to the translation connector for translation and polling for updates. Introducing the Lingotek AEM Connector Six Dimensions has partnered with Lingotek, a leading translation service provider to create the first, approved connector for the A ... READ MORE

Improvements to Touch UI in AEM 6.1

The latest version of Adobe Experience Manager, version 6.1, hits shelves today. In case you missed it, the last review I posted of a major release of this product was, shall we say, a bit troubling.  I’m happy to report that AEM 6.1, while not perfect, improves several key interactions in the now-default Touch UI (including how to turn it off). Let’s take a look! Selecting your preferred UI Here was the dialog for setting User Preferences in AEM 6:   AEM 6.0: Attempting to change the default Authoring Mode  I actually couldn’t figure out how to set my Authoring Mode to Classic UI until an Adobe engineer contacted me to follow up on the post (in case you were wondering, that drop-down ... READ MORE

Repository runmodes now tied to instance runmode.

In AEM/CQ versions past, as in prior to AEM 6.0 and 6.1, if a publish instance was to go down and time was of the essence, you could always shutdown the author and copy the author repository over top of the publish repository. Once you brought up the publish instance, it would behave like a publish instance and you'd have all the content of the author instance with no need for long and costly activation of basically everything. You could work out the finer details later right? Those days are long gone. It appears according to this documentation from Adobe and my real world testing the run mode is somehow embedded into the repository at first run of the instance. Subsequently, changing the run mode of the start script, will not change the run mode of the repository and the instance will behave as the instance it was cloned from. What this means is that even though the ... READ MORE

Welcome AEM 6.1!

Adobe just announced the release of the latest version of Adobe Experience Manager, AEM 6.1. 6D Welcomes AEM 6.1! In celebration of the release of AEM 6.1, 6D's Thought Leaders have contributed a number new posts. Improvements to Touch UI in AEM 6.1 ... READ MORE

Three New Time-Saving Features in AEM 6.1

At Adobe Summit 2015, Irina Guseva and Cedric Huesler hosted a session titled "What’s New in AEM Sites 6.1: Top 10 Hottest Features." The first feature on their list of 10 is “Are We There Yet?” and describes features that have been added to AEM’s Touch-Optimized UI.  The techniques available in 6.1 make it significantly faster and easier for content authors to navigate, search, and edit pages in their sites.  AEM’s Touch-Optimized UI was first introduced in AEM 5.6.0 and then extended in 6.0.  Here are the three new time-saving features in 6.1’s Touch-Optimized UI: 1. Use arrow keys to select pages in Siteadmin > Columns view In the Touch-Optimized UI, go to the siteadmin (http://localhost:4502/sites.html/content) and choose a site or page.  Click the area in the upper right-hand corner click wh ... READ MORE

AEM6.1 - Sync Users/Groups on Publishers

AEM6.1 comes with OSGi tools/services where we can easily sync users/groups between unclustered publish instances (Figure 1). This feature is especially useful for leveraging AEM communities capabilities. Figure 1. I find this feature is useful when We don't want to store users, which are supposed to reside on publish instances only, on author. In community site manager, on author instance, we want to be able to set permissions (i.e. moderators or group members) for those users/groups (which reside on publish instances only). On author instance, we want to assign access or ban users from accessing publish instances. Information and instances used for this exercise For the sake of this exercise, I have 1 author insta ... READ MORE


Emberjs and AEM Emberjs is a popular framework for ambitious web applications. It can be used to create Single Page Applications or SPA. Emberjs can be used with AEM. Here is a simple approach to getting Emberjs working inside AEM. Getting Started Follow the tutorial from RequireJS and AEM 6. KISS. If you don't want to go through the complete Requirejs tutorial is is okay to just do the maven archetype portion, but will make this tutorial slightly more difficult to follow. If you do not want to follow the tutorial, checkout out github. Note: the github version is a working project and may not work by the time you view it. Getting Emberjs Download Emberjs and Template Compiler (I used debug ... READ MORE

CQ Haiku: Analytics

web leads submitted without any analytics trees fell silently I'm sure many of us in the Web Development world have run into this scenario: you're 70-85% of the way through a website implementation and someone says "oh, hey... we need to add analytics."  So a ticket is added into the backlog, a s_code.js file gets added into source control and some klugy JavaScript library gets cobbled together to track most (but not all) of what visitors do on the website. In the end, the business kind of gets what they want and after a couple iterations and some lost data, you're eventually pretty much tracking everything which needs to be tracked. This process gives one of the most important considerations in building a website a short shift. Without proper and complete analytics tracking how can the organization track and demonstrate the ROI on the (probably significant) investment in a new web platform? Detailed analytics tracking also allows analysts to derive inf ... READ MORE

Requirejs and AEM 6. Kiss.

Following the KISS principle, let's get requirejs working inside AEM. Table of Contents Getting Started with Requirejs and AEM Setup Create project using maven archetype Getting Requirejs Download Requirejs Setup Requirejs Setup jQuery ... READ MORE

Creating a site footer in AEM 6 using Sightly and Sling Models

The Adobe-developed and recently-donated-to-Apache-Sling project Sightly project has been out for a little under a year now, alongside Adobe Experience Manager 6, and has slowly been amassing documentation and gaining presence. The server-side templating language aims to give a facelift to the web development facet of Java-based software stacks, Adobe's AEM chief among them. This post will run the reader through a sample implementation of a site footer using Sightly, showcasing and describing a few of its features. It will also make use of Sling Models as the back-end tool to grab JCR data (nodes, properties) into useful class models. What we want is an authorable footer serving all pages of a language branch of a content tree. Let's assume ... READ MORE

CQ Haiku: JCR vs. Sling

Adapt to Node like Assembly inside Java Use Sling API Quite often I see code, especially from less experience developers, with something like this: Node node = resource.adaptTo(Node.class); String property = null; try{ property = node.getProperty("myProperty").getString(); } catch (RepositoryException re){ log.error("Exception accessing myProperty", re); } Or even scarier, there may be just a global exception handler for the particular method. Either way, this code is a lot more fragile than it needs to be. If the property myProperty does not exist this can throw a PathNotFoundException or if there's any other problem it will throw a RepositoryException. You also have to handle multiple null checks and ensuring the property value is the correct type. The Sling API on the other hand, handles most relevant exceptions by doing things like allowing default values or returning null if no val ... READ MORE

AEM-Lingotek Translation Connector Webinar

Are you using a custom or legacy integration for managing your translations in AEM?  Are you interested in supporting both machine and human translation? Do you want to make your translation process easier, cheaper and more reliable? If so the AEM-Lingotek Translation Connector Webinar is for you! Now it's easy to quickly translate your content directly from within Adobe Experience Manager (AEM) using the new Lingotek - Inside AEM Connector. Developed by Six Dimensions, an Adobe Business Partner and Lingotek Integration Partner, users will be able to access translated content, nominate content for translation, and even offer to translate content themselves, all without leaving their site! ABOUT THE WEBINAR Thought Leaders: Center of Excellence (AEM Technical Architect) Brian Warner (AEM Technical Architect) Calvin Scharffs (Lingotek Translation Expert) This webinar is the seventh in our  ... READ MORE

Invalid CEN Header (bad signature)? We can fix that.

Here recently I was tasked with grabbing content from a client's production systems to install in our dev system so the developers could test their code against real conent without worrying about damaging production content should things go wrong in testing. Everything went well until I tried to upload the package to our development instance of AEM, in which case I was met with this cryptic error message from CRX Package Manager: After almost an hour toiling around with this error and expecting it to be a corrupted zip file I finally discovered the cause. The development instance was running a 32 bit version of Java by some oversight probably on my behalf. The environment that originally packaged the package was running 64 bit Java. To correct this and allow my package to be uploaded to the CRXDE Package Manager, I simply upgraded the development instance to the same vers ... READ MORE

OSGi Fragments, Fragment Host and AEM 6. Where's the bundle?!

Recently, I had the opportunity to upgrade a project to AEM 6.0 sp2. I did the usual updating maven dependency versions, but no matter what I tried I could not get a Fragment to start. After further investigation, I discovered two important changes made to AEM 6 ... Important changes to AEM 6 Maven-bundle-plugin "wrap" goal I upgraded the maven-bundle-plugin to version 2.5.3. After doing so, the project would no longer build and kept telling me wrap goal is no longer supported. I removed the wrap goal and the build ran successfully. Fragment Host bundle name After the build was successful, I checked to ensure the fragment had been loaded in the system/console. Fragment was only installed. After some time and digging I found this: In CQ 5.6.1, looking ... READ MORE

Six Dimensions + Storycode = Mobile Success

Six Dimensions just announced the acquisition of Storycode, a leading Digital Publishing Suite (DPS) solution provider and creative agency.  I'm excited about this and you should be too! As a technologist, seeing the potential of bringing 6D's AEM expertise together with Storycode's creativity and expertise in DPS allows us to create scalable, connected and flexible DPS apps, powered by the content engine of AEM. DPS is a powerful tool for publishing content to multiple mobile apps across all of the major mobile platforms. When you combine this publication platform with the content management power of AEM enables enterprises to have non-technical users quickly and consistently publish content to ... READ MORE

Embedding Oak Index Configurations into a Package

AEM 6 ships with a new repository, CRX3 which is based on Apache Oak, a subproject of the Apache Jackrabbit project.  This repository promises significant performance increases over CRX2, however it does require a bit more work to setup.  Unlike CRX2, CRX3 requires you to explicitly declare which fields will be indexed.  If a field is not indexed, you will see an error like the one below in the error.log and significant performance degredation: 16.01.2015 13:56:45.206 *WARN* [0:0:0:0:0:0:0:1 [1421434528059] GET /content/client/en/products/product.3.json HTTP/1.1] org.apache.jackrabbit.oak.spi.query.Cursors$TraversingCursor Traversed 660000 nodes with filter Filter(query=SELECT * FROM [client:type] AS s WHERE ISCHILDNODE('/etc/catalog/products/PRODUCTID') UNION SELECT * FROM [client:type] AS s WHERE [client:id] = 'PRODUCTID', path=*, property=[client ... READ MORE

Taking Advantage of Git Branch Descriptions

If you're anything like me, you may accumulate a sizable number of branches locally over time. Based on old standards and what I'd consider some good practice, my branch names always follow the same format: myLDAPName/Issue# For example, jboyle/1641. While in my case this maps directly to a JIRA issue and is short and easy to type, it isn't very descriptive and after creating a number of branches, it becomes challenging to remember what branch contains what work without looking the issue numbers up in JIRA. Sure I could use more descriptive names for the branches themselves but there are limitations here. For example, you cannot have any spaces in your branch name so you might end up with a name like jboyle/1641-create-new-user-registration-flow. Further, you now have to type all of that each time you need to switch to that branch or perform many operations on it. Enter git descriptions. As of git 1.7, a new flag has been added for branches: ... READ MORE

ModifiableValueMap Not Found: Considerations in Using ModifiableValueMaps in an API

So let's just say you are designing an API which allows both reading and writing of attributes for a Resource.  Of course, you want to use consistent code to persist the values, so you use the (relatively) new CRUD features in the Sling API to both get and set the property values.  To save code, you might use a ModifiableValueMap for both operations, which works great in author as an administrative user.   The Problem At some point, you'll put your code in publish or test with a user with limited permissions and then: the dreaded null pointer. Of course, at this point, you need to track down the ... READ MORE

Accessing Request Variables in Sightly

You can implement some interesting stuff in Sightly, the newest templating language for Adobe Experience Manager, including Tower of Hanoi.  At the same time, there are a few practical applications which are not available in Sightly, including accessing request scoped variables in Sightly.  While Gabriel's suggested approaches in the Stack Overflow post are absolutely correct in this situation, there are still certain situations where request variables can be ... READ MORE

Adding non-string properties using Sling Testing Tools

Recently, I was creating integration test following this article. Everything was working out nicely but then I couldn't figure out how to create anything other than a String data type in the JCR. I was specifically trying to create a Date data type. I found a nice document about the sling post servlet and Date properties. This showed the proper format for Date String but all the examples where for HTML forms. I tried formatting the Date Strings accordingly but still only Strings where being saved.With help from Center of Excellence, he pointed out that I needed to use @TypeHint ... READ MORE

Escaping the Dreaded VerifyError

Recently (read early this afternoon) I was doing my best to beat my head against the desk until something useful spilled out.  The problem I was having was with a relatively old, but frequently updated codebase where recently certain random services would not start. The project had recently updated from Java 1.6 to Java 1.8 and at some point, the problem occurred but had not been noticed immediately as it only affected a small subset of the services.   When I checked in the OSGi console, it appeared the service was registered and all of the references were resolved and no errors were caught in the error.log. Even more oddly, other services which had the same @Component and @Service SCR annotations were not affected.   Finally, I checked the application specific logs and found an extremely puzzling message being lo ... READ MORE

Sling Models for Fun and Profit

Recently, I finally had a chance to leverage Sling Models for a new project.  If you are not familiar with Sling Models, they allow developers to inject methods and fields based on resource properties, other resources and OSGi services.  For those developing in AEM 6, Sling Models are available as part of the default installation, for those on older versions of AEM / CQ5, Sling Models are available as downloadable bundles on the Sling website.  Sling Models are a great way to do more with less code, thus you can "profit" by avoiding the costly technical debt from the large amount of boilerplate code required to access Sling content through POJOs or the spaghetti code when intermingling business logic for retrieving the same data directly ... READ MORE

Creating Custom CQ/AEM Workflow Process Step

It's no secret that CQ/AEM Workflows are quite powerful, but what happens when the default process steps aren't what you need? In a case like this you need to create your own custom process step. In this article I will detail the steps you need to take in accomplishing this. 1) This tutorial is going to be completed in java, drill down into the Java portion of your code base and create a java file. 2) Anytime I create something that is going to appear in the Felix Console I like to label it properly. 3) Now implement "WorkflowProcess" and override the "execute" method. 4) As you can see the "execute" method gives you 3 different variab ... READ MORE

9 JCR-SQL2 Queries Every AEM Developer Should Know

JCR-SQL2 queries are useful items in every AEM Developer's toolbag.  They are relatively quick, aren't deprecated and have a familiar SQL like grammer. JCR-SQL2 queries can be invoked from the JCR API: Session session = ...QueryManager queryManager = session.getWorkspace.getQueryManager();Query query = queryManager.createQuery("{QUERY}", Query.JCR_SQL2);QueryResult result = query.execute(); or through the Sling API: ResourceResolver resolver = ...Iterator<Resource> result = resolver.findResources("{QUERY}", Query.JCR_SQL2); Although there is an official specification for JCR-SQL2, there aren't a ton of really good resources out there nor good references for finding examples of JCR-SQL2 queries.  Below are some queries I've found useful and I think every developer should have as a reference.   ... READ MORE

New from Apache Sling: JSP XSS Protection

Cross Site Scripting or XSS represents a serious threat to site owners and users and can be very difficult to properly prevent, especially given the weak tooling available in the JSP specification. Many times, developers depend on the <c:out /> tag from JSTL, however this tag does not provide robust XSS protection. On Friday, the Apache Sling Project released a new version of the Sling JSP Taglib, version 2.2.4 which contains new functionality help to developers thwart XSS attacks.   The new release contains one new Expression Language (EL) function and one new tag, both for encoding text to prevent XSS attacks.  The new features use the OWASP Enterprise Security API to ensure that th ... READ MORE

CQ Users and Groups Permissions - Major Differences

In this article, I'll briefly illustrate a major difference between CQ 5.6.1 and AME6 when it comes to Users and Groups permissions. I am not fully aware the scale or the extent of the impact this might cause on upgrading from CQ 5.6.1 to AEM6, but I thought it's worth sharing.   CQ 5.6.1 AEM6 In CQ 5.6.1, users/groups permissions are stored in a JCR node called rep:policy under the node that was assigned right(s) to a group/user. See figure 1 below: Figure 1 In AEM6, users/groups permissions are stored in  ... READ MORE

Debugging Apache Axis 1.4 with SLF4J

In my previous blog post, I discussed getting Apache Axis 1.4 working in AEM. One of the more interesting things about Axis 1.4 is that it's not easy to log the actual request from the client and response from the server.  You can configure the LogHandler, however it is somewhat problematic in AEM to configure due to the classpath complexity in OSGi and it will only log to the system outputstream.  This is problematic in AEM as the stdout.log isn't setup by default when runnning in server mode and when running locally will not roll.  Intead of this, I would suggest registering a custom SLF4J Log Handler to log the request and response to the AEM SLF4J logs. To do this, first, add the SLF4JLogHandler to the project, which I ada ... READ MORE

Running Apache Axis 1.4 in AEM

Despite doing several Web Service implementations over the last couple years, I have successfully avoided using Apache Axis until now.  A client's Web Service implementation was incompatible with the code generation tools available in more modern Web Service clients, such as Apache CXF.  While there is documentation around using Axis 2 with AEM, there isn't really anything available for Axis 1 in AEM, which is what I needed to use.  So, I rolled up my sleeves and dug in. Challenge 1: Axis 1.4 as a Bundle The first challenge I ran into is that Apache Axis 1.4 is not created as a bundle.  Thanks to some googling (now simplified with 6D's Bundle Finder), I found that the Apache Geronimo project produced a bundled vers ... READ MORE

New from Apache Sling: Testing Tools 1.0.8

The Apache Sling Project just announced the release of Testing Tools 1.0.8.  This new release brings some great new features and fixes to anyone using Apache Sling Testing Tools for integration tests.  There are two fixes which are certainly worth highlighting. SLING-3328:  Simplify SlingTestBase usage with an already running instance This issue makes it easier to connect the Sling Testing Tools to a running Sling / AEM instance without requiring to set the jar.executor.jar.folder, jar.executor.jar.options, jar.executor.vm.options and properties which currently must be set and must contain reasonable values which resolve to a JAR file.  Now, with this fix, if the server specified in the test.server.url property as the server to connect to is running, these properties will n ... READ MORE

Handle form submission using AdapterFactory in Adobe CQ (AEM) OSGi Component

In this article, I will be addressing 2 issues: how to efficiently handle form submission map data in Java and how the AdapterFactory get implemented in Adobe CQ (AEM). How to efficiently handle form submission map data in Java You need 1 servlet, 1 service, and 2 classes: FormSubmissionHandlerServlet, FormSubmissionHandlerService, MyCustomClass, and MyCustomClassAdapterFactory FormSubmissionHandlerServlet is the main service that handles the HTTP request (AJAX request) and dispatches the work for the right candidate class that designed to handle individual form. Sameple codes of FormSubmissionHandlerServlet package ... // developer comments... // all the necessary imports import ... @SlingServlet(paths = "/apps/mycompany/forms", metatype = false) @Properties({ @Property(name = "", value = "mycompany.forms", propertyPrivate = false ... READ MORE

Git Tricks I Use

After developing on AEM for quite some time, I've come to rely on git for a lot of things. Whether it's maintaining several of my own branches at once, firing off pull requests to get my stories into master, or pulling down someone else's branch to take a look at their work, git has become an indispensable part of my AEM development lifestyle. And, as a developer, I'm always looking for ways to make things easier, cleaner, or simply more efficient. While there a lot of great GUI tools for working with git (I personally recommend Sourcetree), I primarily the command line out of habit. Maybe it's the ultra-granular control this gives me over the entire experience or perhaps it's the feeling that I'm refactoring code behind The Matrix as I'm slamming away in Total Terminal. Either way, I've found some tricks that make life easier and I'd like to share some with you now. 1. Deleting all branches except the one you're o ... READ MORE

Client-side custom form validation and submission in Adobe CQ

In this article, I'm going to discuss on how I integrated and implemented jQuery Form Validator and jQuery Form for handling form validation and submission with Adobe CQ5 (AEM). Assumption (for the sake of this example): Your CQ application/project name is: myapplication We have 3 different clientlibs categories: myapplication.jquery, myapplication.components (embeds myapplication.components.apps), and myapplication.components.apps (this category is for the clientlibs located in the apps level). The location for the 3 clientlibs are: /etc/designs/myapplication/jquery, /etc/designs/myapplication/components, /apps/myapplication/components/{component_n ... READ MORE

Using the cq:template file

Often when developing Components I find that I need to specify a default value that is set as soon as the component is dropped on the page. Today I want to show an easy and quick way to do this using cq:template. 1) In CRXDE navigate to the component that you need the default value for. 2) On the same level as the component dialog create a node titled "cq:template" of type "nt:unstructured". Your component should now look like this. 3)Now you can either add your values as properties using the CRXDE interface or you can vault your changes out into your favorite IDE and manually write the XML on your own. In this case I just used CRXDE since it is the quickest. 4) And that should do it. Feel free to now test your component! ... READ MORE

Tailing AEM Logs in Eclipse

My typical workflow for developing with AEM frequently involves reading from logs.  Whether it's for checking if bundles and services installed, following the logging of custom code or trying to get a full stack trace of an error, the logs provided by AEM are an invaluable tool.  Until now, this has meant switching back and forth between my IDE (Eclipse) and the terminal.  Dual monitors and Total Terminal help, but it's still not as efficient as it could be to keep switching back and forth. Last week, I decided to see if this was a way to make this better.  The most obvious solution was to make my logs visible inside Eclipse, so I started looking at the Eclipse Marketplace.  There are a number of plugins, and after some testing, I settled on LogV ... READ MORE

Creating a Custom Predicate for Querying by Version

Recently I found myself implementing a custom parametric search UI within CQ. The intent of this view was to allow a user to query for Resources based on any combination of parameters. For all but one of these parameters, I was able to leverage the OOTB predicates but for querying on version, however, I had to think outside the box a bit. While the other parameters could all, in some form or another, be evaluated against a property within a Resource's JCR "branch", version data is stored elsewhere in the repository: specifically jcr:root/jcr:system/versionStorage. Further, no predicate exists to do the legwork here. After first querying for version separately, sorting both result sets, and merging them by path, I came to the grim realization that I was going to have to wire up custom pagination with this approach as it was not acceptable to arbitrarily limit the number of results and scrolling was not an elegant solution either. QueryBuilder pr ... READ MORE

Follow Up to Integration Tests in Adobe CQ

In my previous post, I had introduced the idea of integrating testing AEM (CQ5) projects using Apache Sling Testing Framework.  After using the integration testing framework for a while and learning more about the framework, I have come up with some improvements to my original post. 1. Support Testing Existing AEM/CQ5 Instance This makes your tests a lot quicker and easier, instead of starting up a new CQ instance just to run your integration tests, you can hook into the CQ instance you are already using for development.  To do this, update your systemPropertyVariables parameter to have the following variables: <http.port>${crx.port}</http.port> <test.server.url>http://${}:${crx.port}</test.server.url> <jar.executor.jar.options>-p ${crx.port} -nobrowser -nofork</jar.executor.jar.options> <jar.executor.vm.options>-XX:MaxPermSize=512m -Xmx1g</ja ... READ MORE

AEM6 Self Service Monitoring

Adobe Experience Manager 6.0 is the latest release in the long line of CQ/Adobe Experience Manager products. AEM6 now has monitoring capability beyond what was included in previous releases, built-in to the WCMS out of the box. Navigating to "Tools"->"Operations"->"Dashboard"->"Health Reports" will present you with a screen containing multiple color-coded 'tiles' representing monitored parameters like the one below. As you can see, each tile is color-coded to provide an easy-to-view snapshot of the health of the AEM instance. Red indicates a failing healthcheck, yellow indicates an undesirable state of a parameter, while green indicates all items pass the health check. Each 'tile' can be clicked to dive into the status of the item the tile is reporting on: ... READ MORE

Issues with Touch UI in AEM 6

AEM 6 has been released, and with it comes an extension of the thin veneer known as “Touch-optimized UI.” In AEM 5.6, the Touch UI was limited to just the consoles; upon entering a page for content editing, one was greeted with the tried-and-true “Classic UI” interface. In AEM 6, Touch UI has been extended to provide an entire alternate user interface for authoring content. The “What’s New in AEM 6.0” video released by Adobe shows the ease of editing pages with a tablet thanks to this new UI. Let’s skip altogether the conversation around the merits of what benefits that may provide and just assume that you, the content author, will be performing your AEM content authoring on a desktop operating system. The implementation of Touch UI in AEM 6 is troublesome at best, and we’re calling it out so that those in search of help know that they are not alone and not misusing the tool.  Selecting your preferred UI Let’s begin by ... READ MORE

AEM6 Translation API Webinar

Do you want to learn more about the new changes to translations available in AEM 6?  Are you interested in machine translation?  If so the AEM6 Translation API Webinar is for you! About the Webinar Thought Leader: Bryce Acer (AEM Technical Architect) This webinar is the sixth in our series of AEM (formerly Day CQ) webinars and will provider an insider insight into the new Translation API available in AEM 6 from one of it's primary architects, Bryce Acer. This webinar is intended for technical audiences, and will be especially helpful for developers who are experienced with OSGI and CQ development. In the webinar, AEM Technical Architect Developer Bryce Acer, will explore: The new Translation API How to configure machine translation in AEM6 Extending the Translation features in AEM6 Time & Location Wh ... READ MORE

Sightly vs Handlebars vs JSP: Comparing Scripting Languages

The latest release of Adobe Experience Manager, version 6.0, introduces two new languages for front end scripting in CQ.   The two languages are both attempting to address the problems found in the existing foundation and Geometrixx reference code, namely the lack of separation of concerns between business and presentation logic and the sloppy use of scriplet.   The two new templating languages are: Sightly Sightly has come from Adobe user groups and seems to be trumpeted by the Adobe Professional Services team.  There is official documentation for Sightly and Adobe has produced a number of blog posts and webinars about it: ... READ MORE

New in AEM 6: JSP TagLib 2.2.0

The latest release of Adobe Experience Manager, version 6.0, introduces a number of features which make developing on the platform easier and cleaner.  These include some different open source bundles and proprietary solutions from Adobe.  One of these new bundles is the Apache Sling JSP TagLib 2.2.0. This bundle is available in AEM6 by default, however it is not included in the global.jsp.  The Sling JSP Taglib 2.2.0 provides a number of new tags to make it easier to develop on AEM and other Sling-based applications without requiring the use of scriptlet.  Thse new taglib includes the following Expression Language functions: adaptTo findResources ... READ MORE

WhitePaper: Creating a Better Web User Experience for Intranets & Portals

6D White Paper: The white paper identifies ways to create a better user experience for the visitor and author, and 5 key considerations when moving to a new CMS for Intranets and Portals. Excerpt Moving to a Content Management System Websites are usually moved into a content management system (CMS) for a couple of reasons. The new CMS usually provides a much better user experience for the person editing the site, often called the site author. When it’s easier to add new pages, update text, and add photos, you get a more frequently updated site with better content. And usually, a move into a new CMS usually is accompanied by a new design and reorganization of the site’s content. This improved experience makes it easier for a visitor to find what need more quickly and easily. These days, most new designs are also responsive, providing a first-class exp ... READ MORE

Monitoring AEM with New Relic

I love New Relic.  Their server monitoring tools allow me to remotely monitor my various servers and development applications for free and their stuff just works.  Recently, we were running into an issue at Six Dimensions where a couple of our development servers were toppling over and without any real monitoring in place we couldn't tell why.  To address this, we've been rolling out New Relic on all of our development servers.   As part of this, I was curious about setting up monitoring of Adobe CQ / AEM with New Relic.  Out of the box, New Relic supports a number of application servers, however AEM is not one of them. Luckly, I found a pretty simple guide to setting up monitoring generic Java applications.  Here are the instructions for setting up basic montioring for AEM in New Relic: Step 1 - First login to New Relic, go to the A ... READ MORE

My AEM Development Setup

I'm pretty particular about how I like to lay out my computer for development.  Ideally a good setup would:  Exist within my user's home directory  Contain short but meaningful folder names  Allow for multiple versions of an application To support this I create three folders:  dev - contains some app data and development utilities  git - contains all of my GIT repositories  scripts - contains custom shell scripts The git and scripts folders are pretty straight forward.  The git folder contains all of the GIT repositories I have worked on while the scripts folder contains a number of shell scripts. The dev folder is where things get more interesting.  This folder contains a separate folder for each development application I use.  For example in the case of AEM, I have a folder called cq for all of my AEM ... READ MORE

Modify the OOTB LinkChecker Config

I've come into the issue recently of needing to modify the prefix and suffix for invalid links detected by the linkchecker. This seemingly simple task is unfortunately not as easy as overlaying the /libs/cq/linkchecker/ to /apps/cq/linkchecker/ For reasons unknown (to me at least) the standard overlay does not work for this type of update. Instead, after digging into the code, I found this information: REQUEST_ATTRIBUTE_NAME = LinkCheckerSettings.class.getName(); LinkCheckerSettings settings = (LinkCheckerSettings)request.getAttribute(REQUEST_ATTRIBUTE_NAME); The above lines indicate that if we set a request attribute to the LinkCheckerSettings object we wish to use, we will use our custom settings instead of the OOTB ones defined in that node. Now that we have this goal, we can start creating a LinkCheckerSettings object to use. I would suggest to include these settings as a getter method in a custom OSGi Service, su ... READ MORE

Hide/Show parsys on the fly with JavaScript

It is relatively painful to deal with tabs, accordion, or carousel component. Especially when we want to enhance content author experience. Here’s a use case to illustrate to you what I meant: We need to build a tabs component. We want author to manage tabs’ content on the page (not via child page or a separate page). We want author to drag and drop any component into any tab’s content they wish. Bug The screenshots below show the bugs (visually) when we don’t implement the JavaScript solution: Tabs displayed on page load: Figure 1. Tabs displayed after clicking on “Tab 2”. As we can see that the parsys of the hidden element (tab 1’ content) is not disappeared, but instead they piled up on top of each other (Figure 2). ... READ MORE

CQ Dialog - Generate dynamic rootPath with ExtJS Plugin

This article will shows you how to: one write ExtJS plugin and calls it in CQ dialog and two generating rootPath with ExtJS plugin. We know that with xtype pathfield, we can set rootPath value to any location we want. The drawback is that it is static. If we set rootPath to /content, we fall into providing “no so good author experience” as content author needs to click through pages list to get to the desired page. The solution would be to dynamically generate the value of rootPath. In this example, we will show you how to generate a list of child pages dynamically. Using CQ Component Dialog In the pathfield node’s properties, we add a property named: plugins and set its value to the name of the ExtJS plugin (i.e. customRootPathPlugin) that we are going to create. ... READ MORE

How to Manage Field Dependencies in a CQ Dialog

I'm working on a front-end project with some relatively complex UI requirements for author dialog. The author UI requires field dependency. A set of fields is shown or hidden based on a certain selection author makes. After getting a working codes finalized, I thought that it is worth sharing with the community. Sample use case for field dependency: As a content author, I would like to be able to build a grid of maximum 12 columns. I would like to have 2 options: Default and Custom. When I choose Default, I would like to see a set of fields including: Dropdown list with predefined column formats like: 1 Column; 2 Columns (6, 6); 2 Columns (10, 2), etc. Dropdown list with predefined column's border styles. Dropdown list with predefined column's padding styles. When I choose Custom, I would like to see a set of fields including: Dropdown list with numbers of columns: 1, 2, 3, …, 12 ... READ MORE

How NOT to Generate HTML

Recently, I have been working on an integeration between Adobe's Search and Promote and CQ5/AEM.  This work has reminded me of one of my least favorite anti-patterns, embedding HTML markup in Java code.  You tend to see this 'technique' a lot in Servlets, Tags and other Java web technologies.  This is a bad idea for several reasons: It breaks the MVC model It's hard to understand the HTML code It's difficult, if not impossible, to modify the markup In the case of Search and Promote, the CQ integration classes are used to parse the XML responses from Search and Promote.  The unfortunate part is they also are used to generate the HTML for the forms to be displayed in CQ as well as some additional HTML markup.  While this makes for smaller scripts in CQ, it makes extending the Search and Promote func ... READ MORE

Expression Language, Tags and You

One of the things I've seen on many projects which makes code a lot more difficult to read and understand is scriptlet (aka Java inside JSPs). Especially now, there really isn't a good reason you need to ever use scriptlet inside your JSPs, but especially given the prevalence within CQ's codebase it's a common practice. Helpful tools Recently, myself and others have been contributing code to make it easier to develop JSPs in CQ without using scriptlet. All of these tools will need to be installed as bundles as part of your project. Some of these tools are: Sling JSP Taglib 2.2.0 These tags allow you to perform basic operations against Resources in Sling without any scriptlet. Sling Models 1.0.0 Created by Justin Edelson ... READ MORE

Creating and Configuring your Maven Project for AEM

The goal of this document is to have a maven project that builds a single asset (the package profile) to deploy all Servlets, Services, and JCR Code. In addition to this, for development purposes we want to be able to build each item listed above individually, such that we do not require a full build to test a simple JSP change. For starters, this is a fairly common project structure that we'll be basing this document off of: <master> |______vault |______services |______servlets |______package As mentioned above, our goal is to have the vault package contain all JCR code (CSS,JS,JSP, etc), services to include OSGi Services, servlets for OSGi Servlets, and package to be the "all-in-one" deploy. The first problem I found with many implementations was that building the master project would also build and install each child module. This obviously is not desired, but given the "install" goal is being sent from the master, it obviously would inher ... READ MORE

Simple Web Console Templates

Awhile back, I wrote a blog post about [creating Apache Felix Web Console Plugins]({% post_url 2013-09-11-service-boss-level-part-2-custom-web-console-plugins %}). It's a pretty great technique for creating a diagnostic configuration panel for complex services or applications, however the process for rendering HTML for the consoles is still somewhat stuck in the dark ages. Since servlets are used to render the HTML, you'll generally see HTML being written to the response in the Java code of the Web Console class. You can even see this in the plugins which come in Apache Sling, such as: TopologyWebConsolePlugin JobConsolePlugin Whil ... READ MORE

The Great and Powerful cq:EditConfig

One of the most under-appreciated features of AEM components, in my opinion, is the cq:EditConfig. This node allows developers to configure how a component is edited, add or remove functionality from the editor and generally tailor the authoring experience for component. The cq:EditConfig is simply a node with the primary type cq:EditConfig and the name cq:editConfig under the component root. The cq:EditConfig allows for configuring many important features of the component's editing experience including: Dialog display behavior Edit bar or hover appearance Editor items Listeners Advanced features such as: Drop targets Additional actions InPlace editing When to use cq:EditConfig Personally, I end up using cq:EditConfigs on many of the components I write. They are especially useful on components which: May not display content - After all how can you hover over some ... READ MORE

AEM Start/Stop Script Modification for a Cluster

When clustering AEM instances there is a required order for shutting down and starting the instances. This however can be very tricky in a shared nothing cluster as the master & slave can automatically swap places at any time for multiple reasons. This means in order to shut down an instance you typically need to identify the master instance first. Conversely in starting up an instance the slave can only be started after the master has become available. If they are started out of order the slave instance will retain its process but will never connect to the master and thus will be a dead process that must be stopped and restarted. This document will describe some changes that can be made to the start and stop scripts that will ensure the instances will be stopped in an acceptable order as well as prevent the slave node from starting up without a master. It does however have 2 requirements, an administrative password must be stored in the stop script, and this is designed only for a cluster of 2. ... READ MORE

AEM Restricted Backup User

The AEM backup curl command is often passed using admin credentials however for security reasons it may be undesirable to store the AEM admin user's credentials in plaintext form in a system script. To mitigate this instead a generic user can be created and be granted more specific access rights to the granite backup console. This will allow to restrict what this user has the ability to do by only having granted rights to start, stop, and view a list of backups. Limited User account To do this we first need to go into the AEM user manager interface and simple create a generic user to be used for backups. The name for this user is not important as long as it is identifiable to what its purpose is. Once created the screenshot below should illustrate exactly what permissions this user should be assigned in order to be able to kickoff backup jobs. Backup Sc ... READ MORE

AEM Live Backup Strategy

AEM has a built in live backup mechanism which works rather well at creating an extractable archive of the complete instance it can take an extremely long and unmanageable amount of time due to the nature of what all it is creating an archive of. By default this backup will consist of the original CQ jar file and everything at an equal level and anything contained in any child directories of that path. While this works, it's not ideal as a long term solution due to the size in which one can expect the environment to grow. The datastore will be the largest section within this backup and will consist entirely of binary or text "content" that will never change. Modifications and new files will generate new items in the datastore and thus nothing is ever deleted from this path unless datastore garbage collection is run. For this reason the datastore can be treated as a necessity of the AEM instance but may be treated separately in terms of backups. For this reason it is suggested to relocate the data ... READ MORE

Integration Tests in Adobe CQ

Awhile back I wrote a post on running integration tests in Apache Sling. This technique is useful for developers working directly on Apache Sling, but doesn't support downstream platforms like Adobe CQ/AEM.After some finagling and testing I was able to get a similar technique working using Adobe CQ / AEM instead of Apache Sling. To enable integration tests using Adobe CQ, add the following into your POM.DependenciesFirst, add plugins to copy required dependencies and the current project output into the CQ instance:<!-- Copy the required dependencies --> <plugin>   <groupId>org.apache.maven.plugins</groupId>   <artifactId>maven-dependency-plugin</artifactId>   <executions>    <execution>        ... READ MORE

Six Dimensions Supports the Apache Sling Project: Resource.hasChildren

Recently, I had the chance to shepherd a new feature into the Apache Sling API. This feature adds the method hasChildren to the Resource andResourceResolver. My colleague, Brian Warner suggested adding this method after struggling to do this in a clean, correct way.What's new? The hasChildren method is a convenient shortcut for developers to check whether or not a Resource has child resources. This method returns correctly across different Resource Providers unlike the lower-level API's such as Node.hasNodes(). ... READ MORE

The 5 Hardest AEM Concepts for New Developers

Even experienced developers struggle when trying to transition to the Adobe Experience Manager (AEM) platform (formerly Day CQ5). Once you fully grok AEM, it can be a joy to develop against; the APIs are generally straightforward and it makes presenting content easier than any other platform I have encountered. So why do so many developers have trouble ramping up on AEM?AEM turns traditional WCMS products on their head. No other CMS really works in a similar manner and developers usually struggle with getting over their pre-conceived notions of how a CMS should work.Here are some of the most common concepts in AEM which trip up many new developers.1 You are building static HTML...or at least you should be. Unlike most CMS systems, AEM comes with its own caching system, the Dispatcher. The dispatcher is an Apache Httpd ... READ MORE

6 Key Considerations in Web Content Migration

Excerpt: There will be many questions asked during a content management system (CMS) migration, but key among them is: How are we going to migrate content quickly and efficiently? This article will address some key considerations to help your content migration journey from "old" to "new" go smoother, quicker, and without loss of sleep.Click here to read the full article on ... READ MORE

New in AEM 5.6.1: Workflow Purge Scheduler

In previous versions of Adobe CQ5/AEM in order to purge old completed workflows, you needed to either write a custom job or install an additional package provided by DayCare.  Now in AEM 5.6.1, this functionality comes out of the box with the product.Why Purge Completed Workflows?So why would you want to purge completed workflows?  Workflow instances are stored as nodes inside CQ.  Generally, this doesn't pose a problem for author-generated workflows, at least not over the short and medium term.  However, for very long running CQ instances or instances where website users or automated jobs can run workflows, this can quickly add up to large amounts of content accumulating in your repository.  This can lead to slow performance and growing disk usage.To avoid this, you can simply purge old workflows.Enabling the ... READ MORE

Request cq:Components with AJAX

It's quite evident CQ utilizes AJAX frequently.If you've ever opened your network tab while using CQ you'll see asynchronous request going off here and there. When authoring new components, navigating content, developing in CRXDE lite and much more. If you're unsure what it is, AJAX let's us make asynchronous server request to content without having to do a full page reload.As a CQ developers we create may cq:Component's that are rendered with a page request but what if we want to create one that is requested via AJAX.Well why do we need to do this in CQ?Sometimes we want a sleeker and more fluid user experience and not a full page reload every time for things like search or galleries.However in a lot of cases it has to do with our Dispatch ... READ MORE

Service Boss Level Part 2: Custom Web Console Plugins

You've got your awesome service.  It performs all sorts of complex tasks and maybe even uses a Sling Service Factory to provide multiple configurations.  But how do you know what it's doing?  Well, of course you need to have appropriate logging, but another tool you can leverage is the Apache Felix Web Console, by creating a custom Web Console Plugin.  Your plugin can be accessed through Adobe CQ and Apache Sling's Web Console and can display any information you can render in HTML.Apache Felix provides a really simple class you can extend for creating custom Web Console screens, the AbstractWebConsolePlugin.  This class will automatically leverage the look and fee ... READ MORE

Service Boss Level: Service Factories

I've always wondered how the Apache Sling Logging Logger Configuration worked.  I like the idea of being able to configure multiple configuration instances through the OSGi Console and could see how this would cut down on the UI code I'd need to write in many circumstances.Since working on the Apache Sling project, I have taken the time to peruse the code for the Sling logger.  Unfortunately, the Sling logging code uses a fairly arcane method for registering the service.  After looking around a bit, I took a look at the code for the Apache Sling Job Queue Configuration, which was much easier to follow.The Sling Logger Configuration ScreenIt turns out creating, factory was easier than I suspecte ... READ MORE

My CQ JSTL/EL Best Practises

In my last article My CQ JSP Development Best Practises we solely talked about JSP related issues, one of which was the use of JSTL/EL.  Not having a reasonable approach for dealing with JSTL/EL can land you in just as much trouble as a poorly constructed JSP.  These practises should help. Variables and MethodsComparison OperatorsTagfiles vs. Classic TagsScoped variables 1) Variable and MethodsThere are two operators to address JavaBean attribute's (getXXX), List and Map values, and scoped variables. For consistency/readability, I suggest the following: Addressing Map values : Use the pattern someVa ... READ MORE

New from Apache Sling: Resource Access Tags

Recently, I had the chance to release a new version of the Sling JSP Taglib. This new version includes a large number of features and improvments which I hope will help developers in Sling-based platforms, including Adobe CQ, develop cleaner and more reusable JSP scripts. What's new? Well, the JSP Taglib allows for access to the Sling Repository without requring any Java code. With the previous version of the Sling Taglib, if you wanted to the get the property at the path jcr:content/jcr:title for all of the children of a particular resource given a path, you could do something like this: <ul> <% List<String> title = new ArrayList<String>(); Resource resource = resourceResolver.getPath(path); for(Resource child : resource.getChildren()){ if("jcr:content".equals(child.getName())){ continue; } Resource content = child.getChild("jcr:content"); if(content != null){ ValueMap contentProps = content. ... READ MORE

Six Dimensions Supports the Apache Sling Project: New Resource Access Tags

Recently, I had the chance to release a new version of the Sling JSP Taglib. This new version includes a large number of features and improvements which I hope will help developers in Sling-based platforms, including Adobe CQ, develop cleaner and more reusable JSP scripts.What's new? Well, the JSP Taglib allows for access to the Sling Repository without requiring any Java code.  With the previous version of the Sling Taglib, if you wanted to the get the property at the path jcr:content/jcr:title for all of the children of a particular resource given a path, you could do something like this:<ul> <%   List<String> title = new ArrayList<String>();   Resource resource = resourceResolver.getResource(path);   for(Resource child : resource.getChildren()){     if("jcr:content".equals(child.getName())){       continue; ... READ MORE

My CQ JSP Development Best Practises

I would guess that many or most developers in the CQ development space have their own set of development best practises they operate with.  This is a topic very near and dear to my heart.  It is something that I have spent significant personal time pursuing.  At the end of the day I want readable, maintainable, extensible, bug free code that is not a burden.I have deliberately kept the list short.  These have been primarily for personal consumption, and the key idea is that if I have to refer to a tome for my "best practises"...I won't.  So I wanted them practical, reasonable, and easy to remember.  Most of these I have operated with before I even realized that it was the way I was operating.  I believe that is what I want: I don't have to think about it.I will provide the list first, then the explanation for each.Be practical in their application.  Applying a rule for the sake of it is likely to have the reverse effect of what these best practis ... READ MORE

CQ Resource Inclusion from a Servlet

Including resources from a JSP is super simple due to the many facilities within Sling and CQ.  But what if you wanted to include a CQ resource from a custom Sling Servlet?  All of this nice JSP based inclusion is built on top of the JavaEE API.  Take a look at the class: javax.servlet.jsp.PageContext and two of it's methods: public abstract void include(String relativeUrlPath) and public JspWriter pushBody(Writer writer). These two method will form the basis for all of this inclusion business.  With a little bit of extra code, we can capture the included resource before it gets written to the current Servlets Outpu ... READ MORE

Beware of Export-Package

Quick - without checking the documentation, what does the Export-Package instruction do in the Maven Bundle Plugin?Did you say "sets what packages are exported by the bundle"?  If so, you're only half right.Recently, I was trying to diagnose some issues with a SOAP Web Services implementation in an existing code base.   Theoretically, everything was in place, however I was getting a ClassCastException when attempting to retrieve the OSGi Service for accessing the SOAP Web Service.  After staring at the logs and pulling out clumps of hair, I decided to find out where each class was coming from.  I executed the code below to get the source of the service interface class as well as the interface class implemented by the service implementation.; ... READ MORE

JVM Tuning for Mere Mortals..

.. Or:  Friends don't let friends Grok and DriveI will admit two personal things about JVM tuning: 1) I thought I was pretty hot stuff at JVM tuning 2) I was recently completely humbled and admit I was naive.On a long road trip recently driving up I95 (23 hours of driving to be exact) I listened to approximately 16+ hours of JVM tuning talks by: Gil Tene, Charlie Hunt, Attila Szegedi, and a few others.  These guys are the JVM tuning giants of the industry.  I learned a bunch from them in these terse talks - challenged by not getting lost or hitting stuff while driving.I will lay out here some practical things I learned while listening to them.  The talks I listened to ranged in time period from 2009 to present time.  What was interesting to "see" was the slow adaptation of theirs talks over time.  Mostly the same corpus of info, with slight tweaks as JVM technology has pro ... READ MORE

Ask the Experts: CQ5 Inheritance Model

In this series of blog posts we pose a question to experts in the Adobe CQ5 platform about Adobe CQ5, Enterprise Content Management and Web Development.What's the difference in CQ5's inheritance model versus standard Java?The main difference that I can think of is that in standard Java, you will write a class which inherits all the methods of a previous class. These methods can be modified and overwritten, and new methods even added to enhance functionality. In CQ, the inheritance is much more basic. It is based on JSP's - I like to compare the two by thinking of the JSP's as methods, and the components as classes. Where by default, an empty component with nothing overridden will match exactly the super resource. However, if you add a JSP to your component matching the name of the super resource, that JSP will take precedence over the super resources, allowing you to override smaller portions. - ... READ MORE

EL Function Management

In my post Tagfile vs. Tag in a Sling or CQ5 Application we created the groundwork for developing Servlet artifacts: Tag files, Classic Tags, and EL Functions.  The definition of all these items require the file taglib.tld.  This defines the URL that identifies the library via the uri in a <%@taglib prefix=".." uri=".." %> JSP statement within a JSP.  Here we address creating EL functions and managing them.Additionally, I will provide some of my thoughts on a reply from Avi in my previous post related to storage of the tagfiles themselves.I use EL functions frequently for: property fetching, I18n translation, various kinds of String translation, handling/creating XSS encoded Strings, dealing with CQ tags, etc.  An important paradigm to adhere to is that execution of ... READ MORE

Custom PredicateEvaluators or: How I Learned to Stop Worrying and Love QueryBuilder

One client's AssetShare page contains a checkbox: Needs Meta-data. Checking this box is supposed to return all assets coming from the DAM that do not have metadata. Specifically in this case we check for a particular attribute (@dc:title) that's a child of the jcr:content/metadata node.Our story begins with the following problem: checking the box wouldn't return certain assets. Upon investigation, I discovered that the one asset not returning in the query HAD an @dc:title attribute, but that this attribute was blank. It had no value.  Out comes the toolbox:Chrome's Javascript debugger, to pull querybuilder http requestshttp://localhost:4502/libs/cq/search/content/querydebug.htmland http://localhost:4502/crx/explorer/ui/search.jsp Through the course of investigating I discovered that the followi ... READ MORE

Three Commonly Missed CQ Best Practices

Recently, I saw this thread on the Day Communique Google Group.  In the thread, a developer asks why he cannot use CRXDE in their production environment.  As it turns out, his employer followed the best practices for hardening CQ instances as recommended by Adobe which disables the WebDav servlet CRXDE uses.  This thread demonstrates three common problems I've seen on CQ installations.  Especially, when the implementers of the CQ installation are not familiar with CQ and Java Development best practices.1. QA Not Matching ProductionIn this case CRXDE shouldn't work in QA either.  If the Production and QA environments don't exactly match, you can't be 100% sure your code will work on ... READ MORE

Tagfile vs. Tag in a Sling or CQ5 Application

Custom tags are cool, I guess.  The first couple I wrote were fun to write.  Kind of like driving through a new city, or part of the country.  The landscape is vibrant, new, unfamiliar, exciting.  When I came back several months later, things were just unfamiliar, and not so exciting.If you are taking the OCEJWCD test, there is no avoiding them.  However, my recommendation is, unless you are writing a Servlet framework, avoid them.  Unless you are writing them with enough frequency to remember the necessary semantics to their creation, the API, it will be a constant battle to remember what all that "stuff" does and means.Even BEFORE I started using Sling, when still writing POWA (plain old web applications), I started to move away from custom tags to tag files to simplify my mainte ... READ MORE

Simple Container Component Start & End Bars

When creating a container component for Adobe CQ, you often run into an issue where the resulting page is difficult to author as there are too many parsys adjacent to each other.  As bad as this situation is for the component developer, imagine how confusing it must be to authors who don't have a detailed understanding of how the component works.  As you can see from the illustration below of a tab component, when you have multiple parsys in a single component it can get very confusing as to what each parsys does.   My first thought in handling this was to dynamically update the empty text for the parsys based on the component name, however this proved to be difficult if not imposs ... READ MORE

Changing a CQ Component's Design Path

Usually, the default location used by the CQ Designs configuration works, however there are cases where you may want to set the designs to exist at a different location. For example, you may want multiple components to share a configuration or have all of the instances of a component on a site share the same configuration.CQ provides the EditConfig object which can be used to configure how the edit dialog is loaded in CQ.To configure your design path in Adobe CQ, first set the edit context path in the Edit Config object when in design mode:String myComponentDesignPath = currentDesign.getPath() + "/jcr:content/mycomponent";if (WCMMode.fromRequest(request) == WCMMode.DESIGN) { log.debug("Setting content path to {}", myComponentDesignPath); editContext.setContentPath(myComponentDesignPath);}Next, you will need to retrieve the r ... READ MORE

Creating Integration Tests in Apache Sling

One of the lesser known features in Apache Sling Testing Tools framework is the SlingTestBase, this class can be extended to allow you to create tests against a Sling instance which will be automatically created, started and then shut down when the tests are complete.Why Test this Way?First, you should have some form of automatic testing on your Apache Sling and Adobe CQ5 projects.  Automatic testing gives you better coverage against regression and changes breaking code and ease the burden on the testers and quality assurance teams.  Additionally, by making your code testable, you are ensuring it follows coding best practices and is well structured.So now you understand the need for testing on Sling and CQ5 ... READ MORE

Ask the Experts: MVC in Adobe CQ5

In this series of blog posts we pose a question to experts in the Adobe CQ5 platform about Adobe CQ5, Enterprise Content Management and Web Development.How does CQ5's architecture compare to a standard MVC scenario?As we all know, MVC stands for Model, View, & Controller. This is the logical separation of work into those three buckets to allow for more modular and readable code. CQ follows this model (even if you may not notice you're doing it!). In CQ, we utilize JSP and the JCR for the model, a combination of JSP and Client libs for the view, and OSGi Services for the controller.-Center of Excellence, Staff EngineerTechnically speaking, CQ5 IS MVC, just a form that seems to be unfamiliar to most MVC developers. I think that most people find CQ5's architecture "too coupled" to call it MVC. Th ... READ MORE

Creating Detailed Packages with the CQ Deploy Plugin

Sometimes you may want to create a package with more descriptive information than the CQ Deploy Plugin provides out of the box.  You may want to customize the group or add a description or even add dependencies.   This article shows you how to include Package Metadata into your package and how to deploy the package with the CQ deploy plugin.Updating the PackageIn order to do this, first install the package into CQ and update it as you desire.Updating a package in CQ 5.4Once you have completed your updates, select Rewrap to update the package configuration and then download the package.Updating the Conf ... READ MORE

CQ Stats Broken: Careful with that Extension Eugene

Before I get into the details of the problem I want to discuss, I am going to give you my personal thoughts and opinion on what I think the current state of some of the "original" CQ tracking features are.  I also want to give a plug for CQ and Adobe's approach to CQ.  I am appreciative of both.I was the Technical Lead for the second rewrite (why do it once, when you can do it twice) of the Corporate website of the company that employed me.  I am still amazed at the progress we made: 4k-5k pages, digital assets, EVERYTHING rewritten, cool features written, migrated, tested, debugged, published and soft launched in a mere 12 weeks, 8 weeks EARLY.  As much as it is a testament to our technical abilities (and long days - I slept under my desk one night - which is another story altogether), I have to admit a portion of this success stems from the logical architecture of CQ, the ease of extending OOTB components, creation of Services, and customizing just about anything.  A stark ... READ MORE

JMeter, CQ SmokeTesting, and much much more

Sometimes when trying to solve one problem, I discover the answer to another yet undiscovered problem.My pet peeve with CQ development is detecting in a semi-automated painless fashion, when templates, components or client side functionality are broken.  While JUnit integration testing catches some issues, what about "client side" integration testing?  The question is, how do you make sure the build you just pushed with Jenkins, that was green, didn't break the functionality of a component, template, service, etc?.  The interaction of classes, JSP's (page and content components), and the client.  Yes, I know there are Sling bundles to allow server side JUnit testing, and I have found a few others as well.  When you don't have any of the foundation for this kind of testing, nor the time to create it and your timeline is tight with NO wiggle room, what do you do?If you view the pages in FireFox, IE, Chrome, whatever, the effect of the last build is obvious.  OK - l ... READ MORE

My CQ5 Bookmarks

I'm pretty sparing with bookmarks, however there are a few pages I use just about every day for my job developing for Adobe CQ5.  I have these daily use bookmarks in my bookmarks toolbar.  They are:CQ ToggleActually, this is a bookmarklet, but it allows me to easily switch between editing more and a more 'real' preview mode.CQ Widgets APIA must have for dialog development.  Documents the available dialog widgets as well as the CQ JavaScript API.  Combine this with firebug and you have everything you need to develop client side code for CQ.JSTL JavaDocI'm always forgetting the attribute names when using JSLT, ver ... READ MORE

Configuring CQ for a Shared-Everything Cluster

So recently I was tasked to set up a "Shared-All" or "Shared-Everything" cluster in CQ5.5 (SP 2.1).  I found out fairly quickly that the resources online do not describe this process very well, so I figured I would share my experience with the web!For those who are unaware, the "Shared-All" configuration of CQ5 is where both the datastore and file journal are on a NAS or shared mount between all clustered servers.  The reason we went with this configuration in my situation was due to some network issues when syncronizing after a rather large deployment.  I am going to assume you have a working node of an unclustered CQ instance for these instructions to work.  Please if you do not have this, it's as simple as double-clicking the jar (or java -jar cq5.5-author-4502.jar) and waiting for the welcome splashpage to appear.Once you have a base instance we can get started, please ensure the instance not running as we will be moving and modifying configuration files from within th ... READ MORE

What is my CQ Mode?

Figuring out what is the current authoring mode in components in Adobe CQ can sometimes be a tricky prospect.  Determining the current authoring mode is important for component development when you may want to display different HTML or controls to authors than will be displayed to the end users.  As a best practice, the same interface should display in Author and Design mode, as hiding or showing components may affect design.The most obvious solution is to determining the authoring mode is to use the Java class, which does a server-side check to see what mode is currently being used.  On new projects, I add a check for the WCMMode into the project's global.jsp and populate variables for testing if in design or author mode as such:<%b ... READ MORE

Six Dimensions' Contribution to CQ 5.6

The new version of CQ5, Adobe Experience Manager 5.6, includes a contribution by Six Dimensions to the Apache Sling project.  This contribution adds a new method, getChildren to the Resource interface.  Now getChildren() in the Resource-API, available in AEM5.6 thanks to @klcodanr #sling #cq5 #aem dev ... READ MORE

Consistent and Clean Rich Text and Images in CQ5

How can you improve on the humble TextImage component; the basis for most Adobe CQ5 website implementations?  This component (as one would imagine from the name) allows authors to put both text and an image on the page.  There are both Text and Image components which are suited for each separate task, however it has always seemed silly to me to have two components when one can do both jobs.Well, one of the first tasks most projects will do is customize the TextImage component to either enable plugins in the Rich Text Editor or add some custom editing features.  Once the developers are f ... READ MORE

Sling (sort of) Requires Javax Servlet

Recently I was refactoring some Maven POM's to reduce the number of dependencies and manage the dependency version from the reactor POM.   After I removed the duplicate dependencies I ran the build and almost immediately ran into this error:[ERROR] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Compilation failure{...Class}.java:[178,50] cannot access javax.servlet.http.HttpServletRequest class file for javax.servlet.http.HttpServletRequest not found            RequestPathInfo requestInfo = httpRequest.getRequestPathInfo() ;Since the error was related to Java Servlets, I assumed it was an issue with the servlet project.  After spending time going down the rabbit hole, I noticed the error was actually coming out of another project, and being triggered by a ... READ MORE

SlingFilter Addendum

One thing to keep in mind about Filters, their removal should not render your system unusable. For example, the ICS Filter in my last article, if I remove or disable it, the ICalExportServlet continues to function (as well as the rest of CQ) without error. I would say if your application does not function without the functionality you are writing, then a Filter is probably the wrong animal for you.  You could write alot of things as Filters, but consider the last sentence when deciding.  Some good use cases for Filter usage:transforming output produced by a JSP or Servletinjecting additional request parameters or attributes into an HTTP requestinjecting additional HTTP headers or cookies into a HTTP response Another thing to consider is the amount of processing ti ... READ MORE

Sling Filter For Your Custom Calendar Event ics

Recently we added some new Calendar Event Form components.  The Author's required the ability to select a TimeZone for an event, and also and event "reminder".  Authoring these components only, don't give you the full implementation needed to have the additional content added to the ".ics" file that is generated when clicking on the "Download event as ICS file" link.This required something to be done on the back end.  My good old buddy recent requests helped me out again to identify what is fielding this request. Well, I looked at the ical stuff, and it's an embedded dependency within the bundle implementinmg the ICalExportServlet.  Thus, the ical API is not exposed to the OSGi container, and I am no fan of adding duplicate dependencies to a container.Besides, the Event Edit form already handles the TimeZone field for me, with a little help of some additional JavaScript in my component.  It adjusts the TimeZone information for me on the date fields.  Th ... READ MORE

Creating Flexible CQ5 Pages

One of Adobe's CQ5 Best Practices is to limit the number of Templates, I would suggest it is a best practice to limit the number of page components and create as many templates as necessary.Templates in Adobe CQ5 function differently than they do in many other CMS systems.  CQ Templates are placeholders for sample content and references to the component to render the sample content.  Often, projects create a 1:1 mapping between CQ Templates and the page components used to render the resulting page, but this does not need to be the case.Flexible Page ComponentsA more flexible way to create templates is to create multiple templates per page component, specifying the default components to be placed on the page.  This gives authors a sample to start with, without tying them to a particular structure.  At the sa ... READ MORE

Servlets in Sling - the case of the disappearing Servlet path

I have to admit, coming from a plain old JavaEE background, I was very dubious over the prospect of not using a Servlet path when creating custom Sling Servlets.  What - no Servlet path?  How will I access my Servlet?  New ideas always go down hard, but once I saw the light, it ALL made sense.Some folks have been evangelizing the use of Sling Servlets that are resource defined as opposed to path defined.  This idea is not new, nor was it invented or discovered by me.  What was discovered by me was why you would want to do that.  The light came on for me, and I hope this helps it turn on for you.Blinded by my JavaEE dogma, I initially failed to see the potential impact of defining a Servlet by resource rather than path.  I like familiar.  Its comfortable, predictable, I don't have to guess, it's like a close friend.  This is exactly the kind of state that Einstein described as a killer fo ... READ MORE

Protecting Packages and Replication Agents

By default, unless you are specifically blocking parts of CQ from your dispatcher, you could be exposing your Packages and Replication agents to the world.You can fix this by adding this snippet to the /filter section of your dispatcher.any file:      /0006     {         /glob "* /etc/*"         /type "deny" }     /0007     {         /glob "* /etc/clientlibs/*"         /type "allow"     }      /0008     {         /glob "* /etc/designs/*"         /type "allow"     }  It doesn't matter where ... READ MORE

END Form component is not delivered by the CQ elves...

I have long wondered how that stupid 'end' Form component shows up when you drop a 'start' Form component on a page.  Just like magic, that little bugger appears out of the ether.  The secret to this one is no longer a secret to you or me.Shame on me, and please forgive me, I did not write down the exact method I used to find this.  When I am "in the zone" hunting for something like this, shame on me, I rarely document what I did.  Maybe while writing it down here, some of it will come back.I frequently rely upon Recent Requests in the Sling console.   This one did not require my other blog post trick of increasing the recent request count.  Regardless, I cleared the recent requests, dropped the 'start' component on the page, and checked out what happened behind the scenes.  Try it yourself.You are going to see a "POST par".  Interesting.  What was it posting?  Click on that link.  About a thrid of the way down ... READ MORE

Configuring Telephone Tags within Rich Text components and the Link Checker

If you define a rich text field (xtype=richtext) in your componets dialog, if you try to enter a telephone link like<a href="tel:+13174562564">317-456-2564</a>when you try to save the content, the telephone link will be stripped out and not saved.You need to add the htmlRules and links node to your rich text field node <htmlRules jcr:primaryType="nt:unstructured">                             <links jcr:primaryType="nt:unstructured"                                     protocols="[http://,https://,ftp://,tel:,mailto:,file://]"    />              & ... READ MORE

Handling File Upload in Adobe CQ

You need to handle a file upload in Adobe CQ.  So, you notice CQ already has Apache Commons FileUpload installed, so you decide to use it to handle the file upload.You write your servlet code and end up with something like this:// Check that we have a file upload requestfinal boolean isMultipart = ServletFileUpload.isMultipartContent(request);PrintWriter out = null;try {  out = response.getWriter();  if (isMultipart) {    // Create a new file upload handler    final ServletFileUpload upload = new ServletFileUpload();    // Parse the request    final FileItemIterator iter = upload.getItemIterator(request);    while (iter.hasNext()) {      final ... READ MORE

Overriding the default damadmin or siteadmin pages in CQ5

Overriding foundation content in CQ5 was made fairly easy by our friends on the Adobe CQ team.  In the vast majority of cases, we can just replicate the path of the original code under libs to our apps folder.  In the case of siteadmin and damadmin, this would mean we need to copy the root node from the original path: /libs/wcm/core/content/damadmin or /libs/wcm/core/content/siteadmin to /apps/wcm/core/content/damadmin.  However, since these particular nodes are accessed through a vanityURL (/damadmin and /siteadmin respectively) instead of their path in the repository, there is a slightly different approach to overriding them.  Although it is still best practice to override in the same folder structure as the libs node (so you can default back to them for any un-overridden piece), there is an extra step to getting your content to actually appear when using vanity urls. This little gem of an property is called: vanityOrderOn both the damadmin and siteadmin nodes there ... READ MORE

Your Custom Namespace Retort

So - In my last article, I stuck my new Namespace in an OSGi bundle where it did not belong.  I wanted to verify the approach for adding the Namespace, and in my thinking at the time, it was the quickest location to do that.  It worked.  Great - now how do I put it in the "correct" location.You cannot simply remove the Sling Namespace metadata from the POM and redeploy.  Nope.  Still there.  What I could have done - because the Namespace would be defined somewhere - was simply define it in another OSGi bundle's POM.  But this got me thinking: what if I simply wanted to remove the Namespace altogether?  What then?  Hmmm.I actually figured this out backwards.  I identified the filesystem ... READ MORE

Fixing an out of sync CQ Cluster

Every so often a node in a CQ cluster will fall out of sync with its master.  This can happen due to a loss of network connectivity, power loss, or any number of other alternatives.  When the master and slave fall out of sync, it will be impossible to start both nodes (note start, if it was due to a network connectivity issue, it is possible that they can both remain running in a non-clustered state).  When this happens, as any server issue, first place to check is the logs.  Typically, a message like the following is displayed:*ERROR* RepositoryImpl: Failed to initialize workspace 'crx.default' (, line 540)javax.jcr.RepositoryException: Cannot instantiate persistence manager$CRXWorkspaceInfo.createPersistenceManager($CRXWorkspaceInfo.doInitialize(CRXRepositoryImpl.j ... READ MORE

Note to self: This is Mike. BAD Idea to ...

... throw your laptop through the glass block window.Yes.  I'm back at it in spades on something that should be pretty simple.  Problem is there is lots of rhetoric on how it should/could/would be done, but honestly nothing of practical use.  This was not simply 10 minutes of Googling, throw my hand up and "Ach du lieber gott!"  No no no.  My most egregious sin is once I get it in my head that it should be simple and should be done a certain way, I'm not likely to give up any easier then my dog is to give up her chew toy.What was the issue?  I simply wanted to register a new Namespace programmatically.  Simply, right?  Well, this also related to registering new Nodetypes as well as I discovered.  Pretend I never wrote that last sentence.So my main man Center of Excellence has been slogging through the Sling source (say 10 times fast please) as of late,  When I pinged h ... READ MORE

Last Chance to Register for CQ5 Personalization Webinar

Today is the last chance to register for the CQ5 Personalization webinar.  The webinar will be held today, December 12th, 2012, at 1:00PM EST (12:00 - 1:00 PM CST 10:00 - 11:0 AM PST).The fifth of ten webinar series, will explore:Strategies for Personalization in CQ5Group vs Individual PersonalizationBlueprints/Live CopyCampaigns/TeasersClick here to download/watch the webinar! ... READ MORE

2 SlingHttpServletRequests walk up to a WhiteBoard...

Recently while creating a Servlet - which I have done hundreds of times on many a CQ based projects - the Default Get Servlet was getting resolved for my request.  I added logging, made sure the SCR name property was populated, round and round I go...  Unlike Stewart the GEICO mascot, I was not yelling "Weee!"  Quite the opposite.After bugging my compadre to have an extra set of eyes on the problem, and check to see if I was missing anything, a deep dark lurking memory started to surface.  Viola - I forgot there is a new CQ feature where you  "register" your servlet paths in CQ.  I am not talking about "allow" and "deny" statements in the Dispatcher - that is something completely different.  This is a new feature in CQ 5.5.Go to the Felix Console and search for "Apache Sling Servlet / Script Resolver and Error Handler".  In this little hidden mustard seed are the keys to the Servlet kingdom.  Add your new Servlet path here, and CQ will now resolve ... READ MORE

Gotcha: Sling Servlet Requires a Name

I recently had the opportunity to delve into the code for the Sling Resources to document the @SlingServlet annotation.  One of the more interesting things I discovered was that in addition to everything stated on the Sling documentation about what is required to register a servlet, there is one additional requirement.Each Servlet which is to be created and registered, must have an unique name.  The SlingServletResolver, which handles the resolution of Servlets, generates the name based on one of the following properties (in order):sling.core.servletNamecomponent.nameservice.pidservice.idThe value of this property m ... READ MORE

New in Apache Sling: getChildren

Recently I had the pleasure of contributing to the Apache Sling project.  Among other things, I contributed a suggested improvement to have Sling Resources return an Iterable<Resource> of the child resources.  Recently, the Apache Sling released an update to the Sling API,  including an implementation of this improvement.  With the new API change, developers will be able to leverage the enhanced for-each loops available in Java 6. This will allow developers to write code like:for(Resource child : resource.getChildren(){    [... do something ...]}Which is more consise and readable than the old style using an Iterator:Iterator<Resource> children = resource.listChildren();while(children.hasNext()){    Resource child =;    [... do something ...]} ... READ MORE

Register for a Webinar on Personalizing Content with Adobe CQ5

Six Dimensions and 6D-Labs are pleased to announce the 5th in their series of CQ5 webinars: "Personalization"  This webinar will cover best practices in creating and deploying personalization strategies in Adobe CQ5.This webinar is intended for anyone with experience and exposure to CQ5 or another Web Content Management System.  This webinar will be especially helpful for teams who are planning on deploying personalized content in Adobe CQ5.When: Thursday, December 12, 2012 Time: 1:00 - 2:00 PM EST (12:00 - 1:00 PM CST 10:00 - 11:0 AM PST) Where: You'll be sent a Webinar registration upon completing the signup.Topics:The fifth of ten webinar series, will explore:Strategies for Personalization in CQ5Group vs Individual PersonalizationBlueprints/Live CopyCampaigns/Teasers ... READ MORE

Loading Classes in Adobe CQ

So you've got a problem.  You need to load a resource from the Classpath or you need to dynamically load a class and you're using Adobe CQ.  Since Adobe CQ uses an OSGi container, a regular ClassLoader will not be able to retrieve the class information from the OSGi Bundles.Never fear, Apache Sling provides the Dynamic ClassLoader Service.  This OSGi Service allows you to retrieve a ClassLoader which will allow you to interact with classes contained in OSGi Bundles.Using the ServiceUsing the service is easy, simply retrieve an instance of the service and call the method ... READ MORE

You sunk my content path!

Juggling content from environment to environment is quite frankly a pain in the butt. PROD back to QA, QA back to DEV, DEV back to my personal CQ instance. The need to be concerned with overwriting content along the way. QA people will have their environment setup for regression testing, new testing, etc. Developers will have their tests and POC's setup on their own environments and DEV. You sometimes need to move content from QA to your local to test something that's broken on QA.Sound like a big hairy mess? Well, lemme give you the clippers.What I have done is create each environment with their own "sites". DEV will have a site: /content/DEV. QA will have a site: /content/QA, and may very well have sub-sites: UAT, REGRESSION, etc... capitalization optional of course. Within DEV each developer will have their own branch beneath that: FrankZappa, EdgarVarese, JohnCage, ElizabethFraser, you get the skinny.I would suggest that content can be promoted backwards but never forwa ... READ MORE

A CQ Dev Architecture on AWS Rejoinder

Why would you spend the time creating an AWS instance?DISASTER RECOVERY.When consulting on the projects that I am assigned to, I require the security of mind that if my CQ instance dies, I have a way to rebuild it in minutes not hours.  Not just the "base install" but all of my configurations as well.  I need the complete "environment" state preserved to be potentially reconstituted at a moments notice.  This keeps the client happy, and me from losing sleep or worse.Yes, there are many was to protect your precious CQ instance from the dangers of the development cycle.  I won't list them here, and I am sure if you have used CQ for any meaningful amount of time, you have destroyed your CQ instance at least once.  It seems to me that it happens at least once per project, and pretty much inevitable.  I will say as CQ has matured, the frequency of crippling my CQ instance has decreased.  Maybe its from more experience, although I am more i ... READ MORE

CQ Dev Architecture #02 Part 01 - Create Yourself an AWS AMI

I will attempt to explain the AWS tech we are using as best I can.  However, I am not an AWS expert nor do I play one on TV.  For things such as this, my main goal is typically: "make it work".  What I am showing you is what I have been able to make work.  Not too bad for a human if I do say so myself, and I just did.As you will soon see, there are a plethora of available pre-built machine images available.  Most of them are free, but there are just as many pay-for instances.  I suggest choosing a free one.I prefer using an "empty" image because I like knowing where everything is: where and what JDK version (Sun JDK 1.6.x), Tomcat (6.0.35), etc.  You get the idea.  There is nothing worse than having to go on an easter egg hunt looking for config files, log files, etc.  If I install it, I know where it is.  If you are using the pre-built AMI's you will have to figure out their install structure and locations.Feel free to u ... READ MORE

CQ Dev Architecture #01 - We're Building What?

In this blog post, and the subsequent 6 or so we will discuss one possible way of building a complete CQ development environment, "DevOps", development architecture, or whatever moniker you prefer.  To roughly outline this a bit for you:What we are building (this post)Create yourself an AWS AMINeeded Servers and their ConfigurationIDE Setup - EclipseMaven POM creation, organization, and CQ ProjectsCI / Jenkins Setup, configuration and build projectsWhat I don't like about my setupSome of the posts I may break up into smaller pieces in order to "release" the info to you quicker.  For example, I can see breaking #3, #5, and #6 into smaller bits.  We will see when we get there.I have spent a tremendous portion of my own personal and professional time attempting to reduce the burden of the development cycle as it relates to CQ.  The IDE environment, the management of dependencies (aka classpath ... READ MORE

Captains Log, Stardate 1210.9: Where the heck are my CQ Logs

The usual way for viewing remote CQ logs seem pretty barbaric and kludgy to me.  Cat, tail, VI, less, and a partridge in a pear tree.  They all require way too many steps, especially if I am in the heat of the development cycle.  If I am leisurely browsing through the park one day trying to look at my logs, and I'm not in a hurry, they will do.  But I like the solution below because of its lower "just in time" overhead for getting at those log files.  Plus there is also the issue of dealing with the huge amount of white noise in the logfile that it deals with as well.What this isWe are configuring ssh on the remote Unix side to allow us to automatically log into that server using Putty.  We are also configuring putty to automatically execute 2 commands to: cat the error.log and then tail it for the changes.  We are also configuring putty to log all printable output to a local file.  On our local system we will use a file tail-ing applic ... READ MORE

Why does my TextImage Resource Type Keep Changing!?

On my current project, we ran into a very weird issue where the dialog kept changing when user's dragged images into the TextImage component we overrode from the foundation TextImage component.  Specifically, this only seemed to happen when user's dragged images into the component inline. After doing some investigation, I found that the sling:resourceType on the nodes was changing when the image was dragged into the component.  The culprit is the CQ Edit Configuration in the foundation TextImage component.In CQ 5.5, the TextImage component includes the ability to drag images into the component without opening the dialog.  To enable this functionality, Adobe set the parameters to send to the server when an image is dropped into a TextImage component in the CQ Edit Configuration.  One of these parameters sets the sling:resourceType to 'foundation/components/textimage'.  Thi ... READ MORE

...and now for something completely different

This will be short and sweet, and if it saves your life even once, it will be well worth it in spite of the fact that it's not CQ related.Some background.My day to day work is done on an Ubuntu 12.04 LTS x64 using ext4 for my filesystem.  This detail is important, as you will see in a minute.I had been working on Maven POM's to be used as the foundation for the project I was working on.  I had likely been working for more than a day on them, with LOTS of changes not easily reproduced.  Because this was the first week or so of development, we were not yet using any SCM.  I was troubleshooting some kind of error, and I was quickly switching between a terminal window and Eclipse.  My terminal was setup so that I could page through my previous commands with the up-arrow.  I can't even remember WHY I was deleting files.I switched to my terminal, up-arrowed to recycle an 'rm' command - removed a portion of the filename on th ... READ MORE

Use the same JSON source to create a Dialog and JSP State Selection List

So I needed to create a selection list of all the US states, as a dialog control and also as a selection list in my components JSP.So rather than hard code values in my dialog or as html <option> values, I thought it would be cleaner to use a JSON array of US state objects.I found a JSON list of US states on the web, and I modifed it to have the following structure[   {text:"Alabama", label:"Alabama",value:"AL"},... ...    {text:"Wyoming", label:"Wyoming",value:"WY"} ]and I saved it to a file called states.json, and I uploaded this file into the CQ repository at  apps/myapp/resources/json/states.jsonTo create the state selection list in my dialogue I created a cq:widget node that had the following properties ... READ MORE

Why Aren't My Public Events Working?

Creating widgets with Public Events and other widget JavaScript functionality allows for the creation of extremely powerful and user friendly dialogs.  Unfortunately, it can be difficult and frustrating to figure out what is the cause when the functions fail to work.Often, Public Events won't fire and there will be no indication in the console or errors as to why.  Here are some tips which may make it easier to figure out why your Public Event or other widget function isn't working.Missing Listener?Adobe CQ's Widget's API is a great resource for finding information on the JavaScript widgets used for creating CQ Dialogs.  Unfortunately, one fact that does not seem to be documented is, to use the Public Events, you must add the events into a subnode to the widget called listener.  Its easy to forget this and add the Public Event method's into the widget node, thi ... READ MORE

Workflow Launcher Blues

When creating workflow launchers I recently thought it a good idea to organize them within the /etc/workflow/launcher/config node by creating sub-node's to contain the customized launcher's organized by company name. Given the fact that the models support this, I figured this would be similar.  The only need, I thought, similar to the model sub-nodes is that the subnode of config would have to be of the same type as the config node itself.  With the workflow model's, it works this way. SIDE NOTE:  If I were a betting man (which I am every third year or so) I would bet that in an upcoming release they would add the ability to organize your models from the workflow console.  Right now, this is not possible.  You MUST use CRXDE Lite to accomplish this, or build it into the maven project containing your customizations.   First, I would highly recommend that custom workflow models become assets that are part of your build. Thi ... READ MORE

WYSIWYG HTML Source Editor Considered Harmful

Most Web Content Management system's Rich Text or WYSIWYG editors have an optional feature to allow authors to directly edit the HTML instead of using the WYSIWYG.  Among one of the first decisions made on a WCMS implementation project is to enable or disable this feature.  Proponents of the HTML editor argue for author flexibility and for freedom to directly enter markup.  I would argue, however, the HTML editor should not be enabled.What's Wrong with the HTML Source Editor?Allowing authors to directly edit the HTML contents of a page is a dangerous proposal; it defeats the purpose of the templating features of the WCM system, increases the complexity of supporting the system and indicates a failure of the WYSIWYG or a failure to decompose the requirements for the site.Authors Not DesignersWhen authors and Content Administrators are allowed to directly update the markup for a section, they are no longer required to follow the standards created by the templati ... READ MORE

Increasing Recent Requests in the Felix Console

I argued with myself for some time before commiting to writing this post.  Part of me thought it kind of silly to post such a thing.  Then I reflected on the hour or so I wandered around trying to figure out how to get this darned thing to do what I needed it to.  So, now you won't have to wonder how the heck to get this to work properly.  This was tested on CQ 5.5 SP1, but that does not necessarily mean it wont work on other versions as well.When reverse engineering components, one of the native Felix tools I use is the "Recent Requests" (/system/console/requests) tool in the Felix console.  The issue is that the maximum of 20 requests is frequently not enough to capture - say a form post.  Twenty requests basically showed me all of the image requests, but none of the form field requests.The "Recent Requests" tool shows information that is gathered by the Sling Engine for each individual request that is made to Sling.  Wh ... READ MORE

Releasing an Adobe CQ5 Project with Apache Maven

Apache Maven's release plugin is a powerful tool for automatically incrementing version, tagging code and creating a release. Unfortunately, this plugin is not very forgiving and doesn't do a good job of telling you what you did wrong when it fails. Setting up Maven to release your CQ5 project can seem daunting, but if you follow a few simple rules it can be easy to set up and save you a ton of time in the long run.  The following steps should help you to get your project set up to be released through Apache Maven.1. Create the Correct Folder Structure (SVN Only)Inside your source control management (SCM) system, ensure that you have your folder structure configured correctly.  You must have a folder structure like this:{repo_root}/project/trunk/project               &n ... READ MORE

Dumping CQ Configuration

Often when providing remote support, you may want to send a complete snapshot of a CQ instance's configuration and state to others to help debugging.  Generating a report of the complete status of the OSGi configuration, environment state and logs is as easy as invoking a single url. The OSGi console will generate a report of the following items when you invoke: {SERVER}:{PORT}/system/console/config/configuration-status.zipAll Log FilesWire AdminThreadsSystem PropertiesSling Thread PoolsSling SettingsSling Servlet FiltersSling Scheduler JobsSling Resource Resolver Map EntriesSling Referrer FiltersSling PropertiesSling Eventing QueueAvailable Sling AdaptorsServices & their propertiesRegistered Script EnginesCRX ConfigurationProduct/Licensing InformationPreferences/Permissions (if Available)Java Package Admin ... READ MORE

CQ5.5 OSGi (/system/console) Permissions

In the past, I've had several clients requesting access to the OSGi console, or /system/console, for users other then the built in "admin" user.  This is a fairly straightforward configuration but there is limited information about it online.  Out of the box CQ permissions unfortunately do not handle the OSGi / Felix stack.  Because of this, assigning a user to the "administrators" group in CQ is not enough to grant them access to the OSGi console.  This has its upside, though, as typically the configurations found in the OSGi Console can greatly affect how the server runs/operates it is a best practice to limit access to a handful of knowledgable users.The bundle that we need to configure has the package name of:  In the OSGi console, you can set the users by doing the following:Navigate to /system/console/configMgrClick the "edit" button next to "Apac ... READ MORE

Building a dialogue to have 2 or more images

Most of time when I build a component I only require a single image so the dialog I build will look something like this<jcr:root xmlns:cq="" xmlns:jcr="" xmlns:nt=""    jcr:primaryType="cq:TabPanel"    activeTab="{Long}0"    helpPath="en/cq/current/wcm/default_components.html#Text Image"    xtype="tabpanel">    <items jcr:primaryType="cq:WidgetCollection">        <tab1            jcr:primaryType="cq:Widget"            ddGroups="[media]"            fileNameParameter="/fileName"            fileReferenceParameter="/fileReference"      & ... READ MORE

MessageGatewayService vs MessageGateway<HtmlEmail>

When creating services which use the CQ5's MessageGateway API to send emails, it can be tempting to use the following to directly reference the MessageGateway you need in your service: @ReferenceMessageGateway<HtmlEmail> messageGateway; Unfortunately, this can cause issues as the MessageGateway will not be available if the Day CQ Mail Service is not configured.   If the Day CQ Mail Service is not configured the MessageGateway service will not be registered in OSGi.  This will mean that your component will not register properly and may cause a cascade through any Services which use your original service. The worst part is that CQ5 will not log any error m ... READ MORE

Creating a CQ 5.5.x ClientContext Compatible JSONP Servlet

The bulk of what needs to be done for creating a JSONP servlet isn't much different than creating a POJEES - 'Plain Old JavaEE Servlet'.  In fact, the servlet I created ran under Tomcat 6.0.38. So we wont cover any of the Servlet method names implemented/overridden or configuration of the Servlet. The first problem I had was figuring out what the content type should be.  This took some digging, but the following header finally got the CQ ClientContext to recognize the JSONP response: response.setContentType('application/x-javascript'); The sources I found did not all agree on a value, but this value does work. Then what I found was that when the ClientCont ... READ MORE

JVM Remote JMX Monitoring - Part 2

The last post talked to the ability to connect to a "remote" JVM, that is, a JVM not running behind a firewall.  This could either be a home or corporate network.   The key point being that all TCP/IP ports on the machine running the JVM are accessible by another machine that will be running JConsole or JVisualVM.This post, however, covers accessing a JVM behind a firewall - specifically AWS.  This means that only certain ports will be open on the "Server" machine for the "Client" machine to attach to.The problem with running a RMI server is fairly well documented, so we won't cover it here in detail.  The 2 cent tour of the issue is that when configuring the RMI port for JMX it actually uses 2 RMI ports, one port is for the RMI registry, and the other is for the RMI Objects.  The problem is the second port is selected randomly at runtime, and without the ... READ MORE

Sending Email with the Adobe CQ API

Sending emails through Adobe CQ can be easy, however there really isn't an example which brings the entire process together.  This blog post will guide you through the process of configuring Adobe CQ to send email, creating a component for sending email, creating an email template and finally creating a servlet which will send the email.First, though, what are the benefits of the Adobe CQ Email API?  The Adobe CQ API provides a method for sending emails through a centrally configured service.  You can send emails of multiple types and you can even create authorable templates so developers do not need to be involved in creating and updating email templates.Configuring CQ Mail ServiceThe first step to sending emails through Adobe CQ is to configure the Day CQ Mail Service.  To do this, log into to the OSGi Console at {server}:{port}/system/console/configMgr and look for a service called Day CQ Mail Service. Select the s ... READ MORE

Toggle CQ Author and Preview Bookmarklet

When using Adobe CQ5, you often want to be able to switch between author and preview mode.  Unfortunately, the preview included in the Sidekick does not provide a complete preview as it does not remove the Sidekick or the Content Finder.I created a bookmarklet which will switch the page between authoring mode and a preview where the Sidekick and Content Finder are removed and the WCMMode is set to disabled.  This bookmarklet preserves query string and hash values.   It has been tested in CQ 5.5 and works in FireFox and Chome.  It does not work in Internet Explorer.Adding the BookmarkletFollow these procedures to add the bookmarklet depending on your current browser.  The bookmarklet is most useful when placed in your bookmark toolbar for quick access.In FireFoxRight click on the link below and select Bookmark This Link to add the bookmarklet.In ChromeRight click on the link be ... READ MORE

JVM Remote JMX Monitoring

Setting this up will allow the use of JConsole and JVisualVM to be used for remote monitoring.Benefits: First, running these tools remotely reduces the overall CPU and memory overhead on the remote box.  Second, you do not need physical access to the system to perform monitoring.You should be sensitive to the following: security issues around allowing remote access to a JVM, and governance with IT departments to prevent too many connections to the remote JVM.  We will address the first issue in this post.  The second issue for now can only be address ... READ MORE

Calling all CQ5 Developers: OSGi v. JSPs Webinar

Do you develop components for Adobe CQ5 and wish there were a better way of abstracting your commonly used Java code?  Have you heard of OSGi, but haven't had a chance to actually implement it on your project?  Six Dimensions and 6D Lab's upcoming webinar OSGi v. JSPs, might be just the thing you need!About the WebinarThis webinar is the third in our series of CQ5 webinars and will cover best practices in developing and organizing Adobe CQ5 Components and Applications. This webinar is intended for technical audiences, and will be especially helpful for developers who are experienced with JSP component development, but are not very experienced with OSGi Service development.In the webinar, Senior CQ5 Developer Bryce Acer, will explore:Strategies for component developmentCode organization When to use Java versus JSPTime & LocationWhen: Thu ... READ MORE

Select from Pages in a CQ5 Dialog

When constructing a dialog, you may want to present users with a list of pages to select from.  Browse and path fields work well for selecting from a tree, but often you may need to show just the pages from a single folder or from some discrete list.Using the optionsProviderOne way to do this is to create a selection field and populate the value through a JavaScript function in the optionsProvider field.  This field is supposed to contain a function which gets called when the dialog loads and returns a JavaScript Array of Objects containing the data to populate the selection.Each object can have the following attributes:value - the value to save into the repositorytext - the text to display to the userqtip - hover text, extra information for the userGetting the U ... READ MORE

Announcing the Release of CQ Deploy Version 0.1.4

The Six Dimensions Labs team is proud to introduce version 0.1.4 of CQ Deploy, an Apache Maven plugin for deploying Maven projects into Adobe CQ repositories.The CQ Deploy plugin allows developers deploy CQ projects using Maven in an easy and consistant manner.  The CQ Deploy Plugin is capable of deploying both packages and bundles and is compatible with CQ 5.2-5.5.The current release, version 0.1.4 brings:Added the ability to skip the installation of bundles.Added the ability to pull the CQ5 Application name from a property called This is then used to construct the upload path for the bundes.Fixed logging around the parsing of the Access Control Handling to not log to info if no value specified.You can read more about CQ Deploy on the documentation ... READ MORE

Good to Know: InheritanceValueMap

The InheritanceValueMap is a new interface introduced in CQ 5.4.  This interface is meant to make it much easier for developers to access properties inherited from parent pages.  To do this, the interface provides two methods, getInherited(String,Class) and getInherited(String, Object), each of these methods will check for a value on the current resource and then check up the page hierarchy for another page with a value on the same content attribute.  It will only attempt to retrieve values at the same page content path Unli ... READ MORE

Introducing CQ Deploy Version 0.1.3

The Six Dimensions Labs team is proud to introduce version 0.1.3 of CQ Deploy, an Apache Maven plugin for deploying Maven projects into Adobe CQ repositories.The CQ Deploy plugin allows developers deploy CQ projects using Maven in an easy and consistant manner.  The CQ Deploy Plugin is capable of deploying both packages and bundles and is compatible with CQ 5.2-5.5.The current release, version 0.1.3 brings:Added unit tests to test failure resultsAdded support for optional install properties.Fixed issues where the legacy installer required the user to set the path or it would upload, but not install the package.Improved handling of errors when the legacy package manager installs a bundle with invalid XML.You can read more about CQ Deploy on the docume ... READ MORE

Maven CQ5 Package Build: Updating Properties.xml

This article describes the process of adding and automatically updating a CQ5 Package properties.xml as a part of a Maven build.Why do I need a Properties.xml?Certain CQ5.4 Hotfixes are known to cause issues where packages without a properties.xml will not install properly.  If you attempt to install a package into a CQ instance with the affected Hotfix, you will see this error:java.lang.NullPointerException at at at at at at ... READ MORE

Webinar: CQ5 Development Setup, Maven Build and Deployment

Six Dimensions and 6D-Labs are pleased to announce its 2nd CQ webinar "CQ5 Development Setup: Maven Build and Deployment"  This webinar will cover best practices in building and deploying CQ5 applications.This Webinar is intended for technical audiences, i.e., developers and architects who have existing experience with CQ5.When: Thursday, June 21, 2012 Time: 11:00 - 12:00 PST (1:00 - 2:00 CST 2:00 - 3:00 EST) Where: You'll be sent a Webinar registration upon completing the signup.Topics:The second of ten webinar series, will explore:Project StructureCreating a Maven ReactorCreating BundlesMulti-Project SetupsIDEs and ToolsMaven PluginsEclipse PluginsContinuous IntegrationCreating a Single PackageDeploying to CQ5 ... READ MORE

Introducing CQ Deploy Version 0.1.1

The Six Dimensions Labs team is proud to introduce version 0.1.1 of CQ Deploy, an Apache Maven plugin for deploying Maven projects into Adobe CQ repositories.The CQ Deploy plugin allows developers deploy CQ projects using Maven in an easy and consistant manner.  The CQ Deploy Plugin is capable of deploying both packages and bundles and is compatible with CQ 5.2-5.5.The current release, version 0.1.1 brings:Improved documentationImproved loggingA fix for an issue where creating new folders caused an error in CQ 5.5You can read more about CQ Deploy on the documentation website.To report any issues, or ask any questions, please create an issue. ... READ MORE

The Unofficial Guide to the Adobe CQ5 Translator

The Adobe CQ5 Translator is a powerful tool for managing and updating translations.  Using this tool you can create, update and remove i18n values across multiple languages in multiple translation dictionaries or groups of i18n keys.Using the CQ5 TranslatorTo use the CQ5 Translator access the URL http://{SERVER}:{PORT}/libs/cq/i18n/translator.html, replacing the server and port with the correct values for your environment.  This will pull up the CQ5 Translator as shown below.The CQ5 Translator The CQ5 translator allows you to manage multiple dictionaries, or sets of localized keys.  This allows you to separate out site or application level keys from system keys and keep the keys organized by function or use.  To chang ... READ MORE

CQ5 Upgrade Gotcha: Tag Localization

In CQ 5.4, Adobe added the ability to translate tags through the Tag Manager.  Unfortunately, due to the way this was implemented, it can cause issues when upgrading from CQ 5.3 or older.After performing the upgrade and importing the existing tags, you may find there are no languages available to translate the tags.  The Localization section will be visible, however no languages are available.Fortunately, the fix for this issue is easy.  Update the node at /etc/tags to have a repeating String attribute called languages with the languages in which you wish to localize the tags.  More information can be found on Adobe's documentation website: ... READ MORE

Introducing CQ Deploy: A Maven Plugin for Deploying CQ Projects

The Six Dimensions Labs team is proud to introduce CQ Deploy, an Apache Maven plugin for deploying Maven projects into Adobe CQ repositories.The CQ Deploy plugin provides two goals, to help developers deploy Maven projects:install-package This goal is used to install CQ Packages into CQ Repositories.install-bundle This gloal is used to install bundles into CQ Repositories.  This goal is different from the Maven Sling Plugin's deploy method.  Whereas the Maven Sling Plugin installs the bundle directly into the Felix application, the CQ Deploy plugin is used to upload the JAR into the CQ Application install folder and the path thereof can be configured.As the plugin deploys both Packages and Bundles in a consistant method, developers can use the CQ Deploy plugin to create a single, unified packa ... READ MORE

SCR JavaDoc Tags Deprecated in CQ 5.5

Teams migrating to Adobe CQ 5.5 have one more thing to check during the upgrade.  In CQ 5.5, the SCR JavaDoc tags are deprecated, because of this, you can no longer create bundles in CRXDE or CRXDE Lite when the code in the bundles contains SCR JavaDoc tags.  When Adobe ported CRX over to run inside of the OSGi Container, they created a bundle for the CRXDE functionality.  This includes the remote compiling and bundle builder used by CRXDE and CRXDELite.  In the bundle they set the bundle builder to create bundles using 'strict mode', this mode triggers an error when it encounters the deprecated SCR JavaDoc tags and prevents the building of the SCR Descriptor XML.  A JAR will be created, however it will not have the OSGi metadata needed to register services in OSGi. How can I tell if my project is affected?Neither C ... READ MORE

Good to Know: The Sling PersistableValueMap

The Sling ValueMap makes retrieving properties from CQ easy and removes a lot of the error-prone code you have to use when using the JCR APIs, however it does not allow setting of properties.  This unfortunately results in developers using the Sling ValueMap to retrieve properties and JCR Nodes and Properties to set properties.  This doesn't have to be the case though!  Sling also provides an interface which allows for retrieving properties like a ValueMap and an easy faculty for setting properties as well.  The PersistableValueMap differs from the ValueMap only in it's put method does not throw an exception and it offers two more methods.  The ... READ MORE

New in CQ 5.5: Sling Adapters Console

Adobe CQ 5.5 has a new, long overdue feature in the Felix Console.  The Sling Adapters Console lists all of the available Sling Adapter Factories as well as their Adapter Classes, Adaptable Classes, condition information and Providing bundle.  This information can be invaluable for developers to determine what classes can be adapted and what they can be adapted into as well as checking the functioning of custom adapters.  Developers can access this information by logging on to {CQ_SERVER}/system/console/bundles or selecting the Sling Adapters tab on the Felix Console.   The Sling Adapters Console does rely on additional metadata to retrieve the list of Adapters, so you may have to add some additional annotations to get existing cu ... READ MORE

New in CQ 5.5: Dependency Finder

Adobe just released CQ 5.5, the latest version of their flagship enterprise Web Experience Management product.  Along with a new UI, numerous speed and stability fixes and deeper integrations with Adobe's other products, CQ 5.5 comes with some new tools to make using and developing on CQ easier. One of the new tools is the Dependency Finder, which comes shipped in the Apache Felix console.  This tool can be very useful to developers to find the dependency information they need to add into their Maven POM or figure out which Bundle contains a particular class or package.  To load the Dependency Finder, login to: {HOST}/system/console/depfinder   The Dependency Finder has only one field.  In it, enter the packages or class names you want to find, separatin ... READ MORE