Wednesday, February 24, 2010

Improved Alfresco Administration

Alfresco 3.2r, just released on February 15th, comes along with some great new tools for administration. Alfresco's Paul Hampton described and demo-ed two categories of new features in a Alfresco recorded webcast:

  1. New Subsystems
  2. Storage Policies

Subsystems are mini-servers that run embedded within the overall Alfresco system.  They are independent processes that can be brought up and down.  This design lets an administrator of the system change a single configuration without having to bring down the entire Alfresco system.  The advantages are reliability and availability.

Subsystems can be configured via any JMX client [Enterprise Alfresco only].  In the demonstration, Paul used JConsole, a common JMX console used by the JDK.  From the console, the subsystems can be stopped and started, and parameters of the individual subsystems can then be reconfigured.

Starting in Alfresco 3.2 the file alfresco-global.properties is a centralized place for system configurations -- unless you are using JMX.  If you are using JMX, the alfresco-global.properties file values are used until you configure new subsystem values via JMX.  JMX changes get stored in the database, and thereafter, any time you start your system, the database values will override those of the properties file.  An advantage of this approach is that system changes are stored in the database and easily propagated to all servers in a cluster.  But the properties file is not updated and may lead to confusion about what system values  are currently being used.

Examples of Alfresco Subsystems include:

  • Authentication
  • Synchronization
  • File Servers
  • Third party
  • IMAP
  • WCM Development Receiver
  • SysAdmin
  • OpenOffice Transformations

Paul gives a good detailed example in the demonstration of how he could stop the OpenOffice Transformation  subsystem, configure a second one, and then start up two OpenOffice Transformation subsystems.

Storage Policies were covered in the second portion of the webcast.  (There is also an Alfresco brief description of Storage Policies here.)  Storage policies can be part of an Information Lifecycle Management (ILM) strategy.  They let the administrator determine which content should be stored where.



Paul shows in the webcast an example where he automatically stores content to a particular location based on content type -- or whatever other criteria you might have.  He accomplishes this by setting up rules that get run when the content is checked in.  Images, videos, and PDFs, for example, could all be stored in separate directories or volumes.

Tuesday, February 23, 2010

Alfresco named by KMWorld as one of the top 100 KM companies

KMWorld Magazine announced today that Alfresco was named as one of the "100 Companies that Matter in Knowledge Management". KMWorld worked with analysts, vendors and customers to compile the list which will be posted to www.kmworld.com on March 1.

This will be the first year for Alfresco to be on that list, and it follows up quickly after an announcement that Alfresco was named to CIO's list of top 20 UK companies.

"In today’s knowledge economy, Alfresco Software does more than simply throw sophisticated technology at its customers, it provides real solutions through inspired planning and execution throughout the entire constituency chain," said Hugh McKellar, KMWorld editor in chief.

Monday, February 22, 2010

Alfresco WCM followup

Last week in a followup webcast to an early February webcast, Alfresco hosted a question and answer session about their planned roadmap for WCM in 2010. Both are pretty informative.

Interestingly as well, there have been a couple of other recent announcements of Alfresco-based WCM offerings, some of which aren't using Alfresco's standard WCM.

Jeff Potts in a good blog post last year described the differences between the WCM and DM repositories. The fact that there are two and that they are not fully compatible has led to some headaches.

Vodori has a video out showing their product Pepper. The Pepper tag library integrates well with a standard JSP-based web site. WYSIWYG and templated page edits are possible. Pepper was implemented using Alfresco WCM to take advantage of the Alfresco WCM publishing capabilities, but they are migrating to the use of the standard DM repository as Alfresco plans to support DM publishing alongside the release of the CMIS 1.0 version.

Last week the Blue Fish Group hosted an Alfresco Webinar. They presented a very nice WCM solution, but one that doesn't use Alfresco's native WCM tools. Their comment was that Alfresco WCM is a bit of a challenge for non-techie people. Their goal was to create a system that would accommodate the needs of casual web content creators.

So while Alfresco has hit a home run with its standard DM capabilities, they still need to do some more work in the area of WCM. While that is a criticism, it's really hard to complain, considering how much Alfresco has done and gotten right over the last five years.

And based on the roadmap, Alfresco is strongly focused on Web Content Management this year. Starting with the recent 3.2r release and the planned 3.3, 3.4 and 4.0 releases, WCM seems to be a central component of their plan.

Wednesday, February 17, 2010

Creating a Share Form for an Alfresco Custom Type having Two Columns

This is a followup to a previous blog post that described a form created for use with a custom type.  In this blog we show that it is easy to further control the layout of the form by applying a template to the form.  The template is uses Freemarker.  And it's possible to specify a separate template for each of the possible modes of the form: view, edit, and create.

By adding the following three lines to the form definition of the file web-framework-config-custom, the template(s) can be specified:

<view-form template="/tab-edit-form.ftl" />
           <edit-form template="/tab-edit-form.ftl" />
    <create-form template="/tab-edit-form.ftl" />

And when viewed in whole context of the form definition, we now have:


<alfresco-config>

 <config evaluator="node-type" condition="mm:doc">
    <forms>
       <form>
    <view-form template="/newtemplate.ftl" />
       <edit-form template="/newtemplate.ftl" />
    <create-form template="/newtemplate.ftl" />
          <field-visibility>
             <!-- inherited from cm:content -->
             <show id="cm:name" />
             <show id="cm:title" force="true" />
             <show id="cm:description" force="true" />
             <show id="mimetype" />
             <show id="cm:author" force="true" />
             <show id="size" for-mode="view" />
             <show id="cm:creator" for-mode="view" />
             <show id="cm:created" for-mode="view" />
             <show id="cm:modifier" for-mode="view" />
             <show id="cm:modified" for-mode="view" />

             <!--  aspect mm:colorAble -->             
             <show id="mm:color" />
             
             <!--  specific for mm:doc -->
             <show id="mm:relatedDocuments" />
             <show id="mm:freeText" />

           
          </field-visibility>
          <appearance>
             <set id="builtin" appearance="fieldset" label="Built In" />
             <set id="custom" appearance="fieldset" label="Custom Data" />
             <set id="mandatory" parent="builtin" appearance="panel" label="Mandatory" />
             <set id="optional" parent="builtin" appearance="panel" label="Optional" />
             
             <field id="cm:name" set="mandatory" />
             <field id="cm:title" set="optional" />
             <field id="cm:description" set="optional" />
             <field id="mimetype" set="optional" />
             <field id="cm:author" set="optional" />
             <field id="size" set="optional" />
             <field id="cm:creator" set="optional" />
             <field id="cm:created" set="optional" />
             <field id="cm:modified" set="optional" />        
             <field id="cm:modifier" set="optional" />
               
             <field id="mm:relatedDocuments" label="Related Docs" set="custom"/>
             <field id="mm:freeText" label="More Information" set="custom"/>
             <field id="mm:color" label="Color" set="custom">
                <control template="controls/selectone.ftl">
                   <control-param name="options">Red,Orange,Yellow,Green,Blue,Indigo,Violet</control-param>
                </control>
             </field>
          </appearance>
       </form>
    </forms>
 </config>
</alfresco-config>
Next we define the Freemarker template file. The code for this example is found on the Alfresco Wiki Form Example page:

tomcat\webapps\share\WEB-INF\classes\alfresco\web-extension\site-webscripts\newtemplate.ftl

<#import "/org/alfresco/components/form/form.lib.ftl" as formLib />



<#if error?exists>

   <div class="error">${error}</div>

<#elseif form?exists>



   <#assign formId=args.htmlid + "-form">

   <#assign formUI><#if args.formUI??>${args.formUI}<#else>true</#if></#assign>



   <#if formUI == "true">

      <@formLib.renderFormsRuntime formId=formId />

   </#if>

   

   <div id="${formId}-container" class="form-container">

      

      <#if form.showCaption?exists && form.showCaption>

         <div id="${formId}-caption" class="caption"><span class="mandatory-indicator">*</span>${msg("form.required.fields")}</div>

      </#if>

         

      <#if form.mode != "view">

         <form id="${formId}" method="${form.method}" accept-charset="utf-8" enctype="${form.enctype}" action="${form.submissionUrl}">

      </#if>

      

      <div id="${formId}-fields" class="form-fields"> 

        <#list form.structure as item>

            <#if item.kind == "set">

               <@renderSetWithColumns set=item />

            <#else>

               <@formLib.renderField field=form.fields[item.id] />

            </#if>

         </#list>

      </div>

         

      <#if form.mode != "view">

         <@formLib.renderFormButtons formId=formId />

         </form>

      </#if>



   </div>

</#if>



<#macro renderSetWithColumns set>

   <#if set.appearance?exists>

      <#if set.appearance == "fieldset">

         <fieldset><legend>${set.label}</legend>

      <#elseif set.appearance == "panel">

         <div class="form-panel">

            <div class="form-panel-heading">${set.label}</div>

            <div class="form-panel-body">

      </#if>

   </#if>

   

   <#list set.children as item>

      <#if item.kind == "set">

         <@renderSetWithColumns set=item />

      <#else>

         <#if (item_index % 2) == 0>

         <div class="yui-g"><div class="yui-u first">

         <#else>

         <div class="yui-u">

         </#if>

         <@formLib.renderField field=form.fields[item.id] />

         </div>

         <#if ((item_index % 2) != 0) || !item_has_next></div></#if>

      </#if>

   </#list>

   

   <#if set.appearance?exists>

      <#if set.appearance == "fieldset">

         </fieldset>

      <#elseif set.appearance == "panel">

            </div>

         </div>

      </#if>

   </#if>

</#macro>


In the template there is a reference to the form object and its element members, things like form.mode, form.structure, form.showCaption, etc. The definition of these elements can be found on the Alfresco wiki here.

When the form is rendered for the a document of this custom type, this is what it looks like now.  The form is now rendered with two columns.

Alfresco one of CIO UK's Twenty Companies to Watch in 2010

Alfresco was named one of CIO magazine's top 20 UK companies to watch in 2010.  The list is intended to highlight vendors that are expected to see rapid growth in 2010.  The companies in the list were selected by three analysts from MWD Advisors and CIO UK editor, Martin Veitch.

The reasons for selecting Alfresco for the list included their large user base and current momentum in the marketplace.

Tuesday, February 16, 2010

Using the Alfresco Share Forms Test Page

In the previous post we created a custom document type for the content model and defined a web form to display the content for the custom metadata within Alfresco Share.

Share 3.2 also has a cool little utility called the form test page.  The Alfresco wiki indicates that this page may be plugged into the Share Administration page as a module at some point in the future.  For now, you can see it here:

http://localhost:8080/share/page/test-form

After checking in a document as the new custom type, you can go to the node browser in the Administration pages of the Alfresco explorer client and grab it's node path reference.

Using that path on the test form page, we can preview the form.


Now, we can play a bit with the tag for the form.  Consider the following changes to appearance (compared to the appearance tag definition of the form defined in yesterday's blog):


<appearance>
             <set id="builtin" appearance="fieldset" label="Built In" />
             <set id="custom" appearance="fieldset" label="Custom Data" />
             <set id="mandatory" parent="builtin" appearance="panel" label="Mandatory" />
             <set id="optional" parent="builtin" appearance="panel" label="Optional" />
             
             <field id="cm:name" set="mandatory" />
             <field id="cm:title" set="optional" />
             <field id="cm:description" set="optional" />
             <field id="mimetype" set="optional" />
             <field id="cm:author" set="optional" />
             <field id="size" set="optional" />
             <field id="cm:creator" set="optional" />
             <field id="cm:created" set="optional" />
             <field id="cm:modified" set="optional" />        
             <field id="cm:modifier" set="optional" />
               
             <field id="mm:relatedDocuments" label="Related Docs" set="custom"/>
             <field id="mm:freeText" label="More Information" set="custom"/>
             <field id="mm:color" label="Color" set="custom">
                <control template="controls/selectone.ftl">
                   <control-param name="options">Red,Orange,Yellow,Green,Blue,Indigo,Violet</control-param>
                </control>
             </field>
          </appearance>

Here we separate the metadata into groups or 'sets'. For this example, we divide the metadata into two types: builtin and custom. And of the builtin fields, we further divide the fields into 'mandatory' or 'optional'. After making those changes (and restarting the server -- 'boo'), we're able to see the changes:





Creating Edit Forms for Custom Types in Alfresco Share

Most organizations that will use Alfresco will want to create custom types.
Associated with each custom type is a data model or set of metadata that is unique to that type of document.
To be able to edit document type metadata in Alfresco Share, you need to define an edit form.

Here's a brief example for how to set up and define the metadata for a custom document type and then how to define a Share edit form for that custom type.

Some good resources with getting started with Alfresco Share forms include:

Alfresco Wiki Form Developer Guide page.
Alfresco Wiki Form Examples page.  [Good starting place]
Ed Loves Java on creating Alfresco Share 3.2 forms.
Loftux on Alfresco Forms

First we define a minimum custom Alfresco type. There are four files needed to add this new type to the content model.

tomcat\alfresco\WEB-INF\classes\extension\model\mmModel.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Definition of new Model -->
<model name="mm:minmodel" xmlns="http://www.alfresco.org/model/dictionary/1.0">

 <!-- Optional meta-data about the model -->
 <description>MinProperty Model</description>
 <author>Formtek</author>
 <version>1.0</version>

 <!-- Imports are required to allow references to definitions in other models -->
 <imports>
  <!-- Import Alfresco Dictionary Definitions -->
  <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
  <!-- Import Alfresco Content Domain Model Definitions -->
  <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm" />
 </imports>

 <!-- Introduction of new namespaces defined by this model -->
 <namespaces>
  <namespace uri="http://www.formtek.com/model/content/1.0" prefix="mm" />
 </namespaces>

 <constraints>
  <constraint name="mm:colorList" type="LIST">
            <parameter name="allowedValues">
                <list>
                    <value>Red</value>
                    <value>Orange</value>
                    <value>Yellow</value>
                    <value>Green</value>
                    <value>Blue</value>
                    <value>Indigo</value>
                    <value>Violet</value>
                </list>
            </parameter>
        </constraint>
 </constraints>

 <types>
  <!-- Enterprise-wide generic document type -->
  <type name="mm:doc">
   <title>Minimum Custom Document</title>
   <parent>cm:content</parent>
   <properties>
    <property name="mm:freeText">
     <type>d:text</type>
     <mandatory>false</mandatory>
    </property>
   </properties>
   <associations>
    <association name="mm:relatedDocuments">
     <title>Related Documents</title>
     <source>
      <mandatory>false</mandatory>
      <many>true</many>
     </source>
     <target>
      <class>mm:doc</class>
      <mandatory>false</mandatory>
      <many>true</many>
     </target>
    </association>
   </associations>
  </type>
 </types>

 <aspects>
  <aspect name="mm:colorAble">
   <title>Rainbow Color</title>
   <properties>
    <property name="mm:color">
     <type>d:text</type>
     <mandatory>true</mandatory>
     <default>Green</default>
     <constraints>
      <constraint ref="mm:colorList" />
     </constraints>
    </property>
   </properties>
  </aspect>
 </aspects>
</model>


tomcat\webapps\alfresco\WEB-INF\classes\alfresco\min-model-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
    <!-- Registration of new models -->
    <bean id="minModel.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap">
        <property name="models">
            <list>
                <value>alfresco/extension/model/mmModel.xml</value>
            </list>
        </property>
        
        <property name="labels">
            <list>
                <value>alfresco/extension/model/mmModelResourceBundle</value>
            </list>
        </property>
    </bean>

</beans>



tomcat\webapps\alfresco\WEB-INF\classes\alfresco\extension\web-client-config-custom.xml
<alfresco-config>

 <!-- show related documents association on doc property sheet -->
 <config evaluator="node-type" condition="mm:doc">
  <property-sheet>
   <show-association name="mm:relatedDocuments"/>
   <show-property name="mm:freeText"/>
  </property-sheet>
 </config>

 <config evaluator="aspect-name" condition="mm:colorAble">
        <property-sheet>
            <show-property name="mm:color" />
        </property-sheet>
    </config>

 <config evaluator="string-compare" condition="Content Wizards">
  <content-types>
   <type name="mm:doc" />
  </content-types>
 </config>

 <config evaluator="string-compare" condition="Action Wizards">
  <subtypes>
   <type name="mm:doc" />
  </subtypes>  

  <!-- The list of content and/or folder types shown in the specialise-type action -->
  <specialise-types>
   <type name="mm:doc" />
  </specialise-types>  
  
  <aspects>
   <aspect name="mm:colorAble" />
  </aspects>
 </config> 
 
 <config evaluator="string-compare" condition="Advanced Search">
  <advanced-search>
   <content-types>
    <type name="mm:doc" />  
   </content-types>
   <custom-properties>  
    <meta-data aspect="mm:colorAble" property="mm:color"/>
   </custom-properties>
  </advanced-search>
 </config>
</alfresco-config>


tomcat\webapps\alfresco\WEB-INF\classes\alfresco\extension\model\mmModelResourceBundle.properties
mm_minmodel.description=Alfresco Example Minimum Domain Model

mm_minmodel.type.mm_doc.title=Min Extended Content
mm_minmodel.type.mm_doc.description=Minimum Extended Content Document
mm_minmodel.property.mm_freeText.title=Additional Details
mm_minmodel.property.mm_freeText.description=Place to enter more details about this document
mm_minmodel.aspect.mm_colorAble.title=Rainbow Color
mm_minmodel.aspect.mm_colorAble.description=Color of the rainbow this document belongs to

The example files above define a simple "Minimum Content Model" for Alfresco. All of these files are kept within the Alfresco repository -- within the alfresco.war file set.

The next file is on the Share side and is used to define a form within Share for editing metadata specific to the custom class just defined.

tomcat\webapps\share\WEB-INF\classes\alfresco\web-extension\web-framework-config-custom.xml

<alfresco-config>

 <config evaluator="node-type" condition="mm:doc">
    <forms>
       <form>
          <field-visibility>
             <!-- inherited from cm:content -->
             <show id="cm:name" />
             <show id="cm:title" force="true" />
             <show id="cm:description" force="true" />
             <show id="mimetype" />
             <show id="cm:author" force="true" />
             <show id="size" for-mode="view" />
             <show id="cm:creator" for-mode="view" />
             <show id="cm:created" for-mode="view" />
             <show id="cm:modifier" for-mode="view" />
             <show id="cm:modified" for-mode="view" />
           
             <!--  specific for mm:doc -->
             <show id="mm:relatedDocuments" />
             <show id="mm:freeText" />

             <!--  aspect mm:colorAble -->             
             <show id="mm:color" />
           
          </field-visibility>
          <appearance>
             <field id="mm:relatedDocuments" label="Related Docs"/>
             <field id="mm:freeText" label="More Information"/>
             <field id="mm:color" label="Color">
                <control template="controls/selectone.ftl">
                   <control-param name="options">Red,Orange,Yellow,Green,Blue,Indigo,Violet</control-param>
                </control>
             </field>
          </appearance>
       </form>
    </forms>
 </config>
</alfresco-config>


With those files in place, you can checkin a document of type mm:doc from the Alfresco Explorer client and then make it available from Alfresco Share. Edit the metadata for the document, and select "Full Metadata Edit Page...".

You should see something like this:


The three new custom fields are now exposed on the Share edit form:  Related Docs, More Information, and Color.

Monday, February 8, 2010

Advanced Workflow in Alfresco Share

Alfresco Share 3.2 is shaping up to be a great development platform.  Prior to 3.1, Share's access to standard Alfresco repository capabilities were disappointingly weak.  But with the 3.2 release, many repository features have been migrated from the older Alfresco JSF client (aka the 'explorer' client) to the Share Document Library.

Unfortunately, Alfresco's Advanced Workflow, the ability to create complex workflows using jBPM and to use them within Alfresco, is still not quite prime time.  There's talk that Advanced Workflow will be ready to ship as part of the 3.3 release of Share.  On the Alfresco wiki, a series of goals for implementing Advanced Workflow in Share are listed.

But...  the current state of Alfresco 3.2 Share makes it look like a full integration of Advanced Workflow with Share may not be that far off.  One promising sign is that two built-in Advanced Workflows already ship with Share 3.2: "Adhoc Tasks" and "Review and Approve".  The negative is that only these two workflows are available -- and they are hardcoded. Also assigning a document to one of those workflows throws some errors at the server.

We're anxious to see general Advanced Workflow working in Share, so I decided to investigate a bit to see what could be done to make a general workflow work in Share 3.2.

As a starting point, I adopted the workflow example code from the Alfresco wiki that describes an Approve/Reject Lifecycle workflow.  The flow for the workflow looks as follows:

To install the new workflow for use within Share, copy the following files with contents as defined on the wiki into the exploded alfresco repository file area:
alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\extension\lifecycle-workflow-context.xml
alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\extension\workflows\lifecycle
      lifecycle_processdefinition.xml
      lifecycle-messages.properties
      lifecycleModel.xml

In the lifecycle_processdefinition.xml file, you need to make sure that the use of the < ("less than") operator in the embedded Javascript is replaced with <.  For example, on the line:
    for (var i = 0; i < bpm_package.children.length; i++)
To make the workflow available within Share, add a line to define the lifecycleapproval workflow to the file
alfresco\tomcat\webaps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\modules\documentlibrary\workflow.get.html.ftl:

The name of the workflow "wfl:lifecycleapproval" corresponds to the name of the process definition defined in the file  lifecycle_processdefinition.xml:


With these files in place, the web application server can be restarted.
Then by going to the workflow console in the Alfresco repository application, you can see that the workflow has been defined.

The workflow console is located at this URL: http://localhost:8080/alfresco/faces/jsp/admin/workflow-console.jsp.  And the defined workflow definitions can be queried.  In this example, the new workflowid is jbpm$8:

The new workflow is also now visible from the Share Document Library.  When a workflow is selected to be assigned to a document from within Share, the following dialog can now be seen with a "Lifecyle Approval" option now available (with spelling typo):



That's all good.  Now, by clicking on "Assign Workflow", the workflow will be assigned to the document.  Now, after logging into Share as the workflow assignee, the following can be seen in the Task List:



From the workflow console screen, you can check the status of the newly created instance of the workflow.  First, specify which workflow definition id you will be querying.



And then query the workflow id of the current instance of the workflow.



The workflow id of the workflow instance is jbpm$11.


And the path id for this workflow instance is jbpm$11-@.
The current task for the path is as follows:





Going back into the Share task window, after approving the review/lifecycle item and then again checking the properties for the task in the workflow console, the following can be seen:



So it looks like the workflow is working.  But a glance at the tomcat console shows that there are errors being reported each time a workflow is assigned to a document.  With a little bit of investigation, the problem can be traced to the file alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts\org\alfresco\slingshot\documentlibrary\action\assign-workflow.post.json.ftl.
The variable 'results' is entering the Freemarker macro as undefined.  I'm not sure how serious a problem this is, but making the following change to this file avoids the error.



This test seems to indicate that while Workflow within Alfresco Share in the 3.2 release is not officially ready, it may be close enough for at least creating simple workflows like the one described here.

Tuesday, February 2, 2010

Alfresco WCM Roadmap

The Alfresco tech team for Web Content Management (WCM) made a presentation on the Alfresco WCM 2010 Roadmap.

    Ben Hagan - WCM Product Manager
    Brian Remmington - WCM Architect

Here are some notes from the presentation.

Alfresco 3.2 included a number of improvements in the area of WCM:
    - Better page previews
    - Better page rendering
    - Better web page authoring in a clustered environment

Upcoming Alfresco WCM Release Schedule
February 15th - 3.2r release  [Records Management plus some new WCM functionality]
March, 2010 - 3.3 Community Release
May, 2010 - 3.3 Enterprise Release

Overall Vision and goals for Alfresco WCM
Common Content Services is a long-term goal.
     - Access to WCM and standard Alfresco DM should be consistent
           ie., unification of the two repositories

Web Content Production
     - Be able to quickly edit and modify pages 'in-context'
     - Better tools for managing the web page presentation
     - Website production tools

Infrastructure/Platform improvements
     - Use high productivity developer tools like Spring Surf
     - Modular, pluggable, extensible,...
     - Standards like CMIS and REST
     - Built on fast, scalable repository

All Releases
    - Performance Optimization
    - Changes to improve scalability
    - Removal of use of Hibernate for more control

Alfresco 3.2r  [February 15th]
     - Deployment of WCM AVM content to standard Alfresco DM repository
           This will enable Alfresco WCM to take advantage of standard Alfresco DM capabilities
                eg.  Transformations, clustering, content rules

Alfresco 3.3  [May 2010]
    - WCM Content Rendering Service API.  [Uses DM content, not AVM content]
           Render/generate a new content renditions [eg., different format, sizes, cropped, ...]
           Freemarker scripting can be used to specify the rendition operations
           New content is intended for use on the web page.
           Can chain renditions
           Maintains relation between the new rendition and the source content
           Renditions are searchable and can have access permissions

    - Alfresco Web Editor (AWE)
           Next-generation of Web Studio  [Web Studio is now in springsurf.  How is it related?...]
           Makes use of work done with Surf and Alfresco Forms Engine
           Compatible with Spring Surf
           Allow in-context editing
           Web Editor toolbar is extensible and pluggable using Javascript
           Includes a Template Editor
                Can design JSP / tag library pages.  Eventually can design other languages, like Freemarker

    - Alfresco to Alfresco Transfer - DM Deployment

    - Enable DM Content modeling for WCM
            Associations
            Aspects
            Properties

     - 3.3 release will be concurrent with the SpringSurf 1.0.0 Final release [May 2010]

Alfresco 3.4 or 4.x  [No Date has been set]
     - WCM integration with Alfresco Share -- "Web Producer"
            Create Share sites
      - Tools focused around WCM
             Content Library
             Template management
             Metadata management
             User roles and content permissions
       - Ability to deploy to other endpoints
             File System, Database, ...

Alfresco 4.x  [No Date has been set]
   - Work Packages [sounds like AVM sandboxes will be deprecated]
            Currently still being designed -- soliciting feedback
            Collaborative/shared workspace [AVM sandbox is for a single user only]
            People can be invited to work on 'an activity'
            'Activities' are isolated, can happen in parallel, and get merged when ready
            The complete Work Package can be versioned