Ways to access your content with JCR (part 1)

- Jörg Hoh

If you are a developer and need to work with databases, you often relay on the features your framework offers you to get your work done easily. Working directly with JDBC and SQL is not really comfortable, writing “SELECT something FROM table” with lots of constraints can be tedious …

The SQL language offers only the “select” statement to retrieve data from the database. JCR offers multiple ways to actually get access to a node:

Each of these methods serve for different purposes.

  • session.getNode(path) is used, when you know exactly the path of a node. That’s comparable to a “select * from table where path = “/content/geometrixx/en” in SQL, which is a direct lookup of a well-known node/row.
  • node.getNodes() returns all child nodes below the node. This method has no equivalent in the SQL world, because in JCR there are not only distinct and independent nodes, but nodes might have a hierarchical relation.
  • The JCR search is the equivalent of the SQL query, it can return a set of nodes. Yes, ANSI SQL 92 is much more powerful, but let’s ignore that for this article, okay?

...

----------

Read the complete post on the Things on a content management system blog.

CQ coding patterns: Sling vs JCR (part 2)

- Jörg Hoh

In the last posting I showed the benefits of Sling regarding resource access over plain JCR. But not only in resource access both frameworks offer similar functionality, but also in the important area of listening to changes in the repository. So today I want to compare JCR observation to Sling eventing.

JCR observation is a part of the JCR specification and is a very easy way to listen for changes in the repository.

@component (immediate=true, metatype=false)
@service
class Listener implements ObservationListener {

  @Reference
  SlingRepository repo;

  Session session;
  Logger log = LoggerFactory.getLogger (Listener.class);

  @activate
  protected void activate () {
    try {
      Session adminSession = repo.loginAdministrative(null);
      session = adminSession.impersonate (new SimpleCredentials("author",new char[0]));
      adminSession.logout();
      adminSession = null;
      session.getObservationManager.addEventListener( this, // listener
        NODE_CREATED|NODE_DELETED|NODE_MOVED, // eventTypes
        "/", // absPath
        true, // isDeep
        null, // uuid
        null, //nodeTypeNames
        true // noLocal
      );
    } catch (RepositoryException e) {
      log.error ("Error while registering observation", e);
    }
  }

  @deactivate
  protected void deactivate() {
    session.getObservationManager.removeListener(this);
    session.logout();
    session = null:
  }

  private handleEvents (Events events) {
    while (events.hasNext()) {
      Event e = events.next();
      … // do here your event handling
     }
  }
}

In JCR the creation of an observation listener is straight forward, also the event listening. The observation process is tied to the lifetime of the session, which is started and stopped at activation/deactivation of this sling service. This kind of implementation is a common pattern.

...

------

Read the complete blog post at  http://cqdump.wordpress.com/2012/11/13/cq-coding-patterns-sling-vs-jcr-part-2/

   

CQ5 coding patterns: Sling vs JCR (part 1)

- Jörg Hoh

CQ5 as a complex framework is built on top of various other frameworks, on the server-side the most notably ones are JCR (with its implementation Apache Jackrabbit) and Apache Sling. Both are very powerful frameworks, but both of them have some overlap in functionality:

In these 2 areas you can work with both frameworks, and achieve good results with both. So, the question is, in what situation should you prefer Sling and in what situation pure JCR.

First, and I hope you agree here, in 99% of all cases use the an abstracted framework is recommended over the use of concrete technology (everybody uses JDBC and noone a direct database interface for e.g. MySQL) . It usually offers more flexibility and an easier learning cure. Same here. While on pure JCR you only work with raw repository structures (nodes and properties), the Sling resource abstraction offers you easier handling (no need to deal with the repository exceptions any more) and much more options to interact with you business objects and services.

...

-----------

Read the complete blog post at http://cqdump.wordpress.com/2012/11/06/cq5-coding-patterns-sling-vs-jcr-part-1/

Creating MBeans for your CQ5 application

-- Jörg Hoh

JMX is the de-facto standard for monitoring java processes and applications. A lot of monitoring systems have the ability to consume these data.

By default CQ 5.5 has a number of MBeans, which offer runtime information about internal state. Most interesting ones are the MBeans about the repository state and the replication MBeans. But it isn’t hard to create your own MBeans, so you provide information about the internal state of your application to the monitoring system; or you can monitor resources which are critical to your application and use case.

In Cq5 we are working in a OSGI environment, so we will use one of my favorite patterns, the OSGI whiteboard pattern. We will use the JMX-Whiteboard bundle of the Apache Aries project to register services to JMX. Also that implementation is very short and understandable and shows the power of the whiteboard pattern. (I already had a short blog entry on this last year.)

In this example I want to demonstrate it on an already existing counter, the total number of requests handled by sling.It requires CQ 5.5, where the JMX whiteboard bundle is already deployed by default; but if you install the JMX Whiteboard bundle yourself, you can also use older versions of CQ5.

...

-----------

Read the complete post at the Things on a Content Management System blog.

Creating custom CQ email services

- Scott Macdonald

You can create a custom CQ email service that lets CQ users send email messages from a CQ web page. To create a CQ email service, you develop an OSGi bundle that uses the Java Mail API. You can also develop a JSP that uses JQuery that calls the OSGi service and passes data that is sent as an email message.

 Caption – A CQ email client

To follow along with this development article, you need to download the Java Mail API at the following URL:

http://www.oracle.com/technetwork/java/javamail/index.html

The Java Mail API is used within the OSGi bundle that sends email messages when the client initiates a request. The CQ email service comprises of a client (shown in the previous illustration) developed by using JQuery and an OSGi bundle. 

...

--------

Read the full post at Scott's Digital Community.

Basic CQ5 code examples

- Feike Visser, Technical Architect @Adobe

In this blogpost I will go through some sample code that you can use in your components, all samples are available out of the box.

So there is no need to write custom code in OSGi bundles for these samples.

Make sure you have this line at the beginning of your component:

This global.jsp defines a set of global taglibs and makes a number of objects available that you can use via.

—————

Read the complete post at the Experience Delivers blog.

Using JSONWriter objects to display Adobe CQ OSGi data

- Scott Macdonald

You can create an org.apache.sling.commons.json.io.JSONWriter instance to invoke Adobe CQ OSGi bundle operations and display data within a JSP. A JSONWriter instance lets you define value and key methods to retrieve data. You can create an Adobe CQ component that uses a JSONWriter instance to submit data to an OSGi bundle operation and get back the results. You can then display the results in a JSP. That is, you can dynamically display data based on user input.

For example, consider the OSGi bundle that uses web services to return weather information. (For information about this OSGi bundle, see  http://scottsdigitalcommunity.blogspot.ca/2012/05/creating-adobe-cq-bundles-that-consume.html.

Note: The OSGi bundle that returns weather data uses web services to expose various operations that return weather data. To follow along with this development article, you must create the weather OSGi bundle by following that article.

....

----------

Read the complete post at Scott's Digital Community.

Creating Adobe CQ bundles that consume web services

- Scott Macdonald

You can create an Adobe CQ bundle that consumes data from a third-party web service and then display the data in a web page. For example, assume that you use Adobe CQ to create a web site for a government department that tracks weather information. In this situation, you can create a CQ bundle that retrieves data from a third-party web service and display the data within a form located in a web page. The following illustration shows data being retrieved from a third-party web service and displayed in a JSP.

You can develop an OSGi bundle that contains Java proxy classes that were created by using JAX-WS or AXIS. That is, you can use a tool such as  JAX-WS to generate the Java proxy classes that are based on the WSDL of an external web service. Then you can use these Java proxy classes within your OSGi bundle.

------------

Read the complete blog post at Scott's Digital Community.

Creating an Adobe CQ web application that uses MySQL

- Scott Macdonald

You can create an Adobe CQ web application that performs database operations on a relational database. For example, you can create an Adobe CQ web application that retrieves data from MySQL and displays the data in a JSP. The following illustration shows data being retrieved from a relational database and displayed in a JSP.

You can create an OSGi bundle that can be used within the Adobe Digital Marketing Suite by using CDXDE. An OSGi bundle is essentially a Java module that contains application logic that meets your business requirements. An OSGi bundle lets you dynamically load, unload, configure, and control the Java module without restarting the server. CRXDE is the IDE that lets you develop applications for Adobe CQ (part of the Adobe Digital Marketing Suite).

The OSGi component that is created in this development article contains Java JDBC application logic that retrieves data from MySQL. (This OSGi component corresponds to the JDBC Java code shown in the previous illustration.) To keep this article simple, the MySQL database is named bank and contains a single table named user. The user table contains two fields named id and name. This development article guides you through how to create an Adobe CQ application that displays data located in the user table in a JSP.

------------

Read the complete blog post at Scott's Digital Community.

CQ Developer Tricks

- Feike Visser

While working with Adobe CQ5 every now and then you discover some new tricks or options, here the list that I use daily:

Remove #cf/

Don’t want to see/wait for the content-finder while refereshing pages, just remove #cf/ in your url.

?debug=layout

Shows you all details of the components used on your page

?debugConsole=true

Runs Firebug Lite inside your browser

?wcmmode=(edit|preview|design|disabled)

This parameter sets your WcmMode in the specified mode, makes testing for a particular WcmMode easier .

...

----------

Read the complete blog post at the Experience Delivers blog.