Month: October 2008

Alfresco 3.0 Enterprise is released

Open source CMS Alfresco has made its Enterprise 3.0 release available today. This is a significant release. It includes the new web application development framework, Surf, a new client for team collaboration called Share, support for multi-tenancy (separating the repository into multiple logical repositories for multiple “tenants”), and a draft CMIS implementation. I haven’t confirmed this personally yet, but at the recent community conference in Washington, D.C., CTO John Newton said that the release includes major performance improvements.

Mozilla Ubiquity: Stop jumping around between web apps to get a task done

My friend and former colleague, Tom Pierce, stuck this on my Delicious page: Mozilla Ubiquity. The screencast really got my wheels turning. The idea is that with as many open services available today as there are we should be able to avoid the jumping around from site-to-site we do to complete what ought to be a simple task. The example they use is composing an email with a map to a restaurant and a list of restaurant reviews. Today you have to create the email then go to Google maps, find the restaurant, and then cut-and-paste a link to that map into your email. Then, if you want reviews, you have to do the same thing. Ubiquity gives you a single interface for pulling information from various sources all using friendly, text-based commands. In this example you never have to leave your web mail–as you compose the email you execute Ubiquity commands that fetch the data you need. Watch the video and you’ll get it.

After you’ve done that and your head is sufficiently spinning, think about the implications this could have in the Enterprise. Just within ECM alone you could do some really cool stuff (knowledge bases, document libraries, team collaboration, intranets) but I would also think there could be decent applications in the BI (Business Intelligence) world as well.

Alfresco Developer Guide released

I can finally answer the question, “When is the book coming out?”. The answer: Today. The Alfresco Developer Guide is now available for immediate shipping from Packt‘s web site.

There are a lot of people who made this thing happen including an awesome team of colleagues at Optaros, the entire Alfresco crew, the Packt team, and the support of my family. I’ve expressed my thanks individually in the acknowledgments and I hope I haven’t left anyone out.

I’m pretty excited how the book turned out. One of my roles as the Director of the ECM Practice is to get our consultants and our clients up to speed on open source CMS technology like Alfresco. I tried to organize the book in the same way I cover these topics in-person so the book flows just like it would if you and I were sitting in a room and you said, “I’ve been poking around with Alfresco on my own but now I’m ready to really start to do something with it.” I start with core fundamentals (content modeling, actions, behaviors, extractors) and gradually work “outward” through web client customizations, web scripts, advanced workflow, WCM, and security.

The book’s title has “developer guide” in it for a reason: It is more of a tutorial than it is an exhaustive reference. I figured with resources available like the wiki, the forums, and the source code, it was more important and helpful to step you through real-world examples.

My hope is that this book flattens the learning curve for everyone. And maybe in some way it will encourage companies that feel stuck in their currently legacy CMS to explore options.

Alfresco Surf 3.0 Code Camp: Catch a wave in NYC

Optaros and Alfresco are co-hosting a Surf 3.0 Code Camp in New York City on November 10th. The purpose of the camp is to get attendees up-and-running with Alfresco’s new web application development framework, Surf. The camp will run all day and into the evening.

I’ll be leading the camp by taking you through some prepared material and hands-on exercises. I’ll have a virtual machine prepared with everything on it so hopefully we won’t have to spend a lot of time getting everyone set up. The labs start with a simple Share dashlet and grow progressively more complex until you finally have a functioning Surf-based application that is making remote calls to the Alfresco repository.

After we work through the labs we’ll spend some time picking apart the Status and Bookmark components we recently built and then you’ll get a chance to talk about your own plans for Surf-based apps. This less formal “workshop” part of the day is your opportunity to start applying what you’ve learned and learn from and help others. Maybe you’ve got a great idea for a Surf component but you don’t know where to start. Or maybe you’ve got something already planned out but you’re looking for some help knocking out code.

My European friends will have to wait until the new year–I’ll be facilitating the Munich Code Camp in January. There are other partner-hosted Code Camps planned for Chicago, LA, and DC.  Exact dates for these camps are still being worked out–DC sounds like it may happen in December while the rest will be in January.

These events are free but you must sign up and space is extremely limited.

This just in: Nancy Garrity, Alfresco Community Czar, says she’ll give a Chumby to the best Surf component submitted from Camp attendees. We’ll have more details on that during Camp.

Importing ACP files with the UUID binding

A common way to get files and metadata into and out of the Alfresco repository is to use ACP (Alfresco Content Package) files. People that work with ACP files quickly find out that the out-of-the-box ACP import action will only import a given object once–it won’t update an object if it is already in the repository. By default, the import action tries to create a new object on every import. If a like-named object already exists the import will fail.

There’s a simple fix for this. The underlying API actually supports updating objects by matching on UUID. All you need to do is create your own version of the import action that uses the UUID_BINDING rather than the default.

Here are the steps:

  1. Find the org/alfresco/repo/action/executer/ class in the source.
  2. Make a copy of the class. I called mine
  3. Find the line of code that reads: this.importerService.importView(importHandler, new Location(importDest), null, null);
  4. Change it to: this.importerService.importView(importHandler, new Location(importDest), REPLACE_BINDING, null);
  5. Now add the definition for REPLACE_BINDING which is a private static inner class:
private static ImporterBinding REPLACE_BINDING = new ImporterBinding()

    public UUID_BINDING getUUIDBinding()

    public String getValue(String key)
        return null;

    public boolean allowReferenceWithinTransaction()
        return false;

    public QName[] getExcludedClasses()
        return null;


As with any action, the last step is to add the Spring configuration:

<bean id="updating-import" class="com.optaros.action.executer.UpdatingImportExecuter" parent="action-executer">
    <property name="importerService">
        <ref bean="ImporterService"/>
    <property name="nodeService">
        <ref bean="NodeService"></ref>
    <property name="contentService">
        <ref bean="ContentService" />
    <property name="mimetypeService">
        <ref bean="mimetypeService"/>
    <property name="fileFolderService">
        <ref bean="FileFolderService"/>

After deploying your changes and restarting the application server you can test the new action. In my case, I wrote a workflow that used JavaScript to execute the export action to export the documents in the workflow. I then simulated an external system operating on the ACP file by writing a quick Perl script to unzip the ACP, inject some metadata into the ACP’s XML manifest, and then zip it back up. At this point the ACP file contains the exported objects (with their associated UUID) and some new metadata. I then trigger the next step in the workflow which, again, uses JavaScript to execute the newly-written Updating Import Action. Unlike the OOTB import, when this one runs Alfresco finds the existing objects based on the incoming UUID’s and instead of trying to create new objects, it updates the old objects with the new metadata in the ACP file. Problem solved.

You can learn more about writing custom Actions on the Alfresco Wiki and in Chapter 4 of the Alfresco Developer Guide available at Packt Publishing or your favorite online book seller.

Apache Directory Studio: Look it up

In my work with ECM technology I am almost always dealing with an LDAP directory. Even on my laptop I run OpenLDAP because it is easier for me to slam in a bunch of test users and groups by generating and importing LDIF files than it is to otherwise prep a repository for tests or demos. Plus, once you’ve configured your platform to authenticate against your local LDAP directory there’s a decent chance it will work with your client’s assuming the schemas aren’t terribly different.

If you also frequently find yourself tweaking the directory and you’re an Eclipse user, you should download and install the Apache Directory Studio Eclipse plug-in and put an end to clunky, platform-specific directory admin tools.

As an aside, as readers know, I run Ubuntu as my primary OS. On Ubuntu, installing OpenLDAP is as easy as running “sudo apt-get install slapd”. But pre-compiled Windows binaries of OpenLDAP seem elusive. Apache Directory Server might be a decent alternative. The Studio plug-in works with both.

InfoWorld gives Acquia Drupal a spin

Over at InfoWorld, Mike Heck spent a few days playing with Acquia Drupal, Acquia’s commercially-supported Drupal distribution. He also tested out some of the features provided by Acquia Network and threw a couple of test issues at Acquia’s support team. Mike liked what he saw and said he saved a lot of time using Acquia’s distribution instead of having to start with Drupal core and then adding the modules himself, but admitted that his week or so with the product wasn’t enough to truly put the product or the support organization through its paces.

UPDATE: Removed the word “hardened”. Acquia does not change Drupal core.

Empowering NGI Media with Alfresco: Webinar replay and slides

If you missed the webinar we did earlier this week with Alfresco and the leaders of our Media practice you can watch the re-play at WebEx. If you just want the slides you can get them from slideshare.

The presentation is about how you can increase revenue and operational efficiency by treating your content as assets that live in Alfresco and are served up through various channels and API’s. The repository is just one component of what we at Optaros refer to as the Next Generation Media Platform powered by Alfresco.