Archive for July, 2010

Adobe acquires Day Software

Today, Adobe announced the acquisition of Day software. With this acquisition, Adobe will expand its enterprise software portfolio by adding Web Content Management (WCM). You can read the press release on Also, you can read Rob Tarkoff’s thoughts on our enterprise blog.

New blog for Michaël Chaize

If you want to follow one of the most creative and talented guys in the enterprise RIA game, check out Michaël’s new blog RIAgora. I know I will. 

Interesting article on HTML 5 and Flash

I just read an interesting article posted by Greg Wilson about the current debate about Flash and HTML 5. While I understand the widespread excitement about something new happening in the world of HTML (it’s been a long time coming), I am surprised by the amount of noise around how HTML 5 will be the Flash killer.  Seriously?!?! I know it’s been a long time since HTML 4, but have we all forgotten the issues around browser fragmentation and compatibility issues? With newer browsers like Chrome in addition to the fragmentation of versions of IE and Firefox for example just screams of managing multiple implementations.

Don’t get me wrong, I truly believe that HTML 5 is a great thing. The more you commoditize features, the more vendors like Adobe have to innovate. Everyone wins. HTML 5 and Flash go hand in hand like HTML 4 and Flash do today. I especially like Greg’s analogy of using Flash to replace all your <IMG/> tags. That is absurd. Just as absurd as thinking that HTML 5 will provide everything Flash can do consistently across browsers and OSes.

A generic way to use template variables in LiveCycle ES2

I saw a very interesting question on the Adobe Forums recently. Someone was asking if it was possible to use the setValue service to process a variable that was setup as a template. For those of you that are not familiar with templates in LiveCycle ES2, a template is basically a string value that has embedded xPath expressions. The idea is to have a chunk of text where some parts of it are substituted with runtime data values. Here is an example of a template:

Your name is {$/process_data/@FullName$} and your address is {$/process_data/@Address$}.

The end goal of course is for some processor to take the above template and replace the variable text {$ … $} with the actual value resolved from the xPath query.

The answer to the question of the setValue service being able to process such a template is unfortunately … no. The only way you could construct a dynamic string like this would be to use the concat() method in setValue. Sounds like a decent approach, but the problem is that if you want to change the text surrounding the dynamic values you have to touch your process map. Not so cool 🙂

My first reaction to this problem was to think of some way we could work around this limitation. What better way to implement a workaround then the executeScript service. With the executeScript service, you can write your own Java code while having access to the context of your LiveCycle ES2 process. For more information about the executeScript service, go to

OK, now I am committed to writing some Java code. No big deal. the first step is to find some effective way to parse the template string and locate the variable text blocks identified by {$ and $}. Naively, I think regex. Ugh.. regex is like black magic to me. With some help from Danny Saikaly I get some funky regex statement that seems to work and I end up with code like this:

import java.util.regex.*;

Pattern variablePattern = Pattern.compile("\\{\\$([^\\$]*)\\$\\}");
String template = patExecContext.getProcessDataStringValue("/process_data/@templateString");
Matcher variableMatcher = variablePattern.matcher(template);
StringBuffer result = new StringBuffer();
while (variableMatcher.find())
    MatchResult _match = variableMatcher.toMatchResult();
    String xPathString =;
    xPathString = xPathString.substring(xPathString.indexOf("$") + 1, xPathString.lastIndexOf("$"));
    String value = patExecContext.getProcessDataStringValue(xPathString);           
    variableMatcher.appendReplacement(result, value);

NOTE: the double slashes “\\” in the regex are used to escape special characters here because of Java.

Then Danny makes a good observation, better test this thoroughly because you want to make sure that special characters in variable names are handled correctly, etc. Of course, he’s right. So now I am starting to think… “There has to be a better way to do this!!!”

I reached out to one of the LiveCycle ES engineers, Florantin Wandeler. I tell him about what I am trying to do and he also rains on the parade (rightfully so)… “That’s nice, but what if you have embedded xPath expressions?” … Hmmm, didn’t think of that! He then puts me onto a wicked useful, but not documented built-in function called replacePathExpressions(). Of course this makes sense, LiveCycle ES2 uses templates for many services, it’s just that it’s not exposed as a generic service. Quickly, I replace the code above with this:

//Get the templateString process variable value.
String template = patExecContext.getProcessDataStringValue("/process_data/@templateString");

// Call the replacePathExpressions() method.
// It is a built-in method that will look for all {$ $} variable text and process each xPath expression and replace them in the text.
String result = patExecContext.replacePathExpressions(template);

// Now, the result string contains all of the resolved xPath statements.
// Let's set the process variable that will hold the result.


My Sessions at MAX 2010

Again this year, I will be presenting at MAX. In addition to the regular track sessions, I have signed up to host a full day pre-conference session called “Creating Enterprise RIAs: From Design to Implementation”. For the past few months, I have been running Adobe Enterprise Developer Days where we take a look at the new possibilities that are now available with the release of CS5. Using a new comer to the CS lineup – Catalyst, we can now bridge the gap between the visual designers and application developers. Catalyst is able to import visual assets from other CS tools such as Photoshop and Illustrator. Once the visual assets are imported, Catalyst can then be used to convert artwork into components – while maintaining visual fidelity!!!!


During these Adobe Enterprise Developer Days, I have been demonstrating how you can take a Photoshop PSD file with multiple layers into Catalyst and actually build a functional prototype. I won’t go into all the features here, but for a sneak peak, check out this recording of Kevin Lynch demonstrating Catalyst at the Web 2.0 conference.

Once all the interactivity is defined in Catalyst, I then import the project into Flash Builder 4. Using a wicked cool plug-in that the LiveCycle ES team has created – The LiveCycle Services Discovery Plug-in for Flash Builder, I can then wire up the project to real enterprise-class services. Trust me, this is a jaw dropper!!! And this is the reason I have agreed to do a full day pre-conference session at MAX this year. The ability to bridge the gap between the visual designers that can deliver on the requirements of usability and experience and the application developers that need to translate them into back-end transactions is invaluable. 

The other session I will be hosting is called “LiveCycle Data Services in the Cloud”. For a while now, Adobe has been working closely with Amazon’s EC2 offering to provide hosted services for our enterprise software. LiveCycle ES has been the first product line to embrace this approach. For over a year now, we have made available to our Adobe Enterprise Developer Program members as a benefit to their membership. is basically a provisioning system to enable EADP members to launch and manage their own instance of LiveCycle ES in the cloud. We have evolved this offering to support customers that whish to use LiveCycle ES in the cloud in production as a single-tenant system.  We launched Adobe LiveCycle Managed Services in January 2010. As this new offering is taking off, it just makes sense to extend the reach to LiveCycle Data Services. During my BYOL (Bring Your Own Laptop) session, I will walk through how to launch your own LCDS instance in the cloud and start building enterprise-class applications that leverage the hosted instance.

Make sure you sign up now at !


LiveCycle Workbench ES2 add-ons now available on labs.


The LiveCycle Workbench ES2 engineering team is providing existing LiveCycle ES2 customers with the opportunity to get access to new tooling features as they are being built! To get access to this new ES2 candy, navigate to


Here is an overview of what you will get in this update site ZIP file:

Variable Highlighting — The feature enables users to clearly see which variables are used for each activity that is selected on the process.

Approval Wizard — The feature enables users to design an approval task with ease of answering a few questions in a wizard.

Record & Playback shortcut — The feature allows users to start recording and open their recording from the invocation dialog.

Schema Editor — The feature enables users to use a visual editor to create schemas.

Application Filter — The feature simplifies the dialog that allows users to retrieve applications by filtering the application that already exist in their workspace.

Event Tooling — The new wizard and user interface designed for events will make creating events much easier.

Relationship Viewer — The feature allows users to see the relationship of forms to their fragments.

Type Selection Improvements — The display of the data types in the variable creation dialog has been made easier.

Server Log Viewer — Support for viewing the LiveCycle Server log in the new Workbench Server Log viewer.