Author: Jeff Potts

Review: Professional Alfresco, Wrox

I recently finished reading Professional Alfresco, the new Alfresco book written by some of the Alfresco engineers and John Newton, Alfresco’s CTO. Before I share my thoughts, a few disclaimers: First, I wrote my own book on Alfresco called the Alfresco Developer Guide (Packt, 2008). Second, Wrox provided the book to me free of charge in the hopes that I’d write something about it here. Third, I have a strategic relationship with Alfresco, part of which includes bringing each other business.

Okay, with that out of the way, let’s get to it. Professional Alfresco is a new book written about Alfresco 3.2 by a team of authors with a unique insider perspective: all are Alfresco employees. It’s not an end-user focused book nor is it strictly for developers–it’s actually aimed at several different audiences:

  • Part 1, “Getting to Know Alfresco”, is aimed at IT managers or other folks who might be evaluating Alfresco. It covers the business benefits of Alfresco and provides a high-level overview of the platform.
  • Part 2, “Getting Technical”, looks at the platform’s components and services at a closer level. These chapters are directed at Technical Architects or anyone who’s trying to figure out the technical capabilities of Alfresco.
  • Parts 3 & 4 are aimed squarely at Developers. More specifically, these 6 chapters cover Web Scripts (primarily JavaScript, but a Java example is given) and Alfresco Share. The last 3 chapters of Part 4 provide a step-by-step example of building a Knowledgebase application by customizing Alfresco Share, including a few (brief) pages on the new Form Service. A lot of people are working on Share customization projects these days so many will find this a welcome set of material.

While the majority of the technical how-to in the book is focused on Web Scripts and Share, I particularly liked the chapter on Advanced Workflows. It did a good job of explaining what you can do with the jBPM engine without getting too far into the weeds. The section on the Authentication subsystem, LDAP config, and chaining was also very good, particularly as the subsystem setup is a fairly recent development that not everyone is familiar with.

While I did find a lot to like about the book, there were a few things to pick on. First, if you read the book front-to-back, you’ll notice a significant amount of repetition. I suppose that could be a good thing when one of the three audiences the book is written for picks up the book and goes directly to their area of interest. I wonder, though, if some of it was due to having so many authors collaborating on the writing project. The repetition left me feeling like I was really slogging through the material rather than cutting to the chase.

I thought the content modeling chapter was thorough, but I had to wonder why the author chose to step us through the modelSchema.xsd file instead of providing example content model XML. It’s good to know the content model schema is there if I need it, but I think examples of what I can do with the XML are far more illustrative than walking through the schema.

The form service and Share/Surf aren’t covered in nearly enough detail. Other aspects of the platform simply aren’t addressed at all. I think some of that may be because of timing. The form service, for example, continues to evolve with version 3.3, and when you undertake a project this big, you have to draw a line somewhere. Plus, the focus on web scripts and Share is aligned with where Alfresco is focused right now.

The organization of the book is good. It follows a logical progression through the platform. And I like that the end-to-end Knowledgebase example is placed at the end as a sort of capstone applying the concepts learned earlier in the book. If you’re looking for a tutorial-style book though, you may be frustrated by the amount of theory up-front. It’s just not that kind of book. One side note on organization, Chapter 17 is a bit of an odd duck. It’s got interesting content–the chapter discusses various patterns of Alfresco implementation and integration with other systems. I just thought it was weird that it was at the end of the book instead of in one of the first two parts. Not a huge deal, and I’m glad they included it, even if its placement makes it seem like an after-thought.

Overall, Professional Alfresco is a good book appropriate to several different types of readers. Even though there were several authors that wrote it, other than the repetition issue I noted, I didn’t feel like the transitions between authors were very noticeable–the editors did a great job stitching everything together and making it seem like one voice.

The bottom line is that if you are evaluating Alfresco and are trying to understand the architecture of the platform, or if you are a developer focused on web scripts and Share, you’ll find this book to be a valuable resource.

Custom Data Lists in Alfresco Share Community 3.3

One of the new features of Alfresco 3.3 Community is Data Lists. The ability to create an arbitrary list within a team collaboration site is a feature so loved by SharePoint users, it is often cited as one of the things holding back a migration to Alfresco. I agree that it’s a useful feature and I’m glad to see it making its way into Alfresco Share. Let’s take a look at the new feature, then we’ll lift up the hood to see how it works so you can implement your own custom data lists.

Quick Review of Data Lists in Alfresco Share

First, take a look at this screencast. It shows the new Data List feature in action as well as the high-level steps needed to create your own custom Data Lists.

As you can see, Data Lists let you keep track of team information that lends itself to being managed by classic web form interactions and displayed in sortable columns. You can probably think of a lot of examples of things your team needs to track that don’t make sense in a blog or a document library or maybe need a little more structure than the wiki. The screencast showed To Do’s and Issues but it could really be anything.

In the Community 3.3 releases, Alfresco Share includes To Do Lists. It sounds like more Data List examples are coming in the 3.3g release. But if you want to add your own custom data list type, it’s really easy, especially if you’re familiar with Alfresco content models (tutorial). However, right now, this still requires XML editing. SharePoint allows lists to be defined on-the-fly, so while Alfresco’s roadmap does have this as something to address in the future, right now this is still a gap between the two products.

If you are interested in just the end-user functionality of Data Lists in Alfresco Share, this is where you should bail. If you want details on what’s going on behind the scenes, keep reading…

How Data Lists are Implemented

Data Lists are persisted as nodes in the repository. One node represents the list itself–it contains child nodes for each item in the list. The data values for each list item are stored as metadata on the node–sometimes we call these “content-less objects” because there is no file content associated with them. The nodes live in the DM repository just like data from the other tools in your Share site.

If you want to see this for yourself, go into the Explorer Client. In the Sites folder, there is a folder for Share site and within that, a folder for each site tool. Data List nodes reside in the one called dataLists. In the back of your mind you should be thinking that this means items in a Data List can trigger rules and be routed through workflows just like any other node. In fact, any API call that can work with a node can work with an entry in a Data List, including CMIS. (Shameless plug: “Heck, you could even create Data Lists with Python using cmislib!”)

You know from working with data models that each Alfresco data model has an XML file that describes it. If you go look at the out-of-the-box model directory you’ll see a new content model XML file called datalistModel.xml. If you take a look at that file, you’ll see that the node that represents the container of list items is an instance of dl:dataList which inherits from cm:folder.

The nodes that represent each item on the data list are instances of specific data list types. So, for example, the out-of-the-box To Do List has items that are of type dl:todoList. In my Issues example, Issue items are instances of scidl:issuesList. All data list item types must inherit from dl:dataListItem. For one thing, that’s how the Share user interface knows what to offer as an available data list type.

The form that’s displayed when you create and edit new Data List items is configured through the Alfresco Form Service. In my example I didn’t do anything fancy with the form, but you’ve got the full power of the new Alfresco Form Service behind you so you’re not limited to simply listing one field after another.

So, creating your own custom Data List types involves two steps:

  1. Define and deploy a custom content model for your new Data List type, making sure it inherits from dl:dataListItem.
  2. Configure the Alfresco Form Service in the Alfresco Share application to display the metadata from the custom Data List in the create and edit forms as well as in the browse grid.

In my example, I used an AMP to deploy the content model to the repository tier (my Alfresco WAR) and a JAR to deploy the form service configuration to the presentation tier (the Share WAR).

If you want to try this example in your own environment, you can download the Eclipse project here. It includes an Ant build file, the content model, and the form configuration. Note that I deployed the Forms Development Kit to both the Alfresco and Share WARs prior to deploying my Data List form configuration. The example assumes you’ve done the same. If you don’t want to fool with the FDK, that’s cool, it’s not required for data lists. You may want to look at the Forms Development Guide for tips.

Big News: I’ve left Optaros to start my own firm

After nearly four years at Optaros I’ve decided to start a new chapter in my career. I’ve created a new firm called Metaversant that is focused on providing content-centric solutions and consulting to clients across all verticals and geographies. Based on my deep experience with the platform and my active participation in the community, I expect Metaversant to be heavily-focused on Alfresco. We may broaden into other technologies over time, but the over-arching theme will be to help companies get the most out of their digital assets–whether that’s documents, web content, rich media, or legal records–by leveraging Enterprise-ready, open, rich content repositories.

On one hand, I was sad to leave Optaros–it was a great place to work with lots of smart people and interesting clients/projects. And I had fun building the ECM practice into a significant portion of overall revenue. On the other hand, the timing felt right to make this change and I’m very excited about starting my own company. Optaros and I are on great terms and I’m sure we’ll find ways to do business together going forward.

There are a lot of to-do’s to get Metaversant fully functional as a corporation, but nothing’s more important than the success of your project. If you are looking for help in any of the following areas, we should talk:

  • Customized, on-site Alfresco developer training
  • Short-term tactical technical assistance
  • Architectural reviews/product fit assessments
  • Content Management customization & implementation leadership
  • Custom content-centric application development & integration
  • Domino.Doc, Vignette, Stellent, or other legacy ECM migrations

You can contact me at “jpotts” at either this domain or metaversant.com.

As usual, keep an eye out here for news on Metaversant (like a link to the yet-to-be-built web site) and other content management news and thanks for your continued support!

Using cmislib to migrate digital assets to CMIS repositories

The follow-on to my introduction to cmislib, published on developerWorks earlier in the week, is now live. In the article, Jay Brown, the development lead for IBM’s CMIS servers, walks you through a small utility that leverages Python and cmislib to xcopy image files (and their embedded EXIF metadata) into a CMIS repository.

When Jay wrote the article and the code that goes with it, he initially tested against his own IBM CMIS servers. As soon as the core functionality was complete, he changed the service URL in his config file to point to Alfresco’s CMIS server and it ran like a charm. That’s the beauty of CMIS and cmislib: Write once, manage digital assets anywhere.

New developerWorks article on cmislib

If you would like to learn more about cmislib, an open source CMIS client API for Python that works with any CMIS-compliant repository such as Alfresco, FileNet, Nuxeo, OpenText, and others, check out my new developerWorks article.

This is part one in a two-part series. In the second part, which will be published soon, Jay Brown from IBM talks about how he used cmislib to create an xcopy-like utility that copies images from a file system into any CMIS repository. As it does the copy, it inspects the image’s EXIF tags and if the target document type has corresponding properties, it populates those properties with the image metadata.

Drupal Open Atrium and Alfresco CMIS files

A lot of people have been asking for the files we used to integrate Alfresco CMIS with Drupal Open Atrium (See ecmarchitect.com blog post). I’ve happily mailed those to whomever asked. I’ve had the intention of testing them with the latest version, cleaning them up, and putting somewhere more appropriate like the Open Atrium feature server, or at the very least, Google Code or GitHub. But it hasn’t happened yet so I figured I’d make them available here and appeal to the Community to give them a good home.

The zip includes a readme file with (very) rough install/config directions.

Good luck!

CMS trend: Commerce, Content, & Community Convergence

Have you noticed this trend? The worlds of eCommerce, Content, and Community are coming together. At Optaros we call these “the 3 C’s” and we’ve had so much interest in the convergence of the 3 C’s, we created a cloud-hosted SaaS offering around it called OCentric that combines Drupal, Magento, Solr, and other open source components into a single platform for ecommerce, WCM, community/social, and integrated search. But I don’t want to give you a product pitch. The reason why I bring this up at all is because I came across an interesting post at CMSWire today. It seems that open source WCM vendor dotCMS and ecommerce player KonaKart will be offering an integrated product later this year. I don’t know any of the specifics, but at a high level it seems to be aimed at providing functionality around the 3 C’s.

It makes sense to me that these areas are converging. “Community” as a feature of online retail experience is evolving beyond user reviews and blogs. As Facebook and Twitter use continues to grow, consumers expect those experiences to be incorporated into their online shopping in some way. As my colleague, John Eckman, put it, “People want the online equivalent of ‘Will these jeans make my ass look fat?'”. Until now, online shopping has been largely a solitary experience but community features can make online shopping more social.

Content is also becoming more important in the world of commerce, at least for certain types of retailers. I recently looked at about a dozen electronics retailers here in the US to understand how (and surprisingly, if) they were using content on their ecommerce sites. I figured electronics had the potential to be a category leader as it tends to be a heavily researched purchase. What I found was that the degree to which content was being leveraged depended heavily on the type of reailer: online presence tended to mirror offline presence. Crutchfield, a retailer that prides themselves on providing top-notch research and customer service, led the pack with their content efforts. Here are a couple of things that stuck out:

  • They’ve got tons of quality content that’s fully integrated with the shopping experience. If you’re reading an educational piece on Blu-Ray players, the content includes links to specific products. Conversely, if I’m looking at a specific Blue-Ray player I’m offered multiple links to specific pieces of research on Blu-Ray and Home Theater topics.
  • Search covers both products and content. On many sites, if they have search at all, it is one or the other, but not both. Beyond site-wide search, Crutchfield actually changes the format of the search results based on what I’m search for. Keywords that look like specific products give me a set of results that features product catalog entries while more “research-ish” looking terms (“Home Theater”) actually prioritize learning resources ahead of product catalog entries.

Can Your Commerce/WCM/Community Vendor Do That?

Traditionally, each of the 3 C’s has been addressed by a single vendor. Sure, maybe your WCM vendor has an integration with a shopping cart, but it won’t natively understand how to act like a product catalog. And your ecommerce vendor might offer some light content management for non-product catalog content, but it’s unlikely to provide much robustness around presentation templates, custom metadata, or workflow, and certainly won’t offer as much innovative community or social functionality as a full-fledged community platform.

Companies may decide to take a best-of-bread approach and integrate at the UI layer. It’s a lot of work to make the experience seamless. If you’ve got one tab for “shopping”, one for “research”, and one for “community”, but once you drill down into those, everything is silo’d, you aren’t there yet, in my opinion. And focusing on the presentation completely ignores the job of the web site producers and merchandisers who want to be able to cross reference tweets, blogs, and articles with specific SKU’s (and vice versa).

How will this convergence take shape?

So it seems to me like this is a very natural and valuable convergence. What do you think? Will commerce, content, and community become one? Open source players will continue to innovate along these lines but what about the stalwarts–do you expect to see many 3 C related acquisitions this year?

Updated Python CMIS library released

I’ve tagged and released a new version of cmislib, the Python CMIS client library. What’s cool about this release is that it is the first one known to work with more than one CMIS provider. Yea for interoperability! The beauty of CMIS, realized! Okay, it wasn’t that beautiful, it’s still “0.1”, and there are known issues. But I can now say the library works with both Alfresco and IBM FileNet and that’s a Good Thing.

IBM was a big help with this. Al Brown, one of the CMIS spec leads turned one of his colleagues, Jay Brown, onto cmislib. Jay called me up and asked, “If I give you access to a FileNet P8 server, can you test cmislib against it?” I was on it faster than you could say, “unittest.main()”.

I think the effort was valuable for all sides. Our little “mini plugfest” turned up issues in my client as well as both CMIS providers. Jay worked hard to chase down everything on the FileNet side. Dave Caruana chased a few down on the Alfresco side as well. Thanks to everyone for the team effort.

Anyway, give the new cmislib release a try and give me your feedback. If you want a feel for how easy it can be to work with CMIS repositories using the cmislib API, check out the documentation or dive right in. Installation is as easy as “easy_install cmislib” (easy_install instructions).

Next up is Nuxeo. Can the open source ECM vendor achieve cmislib Unit Test Greatness faster than Big Blue? We shall see!

Alfresco Share Status microblog component now supports 3.2 Enterprise

I’ve posted a new release of the Alfresco Share Status microblog component (original post). There are no new features–it’s just a few bug fixes. But one of the bugs was keeping it from working on 3.2 Enterprise. That’s now fixed, so if you’ve upgraded to Alfresco 3.2 Enterprise and you want to use this component in your Share sites, have at it.

Although I’ve tagged both the repository extensions and the surf extensions as “0.2”, only the surf extensions have changed since the last release. If you want to know specifically what’s changed, refer to the Release Notes.