Tuesday, 4 October 2016

adaptTo() 2016 - Day 3

The third and final day at adaptTo() 2016. Finally the grand finale!

Session Details:
  • Managing Cloud Performance and Large Data sets by Mike Tilburg and Tom Blackford
  • OSGi R7 by Carsten Ziegeler and David Bosschaert
  • Test-driven development with AEM by Jan Wloka
  • Introduction to Sling Pipes by Nicolas Peltier
  • AC tool by Jochen Koschorke and Roland Gruber
  • APM - AEM Permission Management by Mateusz Chromiński
  • Using Thymeleaf for rendering HTML and Text in AEM 6.x by Oliver Lietz
  • Hey Sling, what are you doing? Sling Tracer to the rescue by Chetan Mehrotra
  • Apache Sling and Karaf for Web Sites and Applications by Oliver Lietz
Loved being a part of adaptTo() 2016!

Wednesday, 28 September 2016

adaptTo() 2016 Day 2

Another knowledgeable day at adaptTo() 2016 Berlin. The sessions started a bit early to accommodate all the speaker slots.

Sessions for Day 2:
  • How AEM Communities leverages and extends the power of Sling by Siddharth Palaniswami
  • Let’s run the whole Web on Apache Sling and Oak! by Bertrand Delacretaz and Chetan Mehrotra
  • Sling Http Testing Framework by Valentin Olteanu and Andrei Dulvac
  • Unit Testing with Sling & AEM Mocks by Stefan Seifert
  • Sling Context-Aware Configuration by Stefan Seifert
  • react components in AEM by Stefan Meyer
  • 0 to O(ak) in 30 by Davide Giannella
  • Playground Session featuring:
    1. Sling Core with Carsten Ziegeler & Stefan Seifert about Sling and OSGi in general 
    2. Sling Scripting with Rado Cotescu & Oliver Lietz about Sightly, Thymeleaf 
    3. DevOps with Bertrand Delacretaz & David Bosschaert & Georg Henzler about Sling/AEM Deployment and Automation 
    4. Tooling with Robert Munteanu & Oliver Lietz about Sling IDE, Karaf, Tools 
    5. Testing with Andrei Dulvac & Stefan Seifert about Integration Tests, Unit Tests, Sling Mocks
    6. JCR/Oak with Michael Dürig & Chetan Mehrotra about JCR and Oak
The playground session was indeed an amazing opportunity to get in touch with some of the great minds working on Sling, Oak, DevOps and JCR.

The event wrapped up with an awesome evening buffet and a round table conference for Sling developers.

What an eventful day indeed!

Tuesday, 27 September 2016

adaptTo() 2016 Day 1

2016 is the sixth edition of adaptTo() and this year's event is hosted at the Kulturbrauerei, Berlin, Germany.
The event primarily focuses on Apache Sling Framework, including Apache Jackrabbit and Apache Felix. Adobe Experience Manager Developers also benefit to a very high extent form this 3-day event since it covers details on how AEM is leveraging its underlying architecture.

Day 1 started with a lot of excitement. Developers and Attendees from different parts of the world gathered at the venue for this interactive community event.

Speakers got a red T-shirt and Attendees got a blue one!

Started with Opening notes from Carsten Ziegeler and Stefan Seifert followed by
  • Microservices and IoT with AEM by Carsten Zeigeler and David Bosschaert
  • Get The Flow by Conrad Wöltge and Dominik Süß
  • 5000+ unattended AEM installations in the last four years - is it DevOps? by Georg Henzler
  • Running AEM in Docker by Andrei Darashenka
  • HTL/Sightly Compilers and Tooling by Radu Cotescu
  • Sling IDE Tooling by Robert Munteanu
  • Integrating Apache Mahout with AEM by Rima Mittal and Ankit Gubrani - It was great to share our POC on the topic which can help various AEM clients with user based recommendations. Clone the code at Github.
  • Into the tar pit: a TarMK deep dive by Michael Dürig
  • Remote Resources by Vlad Bailescu

and this is how a knowledge filled Day 1 came to an end!

Looking forward to Day 2 at adaptTo() 2016!

Friday, 17 July 2015

Connecting AEM 6 with Microsoft SQL Server

Some old applications that you might want to migrate to AEM might still use SQL Server databases. Here are the steps to access an external SQL server from AEM 6:

Building the OSGI bundle for the JDBC driver:

1. Download the appropriate driver from here 
2. Unzip the downloaded driver.
3. Open eclipse indigo.
4. Click on File-> New -> Other -> Plugin from existing JAR archive 
5. Click on Add External and enter the path of the downloaded jar
6. Enter Plugin properties as shown here:
7. Observe the MANIFEST.MF, it shall look like this:
8. Save the project.
9. Right click the project --> Export --> Plug-in Development --> Deployable plug-ins and fragments
10. Choose a directory location --> Save.
11. The OSGI jar is available at the given-directory-location/plugins

Uploading the OSGI jar in felix:

1. Go to http://localhost:4502/system/console/bundles
2. Click on Install/Update
3. Upload the jar:
4. The jar should come in Active state. Look for errors in the error log if it still shows "Installed":
5. Error Log might show:
org.osgi.framework.BundleException: Unresolved constraint in bundle com.myproject.jdbc [398]: Unable to resolve 398.0: missing requirement [398.0] osgi.wiring.package; (&(osgi.wiring.package=javax.xml.transform.stream)(version>=1.3.0))
The bundle might also show unresolved dependencies:
6. Edit the MANIFEST.MF to remove the versions for resolving dependencies:
7. Re-install the bundle and it should be active now:

JDBC Connection Pool Factory config:

1. Go to http://localhost:4502/system/console/configMgr
2. click on "+" to add a configuration:
3. The configuration looks like this:

Test Connection:

1. An example code snippet for testing the connection:

Note: You might have to allow your Microsoft SQL server to accept remote connections! Please refer this

Hope this helps!!!

Monday, 18 May 2015

Hide extra component divs in CQ/AEM

This can be really tedious sometimes when, while developing a component in CQ/AEM, the extra CQ generated divs surrounding your component might disturb the HTML structure intended.

A common usecase is a carousel component in which, lets suppose, for every slide we drop in the carousel wrapper, no extra component div is required just to make sure the plugin driving the carousel runs fine.

An ideal structure would be :

If each li comes from a carousel slide component, here is what it looks like in cq:

<div class="carousel-slide"><li></li</div>
<div class="carousel-slide"><li></li</div> 
<div class="carousel-slide"><li></li</div>  
<div class="carousel-slide"><li></li</div>

This structure sometimes prevents the carousel JS plugins to stop behaving the way they should.

One of the alternatives is to use cq:noDecoration="true", but that makes the component un-editable. Neither the editconfig not the dialog is visible.
Thus, an ideal approach would be :

Just before cq including the component, add this code snippet:

                        IncludeOptions opts = IncludeOptions.getOptions(request, true);

This would require an import:
<%@ page import="com.day.cq.wcm.api.components.IncludeOptions" %>

Now cq inlcude your component, for eg:

<cq:include path="slide"> resourceType="/component/content/carousel-slide"/>

Hope this helps! 

Friday, 27 February 2015

Hide a parsys in CQ edit mode

Often, a situation is encountered in CQ where we have a number of parsys on our page and it is required to show/hide some of them on certain events. A typical use case is that of a Tabbed Component where the parsys associated with a particular tab needs to be shown only on click of that particular tab while the parsys for all the other non active tabs should be hidden.
If my parsys is wrapped by a container div something like this.
<div class="genericTabContent"><cq:include path="par" resourceType="foundation/components/parsys" />
Then, calling the .hide() method on the div doesn't hide the parsys. Rather, the parsys is visible floating somewhere on the page making the authoring experience very tough.
All attempts to hide the parsys through CSS seem to fail.
A possible solution is :
var parsysComp = CQ.WCM.getEditable("path to the parsys");
parsysComp.hide(); // makes the parsys visible
parsysComp.show(); // hides the parsys
To get the path to the parsys, the current node path can be fetched on our jsp page:
<div id="currentNodePath" class="${currentNode.path}"></div>
Once the current node path is known, this code snippet would work:
var parsysComp = CQ.WCM.getEditable(('#currentNodePath').attr('class')+"/par");
Hope this was helpful!

Wednesday, 26 November 2014

java.lang.VerifyError: Bad method call from inside of a branch

Ever encountered this kind of an error with no pages opening up in your cq instance?
Exception in thread "main" java.lang.VerifyError: Bad <init> method call from in
side of a branch
Exception Details:
tring;)V @71: invokespecial
    Error exists in the bytecode
    0000000: b800 164d 04bd 0018 5903 2b53 5910 ff12
    0000010: 04b8 001e 2a5f ab00 0000 0055 0000 0003
    0000020: aad3 b1ff 0000 0022 0000 9b75 0000 0037
    0000030: 60fa 8f17 0000 0040 5f5a 5903 3212 20b8
    0000040: 0024 c000 205f 57b7 0026 a700 2b5f 5a57
    0000050: b700 29a7 0022 5f5a 5903 3212 2bb8 0024
    0000060: c000 2b5f 57b7 002e a700 0dbb 0030 5912
    0000070: 32b7 0033 bf57 2ab6 0037 4e2d 2a5f b500
    0000080: 392d 57b1
  Stackmap Table:

        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
        at java.lang.Class.getDeclaredConstructors(Unknown Source)
        at org.codehaus.groovy.reflection.CachedClass$2$1.run(CachedClass.java:6
Well, this happens to be a problem with the JVM version.
Known versions with this problem:

1.7.0 update 55
1.7.0 update 65
1.7.0 update 67
1.8.0 update 11

Edit the start.bat and add JVM argument "-noverify" to have the code working.

The default JVM options look like this:
::* default JVM options
if not defined CQ_JVM_OPTS set CQ_JVM_OPTS=-Xmx2048m -XX:MaxPermSize=512M -noverify -Djava.awt.headless=true

Hope this helped!