Craig’s Musings

Thoughts about software architecture, books and life

...down the tracks...

Adobe, Customer Experience Management and Day Software

July 27th, 2010 · CMIS, Content management, Inspiration, Open source, RIA, Uncategorized

Adobe has just announced a definitive agreement stipulating its intent to acquire Day Software. This acquisition will bolster Adobe’s leadership in Customer Experience Management, bringing Day’s industry-leading Web Content Management, Digital Asset Management and Social Collaboration applications, better known collectively as CQ, and Web scale content application infrastructure (CRX) together with Adobe’s LiveCycle, Connect and other enterprise software offerings–not to mention Adobe’s Flash Platform and industry-leading tools for creative professionals.

There is plenty to talk about in terms of how deeply aligned this acquisition is architecturally, technically and in terms of shared vision, and I plan to use this space to go into more of these details over time (e.g. synergies between Day’s targeting and optimization and Adobe Omniture‘s capabilities). However, I’m equally excited by the people involved here.

I’m looking forward to shortly being able to call folks like David Nuescheler, Kevin Cochrane and Roy T. Fielding not just industry colleagues but fellow Adobe employees. Welcome to Adobe, Day Software!

For more on Adobe’s approach to superior customer experience, I encourage you to subscribe to experiencedelivers.com and/or follow @AdobeCEM.

Update 7/28/2010: The Web is all a-buzz about this acquisition, and I would say it’s with good reason. Simply put: customer experience wins and therefore customers win, which means that businesses embracing Adobe CEM increase their own profitability.

Since my brief post above, Adobe has posted a press release and FAQ about the acquisition. Rob Tarkoff, SVP and GM of Adobe’s Digital Enterprise Solutions Business Unit (or DESBU) has also posted his thoughts, offering some key takeaways to consider from this acquisition.

→ No CommentsTags:···········

Understanding LiveCycle ES2′s application model

May 19th, 2010 · Adobe, Content management, LiveCycle, Services, Technology

Note: If you’re visiting this blog from the Adobe LiveCycle Developer Center or from the Adobe LiveCycle Blog, welcome to my musings. You’re invited to tell me what you want to know about LiveCycle via a comment. Thanks in advance! :-)

This longer-than-usual post is intended to help customers understand why the new application model exists in LiveCycle ES2 and understand how to migrate LiveCycle ES assets into ES2 assets, based on business value into doing so. It is meant to complement, not reiterate, other content already published concerning the application model (e.g. the section on migration process, below, is just an example meant to whet the reader’s appetite for more detailed demonstration/conversation elsewhere).

So, without further ado…

Table of contents:

  1. Introduction
  2. Application model principles
  3. Conclusion
  4. Additional resources

Introduction

When Adobe LiveCycle ES2 released, major advancements and changes occurred in several areas of application development. The purpose of this white paper is to explain these advances specifically in the context of migrating existing LiveCycle assets into the new ES2 application model. However, before the migration process is described step by step, it’s important to understand the new model, why it is exists and when it should be leveraged.

The most notable changes to application development in LiveCycle ES2 are as follows:

  • LiveCycle Applications
  • Versioning
  • Far and Near References

All new development work in LiveCycle ES2 occurs in LiveCycle Applications.[1] A new Applications view replaces the Processes and Resources views in LiveCycle Workbench ES2 as the primary view for application development. Both Processes and Resources views remain to support upgraded LiveCycle assets that have not yet been migrated to LiveCycle Applications.

LiveCycle Applications contain processes, forms, guides, data models, events, fragments, images, DDX files (Assembler document service), DSC’s, etc.[2] A LiveCycle Application is a container of design-time assets. When a LiveCycle Application is deployed, services are delivered into the runtime, and at this point a particular service’s implementation becomes hidden from the consumer (e.g. there is no “File | New -> Service” that emits a service object in LiveCycle). Consumers continue to discover services via the LiveCycle Service Registry.

It is important to understand that from now on when you do something in Workbench the first thing you do is “File | New -> LiveCycle Application” and that the Application is the container for all your application assets.

A LiveCycle Application is the basis for a hardened, discrete versioning model in LiveCycle ES2. That is, application assets do not have versions of their own; they inherit the version of their parent LiveCycle Application. These version numbers are immutable, meaning that they do not change even when the application is deployed on different LiveCycle systems. In LiveCycle ES an edit/save gesture on an application assert could result in the creation of a new version of that asset; however, in LiveCycle ES2 such gestures will not–version is defined solely by the hosting application.

A LiveCycle Application is the context for how asset references are maintained. An asset referring to another asset in the same LiveCycle Application uses a relative near reference. When an asset refers to an asset in a different LiveCycle Application then it is a far reference. Far references are required to state LiveCycle Application name and version (e.g. repository:///Applications/NewCustomers/1.0/Loan/Forms/request.xdp).

Applications, assets and references
Figure 1. Applications, Assets and References

In the above figure, there are two applications (i.e. App1 and App2) and a total of three application assets (i.e. A, B and C). The line between A and B represents a near reference (i.e. wholly contained by App1). The line between A and C represents a far reference (i.e. a reference that spans from one application to another application–specific version).

In the above figure, App1 and App2 can be versioned (i.e. 1.0, 1.1, 2.0, etc.); however, A, B and C cannot be versioned apart from their containing LiveCycle Application.

Application Model Principles

So, why did LiveCycle ES2 usher in a new application model, and why should you want to upgrade to leveraging it?

In LiveCycle ES, there were services/processes, events, forms and Document Service Components (DSCs). Each object had distinct user interface with different semantics for how the object could be edited, locked, activated, secured, versioned and exported. Conceptual information that the user acquired while using one subsystem was not transferable to the other subsystems. One of the design goals of the LiveCycle ES2 application model was to normalize these behaviors and provide a consistent user model across the managed objects.

The LiveCycle ES2 application model provides hooks at strategic points in an asset’s runtime. The ability to transactionally deploy a collection of assets and the ability to intercept the runtime lookup of a named asset both represent key indirection points that can be leveraged in future versions of LiveCycle.

The LiveCycle ES2 application model enforces a consistent persistence model for the design-time assets. This, in turn, provides the foundation for supporting disconnected mode (offline or occasional connectivity), SCM integration and intuitive experience in Workbench (e.g. login/logout, open/save).

Your confidence during migration is of utmost importance. The LiveCycle ES2 application model addresses migration confidence by enabling existing investments to continue running in a “bug compatible” manner. Maintenance of existing systems can involve evolving an existing system on an as-needed basis.

The application model in ES2 supports two types of changes: semantic and non-semantic. Given that an application is a composition of assets, change can refer to the set of assets in the application and/or to the assets themselves—both their content and their associated metadata.

A non-semantic change represents an update that does not provide any new functionality over prior versions but rather represents an incremental refinement. Bug fixes and patches are good examples for a non-semantic change. A non-semantic change never requires consumers to be aware of the change. Non-semantic changes can be imposed by the producer on all of its consumers without requiring the participation of the consumer.

A semantic change represents an update that will introduce new capability above what is available in pre-existing versions. It is possible that a semantic change will necessitate that the consumers adjust the way that they interact with the objects. A semantic change must be explicitly requested by consumers, it is never implicitly forced upon them by the producer.

Example migration to ES2 application model

So, now that you have a better understanding of a LiveCycle Application and the new application model in LiveCycle ES2, let’s walk through the process of migrating a LiveCycle ES (8.x) process to a LiveCycle ES2 (9.x) process:

  1. Deploy the LiveCycle ES LCA as LiveCycle Archives (8.x) (Compatibility mode).
    • The LiveCycle ES processes will run as-is on LiveCycle ES2 as LiveCycle is backward-compatible. If your goal is to simply move the running content to an ES2-based server (without taking advantage of any new capabilities) you are done.
    • If you want to leverage native ES2 functionality, you will need to follow the rest of these migration steps in order to convert the LiveCycle ES process to LiveCycle ES2 process. Converting the process will result in a service name change since the LiveCycle Application name (namespace), version, etc. become part of the service name in LiveCycle ES2.
    • Best practice: If you are adding new resources to the application the recommendation would be to do a full migration and import all assets into the new application, resetting the deployment identifiers. Mixing and matching legacy ES resources and the new ES2 application model is not recommended.
  2. In Workbench, create a new application (e.g. MyApplication).
    • Application name forms a namespace for assets therein.
    • You can optionally create folders within the application to specialize this namespace further.
    • For example, your development team may have particular standards for organization (e.g. based on asset type, based along functional lines, etc.).
    • In this particular migration, we’ll create a “processes” folder to receive the imported ES process assets.
  3. In Workbench, right-click on MyApplication/1.0/processes and select Import. In the dialog shown, select Process and click Next. In the next screen, select the LiveCycle ES process from its LiveCycle ES category. Click Finish.
  4. The LiveCycle ES process will be added to the LiveCycle Application (i.e. MyApplication). Please note that this is a copy of the original process.
    • The service name of original process is the process name itself; however, the service name of the new process is ApplicationName/processes/ProcessName.
    • Assets in ES lived apart from a namespace (i.e. unqualified services at runtime). ES assets in ES2 operate in a global service namespace (implied) at runtime. Native ES2 assets operate in application-scoped namespaces.
  5. If the original LiveCycle ES process has dependencies on other LiveCycle ES sub-processes, the new LiveCycle ES2 process will also have the same dependencies (i.e. LiveCycle ES2 process depending on LiveCycle ES processes). Therefore, in order to create a self-sufficient LiveCycle ES2 LCA containing processes with the same functionality, we need to identify and reset these dependencies. That means finding each dependency, visiting it and pointing it to something new.
    • In order to point a dependency at something new, the desired dependency target must exist in the application.
    • Best practice: create self-contained applications.
  6. To remove dependencies from other LiveCycle ES processes, we’ll have to repeat steps #3 to #4 and import all those processes under the same LiveCycle Application (e.g. ApplicationName/processes/SubprocessName).
  7. After importing all processes under the LiveCycle Application, we’ll have to edit all the processes individually in order to replace all the sub-process activity with the new processes.
    • Consider the following example: Process A uses process B (LiveCycle ES).
      • Both ES processes are imported into the LiveCycle Application, which results in processes A’ and B’ (LiveCycle ES2).
      • However, process A’ (LiveCycle ES2) still uses process B (LiveCycle ES).
      • We edit A’ and replace activity B with B’, using the same input/output parameters.
    • This step requires manual editing of all processes using sub-processes, which is time-consuming and can be error-prone without sufficient attention to detail.

This example is simply focused on process asset migration, but, as previously noted, there are several other application asset types that may be migrated.

Conclusion

Hopefully this paper has been helpful to your understanding of why there is a new application model in LiveCycle ES2 and how to take advantage of this capability with your LiveCycle ES investments in mind.

The LiveCycle team continues to work on enhancing migration support for its customers (e.g. increased automation), and it appreciates your feedback.

Additional Resources

For a more detailed dive into the process of migrating LiveCycle ES applications and assets to LiveCycle ES2, please consider the following content:

Footnotes

  1. LiveCycle Application should not be confused with LCA, which stands for LiveCycle Archive. LiveCycle Archives continue to provide the ability to export an application along with its assets (i.e. variables, images, documents, etc. since ES, service endpoint configuration and security since ES Update 1, etc.). Asides: (a) legacy LCA’s are still supported in ES2 (i.e. it’s possible to create/import them), and (b) there are two kinds of native ES2 LCA’s: patch (a specifically selected set of assets) and full (one or more applications where all content from the application is involved–no need to explicitly enumerate assets).
  2. These contained objects are called assets (i.e. application assets).

→ No CommentsTags:··········

Adobe Community Action Week – RAFT

May 14th, 2010 · Adobe, Inspiration, Life

This week has been Adobe Community Action Week for Adobe employees globally. On Monday, I mentioned that I was looking forward to my particular action choice: RAFT. Today I had the privilege of serving local teachers with members of my team (LiveCycle) along with others from Adobe by investing time and energy into RAFT (Resource Area for Teachers).

Adobe at RAFT

RAFT provides thousands of Bay Area teachers and community groups with a wide range of interactive learning materials, enhancing math, science, technology and art programs. Materials are surplus items donated by over 1,000 local businesses and range from cardboard tubes to computers!

My Mom was a middle-school teacher for 16 years; so I know firsthand how great an impact teachers have on the lives of their students, yet how underappreciated teachers often are in broader society. So, it felt especially good to “give back” to such important individuals in the local community.

Adobe at RAFT

There were about 50 volunteers altogether and together, in just a few hours, we were able to make a significant contribution in the assembly of various kits that will be used by local teachers (e.g. glove-a-phone packs, sticker packs, etc.).

Adobe at RAFT

I was drawn, along with my project-teammates, to the adhesive paper station. Basically our task was to unroll, about 12 feet at a time, lengths of two foot wide adhesive backed white butcher paper, rolled up and rubber-banded for individual application by teachers. A full roll of this paper weighs about 350 pounds, and we proved this by finishing the better part of one roll and starting on a second, new roll before our time ran out. The photo above captures the state of the receiving bin for these individual rolls before we started with our contribution.

Adobe at RAFT

Adobe at RAFT

There were roughly four distinct tasks involved, although some of us on the team (ahem) were a bit more creative about “tasks.” :-) Unrolling was easily the most strenuous; cutting; re-rolling and rubber-banding; binning.

Adobe at RAFT

Adobe at RAFT

Adobe at RAFT

Adobe at RAFT

It may not seem like much, but when you compare the previous two images with the first bin capture, above, I’d say that we accomplished a fair bit of work. It’s fun to think about all the classroom projects that were enabled in the process, too!

Adobe at RAFT

Acts of service are always more rewarding to those who serve, and today’s experience at RAFT was no exception.

If you’re a teacher and can make your way to Sunnyvale, you should really check out RAFT. If you’re a parent of a student whose teacher can get to RAFT, consider giving a RAFT gift card. If you want to make an impact on Bay Area teachers, volunteer your time and energy at RAFT. You’ll be glad that you did!

→ No CommentsTags:·····

Rich Internet Applications

December 29th, 2009 · Adobe, Inspiration, LiveCycle, RIA, Smart clients

During the MAX 2009 conference, Duane Nickull was interviewed by DZone on the subject of RIA architectures. As an architect, I appreciated Duane’s comments about the responsibility of architects, versus developers, where RIAs are concerned (e.g. focusing on and valuing interaction design and user experience, distilling key business requirements by working closely with those the RIA will serve, being mindful of the framing process-oriented context, etc.).

In particular, don’t frustrate users resonates with me (e.g. it’s a non-technical answer to “what is an RIA?” (or “reeyah”). Duane’s Revenue Canada example (or not “getting” this) is a good one. It just so happens that I encountered my own today…

First, two exhibits off Twitter:

Don’t get me wrong, more vendors need to be reaching out and engaging with their communities in deep and meaningful ways. So, I’m not suggesting that creating a forum for community discussion is bad. However…

What if, instead, the forum was seeded (pre-launch) by a reasonable distillation of those who’ve already voiced their concerns, like Pie? The Web is there to be culled–”listened to” if you will–you just need to mine it.

As Duane and his co-authors talk about in Web 2.0 Architectures, more and more of us are living declaratively. Certainly this is true when it comes to providing candid feedback and standing behind things we believe in (e.g. vendors we want to succeed…and those we don’t).

So, an alternative forum post could have listed Pie’s identity management feedback alongside the feedback of others–fully annotated with community profiles, source links, etc. Of course, those supporting the forum could proactively reach out to folks like Pie to confirm that discovered feedback is appropriate for syndication and could enable contributors to easily follow the conversation moving forward–ideally in the medium of their choice (e.g. email, feed, etc.).

Update 12/29/2009: Of course, Pie, being the strong advocate he is, reached out again and updated the forum post himself. :-)

→ No CommentsTags:···

Submitting VMware Workstation 7 to install

November 29th, 2009 · Development Toolbox, Technology

Roughly a month ago, VMware released a new major version of its Workstation (and Fusion) software (i.e. 7.0 (and 3.0, respectively)). So, it seemed like a good time to upgrade from version 6.5.3. Past protocol suggested the following approach: uninstall old, reboot, and install new. Unfortunately, and unexpectedly, this approach failed to result in an up-to-date Workstation installation.

Shortly after launching VMware-workstation-full-7.0.0-203739.exe, the installer presented:

(Version: )

Clicking the Uninstall button resulted in a second cryptic dialog being presented:

The MSI '' failed.

“The MSI ” failed.” seems to be a fairly unique phrase, especially when combined with VMware, etc.; so, I Googled to see what others had encountered. Suffice it to say that I found nothing that ultimately solved my installation issue–although I was able to reclaim over 9 GB of free space by running CCleaner, thanks to one post.

So, I confirmed that my host operating system is supported by VMware Workstation 7.0. I further confirmed that my Windows file system and registry were both clean of VMware-related content–rebooting after this confirmation. Nada.

Sometimes I’ve seen installers insist on being the party to uninstall older software. Since I’d uninstalled VMware Workstation 6.5.3 myself, I tried to reinstall the older software, reboot my host OS, and retry installing VMware Workstation 7.0:

6.5.3 install-uninstall

In hindsight, I could have seen that this wouldn’t resolve anything, but I clicked Uninstall as before…only to end up with the failed mystery MSI dialog once more.

So, I tracked down where VMware Workstation 7 wrote its installation logs: %TEMP%\vmware_*.log. I re-ran the installer to arrive back at the top state above, allowing me to recognize the associated log file and examine its state at the point of presenting the uninstall panel:

20091128194313:INFO    CGetMSIStateOperation::Execute: Examining the system for VMware Workstation.msi
20091128194313:INFO    CGetMSIStateOperation::Execute: MSI Data ProductCode: {A3FF5CB2-FB35-4658-8751-9EDE1D65B3AA}, PackageCode: {CDA82EA5-329A-428D-8ED3-9857244767DE}, UpgradeCode: {14F539F3-C4A4-4597-A29D-8C1D753ACC93} , Version: 7.0.0.9911
20091128194313:ERROR** CGetMSIStateOperation::GetSysVersionString: ::MsiGetProductInfo failed to retrieve the version string for {{98D1A713-438C-4A23-8AB6-41B37C4A2D47}} due to error: 1605
20091128194313:INFO    CGetMSIStateOperation::Execute: Installed MSI Data ProductCode: {98D1A713-438C-4A23-8AB6-41B37C4A2D47}, Version:
20091128194313:INFO    CGetMSIStateOperation::Execute: Default MSI Action: upgrade, Details: cross product
20091128194313:INFO    CBootstrapCmd::RunOperation: Operation 'GetMSIState' completed successfully with return code 65539
20091128194313:INFO    upgrade
20091128194313:INFO    cross product
20091128194313:INFO    CGetMSIStateOperation::Execute: Examining the system for
20091128194313:INFO    CGetMSIStateOperation::Execute: MSI Data ProductCode: {233A935E-6132-48B2-840F-37C9D32555D5}, PackageCode: {46F73961-902A-4A20-BB36-5060DC6ACB2C}, UpgradeCode: {2A0F937B-3E75-47D8-9306-14D45CC0F756} , Version: 4.0.0.0
20091128194313:INFO    CGetMSIStateOperation::Execute: Default MSI Action: install, Details:
20091128194313:INFO    CBootstrapCmd::RunOperation: Operation 'GetMSIState' completed successfully with return code 65539
20091128194313:INFO    install
20091128194313:INFO    SaveSetting: Wrote setting 'action', value 'upgrade'
20091128194313:INFO
20091128194313:INFO
20091128194313:INFO    {98D1A713-438C-4A23-8AB6-41B37C4A2D47}
20091128194313:INFO    SaveSetting: Wrote setting '{98D1A713-438C-4A23-8AB6-41B37C4A2D47}', value ';'
20091128194313:INFO    {98D1A713-438C-4A23-8AB6-41B37C4A2D47}

Right away, I could see that the installer was recognizing an unexpected upgrade state rather than the expected “fresh” install state. Fortunately, the log also captured more details behind this divergent recognition: “failed to retrieve the version string for {{98D1A713-438C-4A23-8AB6-41B37C4A2D47}} due to error: 1605.” First of all, this log statement is a bit of an oxymoron, since Windows error code 1605 (ERROR_UNKNOWN_PRODUCT) means “This action is only valid for products that are currently installed.” That is, if the product isn’t installed, then shouldn’t the current installer be “happy?” Second, this error led to the sparse dialogs (i.e. ” (Version: )” and “The MSI ”failed.”).

1605 redux

Again in hindsight, I could have Googled the suspect GUID to determine its relationship with VMware Workstation 5.5. However, I went back to my Windows Registry to perform additional forensics first. The first RegDB reference I found is associated with Windows’ ARP Cache, which has to do with Windows’ TCP/IP stack (i.e. needs to be left intact). I did find another RegDB key, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders, with a value named C:\WINDOWS\Installer\{98D1A713-438C-4A23-8AB6-41B37C4A2D47}\, which I removed. Nevertheless, after rebooting, I was still unable to install VMware Workstation 7.0

So, I thought that if my 6.5.3-based hack appeared to have some merit, perhaps a similar, 5.5-based hack could, too. First I had to download the 5.5.9 installer and unearth my version 5.5 license key. With these in hand, I installed VMware Workstation 5.5.9 and then rebooted my host OS as directed.

Following reboot, I re-ran the VMware Workstation 7.0 installer, yet again:

5.5.9 install-uninstall

This time, after clicking Uninstall, I was eventually presented with the ability to proceed with installing the new software. After choosing to reboot at the end of the installation process and rebooting, I’m able to run VMware Workstation 7 as I originally expected.

Hopefully this knowledge sharing will help you to avoid the wasted time and energy I experienced. At least that’s my purpose in posting. Cheers…

→ 10 CommentsTags:···