March 13, 2010

Cheryl's Nuxeo Blog

Recap of #GartnerPCC

Attended the Gartner Portals, Content & Collaboration Summit in Baltimore this week, a conference specifically targeting  information professionals who need to guide their businesses on the whole spectrum of content management - collaboration, information governance, social media, portals and web.

The tough part? Trying to choose between great sessions scheduled in the same time slot.  Solid content by some great presenters....

Here are a few of the highlights:

  • Open source ECM is on the upswing.  While it still represents a small percentage of the overall market, numerous sessions called it out as something organizations need to consider as part of their overall decision making process. It's growing in popularity, being asked about more frequently, and analysts are absolutely paying attention to their customer interest.   

  • 2012 seems to be targeted as the 'break out' year for cloud content applications.  A session called "Is a Content Appliance in Your Future: Content Management Architectures Evolve to Meet Evolving User Demands" was led by Karen Shegda. She had some great stats on the kinds of workplace applications that were early cloud successes - outsourced document capture, e-mail, web conferencing, and instant messaging all have important traction today, but new content apps were anticipated to hit critical mass by 2012: vertical/horizontal applications for specific industries or specialized business processes - example of invoice processing. Was good to see this as Nuxeo continues to invest in and build cloud editions of our key applications.

  • Attended 2 really compelling sessions by Toby Bell. The first I attended while wearing my "newbie CMO" hat.  Titled "Web Content Management: Engaging Through Web Channel Strategies, Marketing", was great and sometimes provocative  discussion of how to use a corporate web site/web presence to really drive business.  Took copious notes, as we internally at Nuxeo strive to continue to improve our web site and evolve it into an important source of lead and demand generation.  A work in progress, but one that we are committed to.

  • The second Bell session I attended was packed with interesting observations, trends and identification of some potentially subversive and destructive forces at play in the ECM market.  "What's in Store for Enterprise Content Management Beyond 2010?.  Great analysis of the evolution of the space from its definition in 2005 to current state. We appear to be in the midst of early stage transition from ECM as all purpose infrastructure to more pressure from business to find content management platforms upon which to build content applications. By 2012 the "Composite Content Applications" focus will begin dominate the buying decisions.  (Note - CCA is the next evolution of the solution category once called CEVA "Content Enabled Vertical Application").  ECM is a complex technology space - and the session highlighted what made it so complex. The inevitable yin-yang polar pulls of Risk vs. Reward, Fixed vs. Dynamic Content, 'Blue collar" transactional content vs. "professional grade" knowledge creation were all called out as the forces shaping content management applications and use cases. Another external validation of the direction Nuxeo has anticipated and bodes well for our ability to deliver a content app platform to meet evolving market needs.

  • Video is the next hot thing.... a fun and highly entertaining session led by Whit Andrews
. Honestly? I attended because of the title.  But stayed for the compelling story-telling approach to a really interesting and important area that we see increasingly important to our Nuxeo DAM and Nuxeo EP evolution. "I Was a Teenage YouTube Star: Strategic, Tactical and Calamitous Futures of Video, Inside and Outside the Enterprise" had some fascinating stats on video adoption - the commoditization of the means of production - phones, pocket video recorders, digital cameras are all easily affordable consumer products that have been used to fuel the explosion of digital recording. Companies not managing it today will quickly find themselves in a storage, ediscovery, corporate memory preservation dilemma if this wildly growing content type isn't thought about soon.

  • But no surprise that perhaps the best was saved for last. The final workshop I attended on Thursday morning was co-led by Debra Logan and Carol Rozwell. The session title was “Social Software Meets Information Governance”. My two favourite topics in one place! I came in a bit late, after the room had broken into discussion groups, so tried to hide at the back of the room with some other late stragglers. Glad I did... had a fascinating discussion with someone in a consumer goods company who was struggling to find the right balance for her company's social media needs. IT had shut down access to most social networks, but her business needed to get more proactive in reaching out to their consumers who loved their product. Glad our scenario fueled some discussion and debate on the topic. A big group for a workshop, but feedback seemed overwhelmingly positive and session was valuable...and clearly timely.  

Great to have a chance to speak in person with several analysts, learn about some cool new companies, and get a chance to say 'hi' to some wonderful old ECM-world colleagues.  Until next year! 

March 10, 2010

Nuxeo Lounge

Nuxeo connects to WCM and workflow solutions through CMIS

I did a presentation in february about CMIS, a ten thousand feet overview on a morning event in Paris. I explained there why this standard is necessary now, what it is about, and why we think at Nuxeo it is a great opportunity for our customers and our partners. Slides can be accessed here.

CMIS overview

The event was about Ez-Publish - Nuxeo integration through a CMIS connector. This integration makes really sense as it allows contributors to easily insert inside an EZ-Publish articles links to documents stored in the collaborative repository (Nuxeo DM). The main interest being that the document doesn't go outside of the repository : no copy, the document IS always up-to-date, and we are sure that only people that has been considered as allowed to read it will access it. A video of the integration can be viewed on our partner's website NXC, who develops and maintains the EZ-CMIS plugin. They are now working on integrating Nuxeo DAM in the same way, to be able to insert pictures stored in Nuxeo DAM in the middle of your article.

Title of my presentation was "CMIS : Overview of a Rapidly Evolving ECM Standard ". Just since that presentation, I could see two new integrations  :

  • Drupal (another CMS ), same kind of integration as with EZ, even deeper as it is possible to create content from Drupal into Nuxeo (interest : if you have a to write an article with an attachment, you capitalize the content as the same time as you publish it in your WCM tool).
  • Bonita a user-friendly workflow engine. You can watch the video here. Basically, you see how easy it is to configure a workflow with various steps and actions in Nuxeo repository among connection to other sytems during the process designed with Bonita

I also saw the apparition of a lower level php lib for CMIS, and there is the contribution to Apache Chemistry of a python library by Jeff Potts. Let 's stay tune there should be many good suprises in the coming months !

February 22, 2010

Stefane Fermigier's Nuxeo Blog

Meet us at Solutions Linux in March, too

Solutions Linux is the oldest and biggest trade show in France dedicated to the open source ecosystem. It's been happening every year in Paris since 1999 (it was called "Linux Expo", back then).

This year, Solutions Linux is happening at exactly the same time as Documation and OSBC, and we're spread thin between all these exciting events, but some of us will be hanging around Solutions Linux:

  • Olivier Grisel will give a presentation on "Large Scale data crunching with Hadoop MapReduce et Clojure" during the conferences' "developer track"

  • I will co-chair the same developer track

  • I will also take part in a roundtable on how the public and private sectors can work together to develop better software and content for the education system

Want to book an appointement with me during Solutions Linux? Drop me a mail: sf@nuxeo.com.

February 19, 2010

Cheryl's Nuxeo Blog

Nuxeo on the Road (and On the Web)

It's been a busy quarter here at Nuxeo HQ. Right on the heels of two major product announcements - Nuxeo Studio and Nuxeo DAM, we're pleased to publish our events calendar for the next few weeks - a good range of in-person and online events as we continue to ramp up our customer outreach and market education activities.


So.. here's what's new... Hope you'll think about meeting us live or virtually and learn more about our open source ECM offerings and product direction.

Webinars!

Introducing Nuxeo Studio - Nuxeo Studio is an exciting addition to our subscription services offering - Nuxeo Connect. 

We'll be hosting both English and French sessions in early March.  Click here for the March 3 English registration page et incrivez-vous ici pour 4 Mars en Francais.

Debuting Nuxeo DAM - This has been a blazing hot new offering for us... we're thrilled with the early and positive buzz around our full launch of the first CMIS-enabled Digital Asset Management application.

Both English and French webinars for Nuxeo DAM will be on March 10.  Click here to sign up for the English session.  Incrivez-vous - Francais.

In Real Life!

Documation - Paris, March 17-18
Come see us in Booth D14 at the premier ECM conference in France.  In addition to showcasing our latest ECM offerings in the booth, please join us for a Best Practices Workshop, where our pre-sales guru Alain Escaffre will take you through some practical ECM planning tips, sharing his years of implementation knowledge with workshop participants.  Click here to book space in our session.

OSBC (ComputerWorld's Open Source Business Conference) - San Francisco, March 17-18
Same week, different continent! We've just signed on as sponsors of one of the leading open source technology conferences aimed at business decision-makers.  A very impressive lineup of speakers and keynote presenters... Looking forward to being there personally.  Click here to learn more about our participation and **bonus** get a 20% off code for the registration fee. 

And think you'll be at the Gartner Portals, Content and Collaboration show in Baltimore? March 9-11? While we're not doing a booth, certainly will be there as active participants and attendees. Always keen to meet our customers and prospects on the road - so please don't hesitate to contact me at cmckinnon @ nuxeo.com if you're in the Baltimore/Washington DC area and would like to talk more about open source ECM.



February 11, 2010

Stefane Fermigier's Nuxeo Blog

Preliminary Nuxeo EP roadmap for 2010

We have recently brainstormed internally and discussed with some of our customers and ECM analysts the roadmap for our planned improvements of Nuxeo EP.

View more presentations from Nuxeo - Open Source ECM.

In summary:

  1. We want to make it easier for “users” (in the largest sense, from end users to Java developers) to use the platform in ways that bring value to their businesses.

  2. Short term (Q1 and Q2 2010) technical improvements will include:

    • full CMIS support (icluding all the possible bells and whistles)
    • semantic features (auto-categorization and auto-tagging of content, named entities extraction, images clustering…)
    • better Windows server and desktop integration
    • rules, workflow and reporting
  3. We will improve developer experience by implementing extension points hot reload (for shorter compile/deploy/test cycles) and focussing on Nuxeo Studio.

  4. We will create new packaged profiles, or “distributions”, of Nuxeo EP + extensions, some as full-fledged applications targetting specific segments of the ECM space, such as Nuxeo RM (for Records Management), Nuxeo SDS (Structured Document Server) or Nuxeo Correspondence, and others as more technical components that can be easily embedded by systems integrators or ISVs in more complex product.

Read the slides for more information, then join the discussion on the community forum, or on the nuxeo-dev developers mailing list if you’d like to get involved with development of new features.

Everyone’s welcome to contribute.

February 04, 2010

Cheryl's Nuxeo Blog

Nuxeo DAM - First CMIS-enabled Digital Asset Management - We're Launched!

A very busy week of for our development, marketing and web teams here at Nuxeo.  First we announced Nuxeo Studio as part of our enhanced Nuxeo Connect offering and today the 1.0 release of Nuxeo DAM. Nuxeo DAM was opened to a public beta back in December 2009, as part of our participation at the Gilbane Boston Conference.  We've had tremendous reaction to this offering - hundreds of downloads in just 2 months, and we were thrilled to have early adopters work with us on critical features and fixes they needed to move ahead with our General Availability release.Nuxeo DAM - Watermarking



So why is Digital Asset Management a focus for Nuxeo? 

First, our current customers asked us to.  Our user community has very strong representation from vertical sectors that are very media intensive:  press agencies, educational institutions, military and defense, consumer goods and retailers - all heavy-duty users of large format, interactive content that contributes to an audio and visual experience.  Content has moved far beyond plain text.

Second,  we see new markets and use cases as we grow as an ECM company.  The rise of the web means that new and small companies can compete globally with big incumbents.  Compelling content - in picture, video, audio, image formats - helps tell a story and paint a picture.  Nuxeo DAM offers a feature-rich digital asset management application that is very approachable and cost-effective for companies that need to get started quickly, and can't wait for the costly extended sales cycle of a legacy DAM system.  Our open source approach helps keep a level playing field.

Third, Nuxeo DAM is yet another proof point of the power of our underlying ECM foundation offering - Nuxeo Enterprise Platform (EP). Nuxeo EP is the Java-based extensible ECM platform that serves as the common architecture for Nuxeo DAM as well as Nuxeo DM.  It's the platform many of our customers use to build some extraordinarily creative content applications to meet some pretty unique business and IT requirements.  Because Nuxeo DAM is built on Nuxeo EP, it means that our ongoing enhancements in EP trickle up into the packaged applications.  This is why we can be the first CMIS enabled DAM in the market.  And as we meet our Records Management, Nuxeo Studio and other roadmap milestones, it means Nuxeo DAM will quickly benefit.  

3 IP rights

Over the next few weeks, we will be ready to showcase the power of CMIS - working actively with some other CMIS-enabled products to show the speed to integration.  Watch this space.

February 01, 2010

Cheryl's Nuxeo Blog

Aligning Values - When Customer and Vendor Benefit from the Same Thing

Pleased to finally announce the release of Nuxeo Studio (news release here). Nuxeo Studio is a big step forward - a really cool graphical design tool built specifically to help our customer and partners customize and configure their ECM applications. Details, including a recorded demo, are here.  

Nuxeo Studio is the first of a series of management and monitoring tools that will be made available through our Nuxeo Connect subscription program.


As the Nuxeo customer base grows we're seeing deployments in more countries, in new vertical industries, and in fascinating solution areas that continue to impress and inspire us.  So in response to growth and customer demand, we've updated some of the offerings as part of our Nuxeo Connect subscription program.

Nuxeo-Connect 

Now, announcing some updates to a support and maintenance program isn't, I admit, the sexiest announcement that a software provider can make... but if we step back and think about some of the differences between Nuxeo and most of the mainstream ECM vendors, there is one point in particular that must be called out:  Nuxeo benefits exactly when our customers do.  Not before.  What is of value to us, and what is of value to our customers is in alignment. This is the ah-ha moment about the Nuxeo Connect subscription program and what sets us apart from most ECM companies.

Let me explain what I mean.

In a traditional proprietary ECM deal (or with some of the 'commercial open source' alternatives), what is of value to the customer and what is of value to the vendor don't match.  The vendor assigns value to the initial license purchase.  They derive value from the client relationship well in advance of any testing, prototyping, application development or roll-out.  The client really derives no value from the ECM transaction until months (if not years) later - when pilot or production systems start helping solve their digital content problems.  The ongoing support and maintenance contracts are typically a mandatory lock-in after the fact. A predictable low-cost source of revenue for the vendor regardless of the maturity of the ECM deployment.  Shelfware can be very lucrative.

Nuxeo has adopted a model so that the customer derives value from the same thing that we do.  When we sell a Nuxeo Connect subscription package, we've achieved our goal: revenue from an active customer project who values the support and maintenance we can provide. Nuxeo Connect helps ensure their project design and deployment is done in an optimal way. Long term success of an ECM deployment means we continue to grow. The updates to the Connect subscription program as well as ongoing investments and improvements in our customer support center demonstrate this commitment.  

Customers have the liberty of using our open source packaged applications to verify that the Nuxeo product meets their need via test installations, prototypes, and inspection of the APIs and underlying source if needed.  When the product is a fit, the client is then ready to engage with us for the premium support offering.  We benefit when we know the customer is solving content-centric problems and seeing business value from our technology.

Not before.  



January 28, 2010

Cheryl's Nuxeo Blog

ECM as a Platform? Recent Developments suggest YES

Interesting developments in the open source ECM world this week as Alfresco announced a change in their licensing model - now using LGPL.   Eric and I were dashing between customer meetings in Toronto when he read the news via Twitter (instead of navigating on Google Maps… but that's another story…). LGPL, of course, is the license model that Nuxeo has adopted for years.  

As customers, partners and analysts know, it was a very deliberate choice to go LGPL early in our company evolution.  LGPL is, in our perspective, the most business-friendly of the open source licenses for companies that develop software intended to be used as a platform.  It is the right license for Nuxeo, who builds software products that are intended to be a foundation for applications.

LGPL strives for balance - carefully protecting the source by requiring publication of any modifications to it - but gives a liberal use policy ensuring that it can be mixed with proprietary code without risk.  Our ECM foundation offering - Nuxeo EP - encourages a plug-in friendly platform, architected to be extensible and allowing a very wide range of horizontal and vertical applications to be built with it.  LGPL is an ideal license for software providers who envision ECM as a platform deserving widespread adoption.

An LGPL license approach combined with a company focus on generating revenue from maintenance and value-added tools & services might actually offer better market adoption potential and growth opportunities. (This model was pioneered by JBoss and was the model Nuxeo chose to adopt and refine).  The split-personality approach of GPL community edition vs commercially packaged supported offerings ("Commercial Open Source") can be a limitation when looking to innovate and extend core offerings with integrations and partner applications.

Collaborating with customers and partners, as well as building lasting technology alliances, are also simplified under LGPL. Customers help us stay innovative and respond quickly to new feature demands.  A great example was the contribution of the code to support OpenSocial by a key customer for our Nuxeo DM 5.3 release in October. Bringing social software application integration into our Nuxeo ECM offering keeps us current with increasing adoption of tools to support Enterprise 2.0 initiatives, and gives customers the assurance that the features they need stay open and available.  Partners and application builders can sell and package their value-added components in a way that makes sense for their business model - which might be quite different than ours.  And that's cool - the domain expertise we're cultivating in Life Sciences, Education, Construction/Engineering, Public Sector…. these Galaxy partners know their markets and can price and package accordingly.  Partners can make informed decisions about how to go to market with their content applications - they don't need Nuxeo to dictate a sales model.

So, "Welcome to the LGPL Tribe, Alfresco".  As the two front runners in open source ECM, we are both seeing adoption success at exponential rates, strengthening a business model and license approach that clearly works.  As more enterprises recognize that they are living in the knowledge-economy, viewing ECM as a platform for their content assets will become a mainstream view.   We're offering a way to do this by mitigating the risk and unknowns often perceived in models such as GPL.

But ultimately, it is *just* a license model.  An ECM platform needs to stand up to the full scrutiny of the technical architects and application builders who will deploy it.  And that's where we'll see the differentiation.  With large new customer deployments each month, a product roadmap driven by customer community needs, and our desire to stay ahead of the curve on ECM architecture, we all agree: 2010 is going to be a great year for Nuxeo.


January 21, 2010

Nuxeo Developers Blog

Nuxeo CMIS Update

Thanks to lots of progress in Apache Chemistry, to which Nuxeo is contributing, and through updated Nuxeo Chemistry bindings, the support for CMIS in Nuxeo is getting quite good.

For more practical info on using CMIS in Nuxeo, including download links, see http://doc.nuxeo.org/xwiki/bin/view/Main/CMIS.

Note that our demo server at http://cmis.demo.nuxeo.org/ has been updated as well.

Below are most of the new features available since the last release.

Better search

Fulltext search with CONTAINS() has been implemented so that you can do queries like:

SELECT cmis:name FROM cmis:document WHERE CONTAINS('foobar')

(The full scope of the fulltext search syntax, with ORing of words and negation, is not there yet.)

You can now also use the IN_TREE() and IN_FOLDER() predicates.

The SQL keywords are now case-insensitive as the spec requires, and complex boolean functions have been fixed.

More CRUD

A number of fundamental features form the CMIS domain model are now complete: object move, folder tree, folder descendants, delete, delete descendants.

Miscellaneous

Other fixes have been done: the types are served according to the latest 1.0CD06 draft, a number of fixes to make more CMIS clients happy have been included.

CMIS Shell

Finally, keep in mind that there is now an easy way to test a CMIS repository using a command line client. See the CMIS Shell blog post from Stéfane for more.

Stefane Fermigier's Nuxeo Blog

Announcing the CMIS Shell (cmissh) - command-line client for CMIS

We’ve been working recently on a CMIS command-line client, called “cmissh”, based on the Apache Chemistry client code.

We have decided to donate the code to the Apache Chemistry project, as there are no dependencies on Nuxeo code in it.

cmissh can be used interactively (with a nice autocompletion console) to explore and run CRUD operations on a CMIS server, or as a testing tool. We’ve included, for instance, a test script in the distribution, called ‘testscript’, that can be run against the Nuxeo demo server and will fail on errors. I’ve also been able to use cmissh against the Chemistry test server.

If you are busy, you can download a binary distribution (built just before the migration to Apache) from here:

http://www.nuxeo.org/static/cmis/cmissh-20100115.zip

(or look for a later build here: http://www.nuxeo.org/static/cmis/).

and test it against our public CMIS demo server (available here: http://cmis.demo.nuxeo.org/) using the “testscript” script included in the distribution.

Here is a sample session:

SFs-macbook% cmissh
CMIS Shell by Nuxeo (www.nuxeo.com). Type 'help' for help.
|:> help
Usage: help [command]

To get help of a specific command, type 'help name_of_command'.

List of available commands:

cat - Read the stream of the target document to the console
cd - Change working item
connect [open] - Open a new session
disconnect [close] - Close current session
dump [tree] - Dump a subtree
exit [bye|quit] - Exit
get [getstream] - Downloads the stream of the target document
help - Help
id - Identity of the specified entry
lcd - Change local working directory
lls [ll] - List local directory content
lpopd - Pop local directory stack
lpushd - Push local directory stack
lpwd - Print local working directory
ls - List entries in working directory
match - Fails if last command result doesn't match the pattern
mkdir - Create a folder given its name
mkfile [mkdoc] - Create a document of the given name
popd - Pop directory stack
propget - Print the value of the given property on the current context object
props - (Obsolete) Print the value of all the properties of the current context object
propset - Set the value of a property on the current context object
pushd - Push directory stack
put - Uploads the stream of the target document
pwd - Print working directory
rm [del] - Removes an object of the given name
setstream - Set the given file content as a stream on the current context object

|> connect http://Administrator:Administrator@cmis.demo.nuxeo.org/nuxeo/site/cmis/repository

|> ls
default

|> cd default

|cmis.demo.nuxeo.org:default> ls
default-domain

|cmis.demo.nuxeo.org:default> cd default-domain

|cmis.demo.nuxeo.org:default-domain> ls
workspaces
sections
templates

|cmis.demo.nuxeo.org:default-domain> cd workspaces

|cmis.demo.nuxeo.org:workspaces> ls
demo-workspace

|cmis.demo.nuxeo.org:workspaces> cd demo-workspace

|cmis.demo.nuxeo.org:demo-workspace> ls
pictures

|cmis.demo.nuxeo.org:demo-workspace> cd pictures

|cmis.demo.nuxeo.org:pictures> ls
pony-jpg
dog-jpg
cat-jpg

|cmis.demo.nuxeo.org:pictures> put /Users/fermigier/Pictures/sf-square.jpg 

|cmis.demo.nuxeo.org:pictures> ls
pony-jpg
dog-jpg
cat-jpg
sf-squared.jpg

|cmis.demo.nuxeo.org:pictures> propget sf-square.jpg
cmis:baseTypeId = cmis:document
cmis:changeToken = [null]
cmis:checkinComment = [null]
cmis:contentStreamFileName = sf-square.jpg
cmis:contentStreamId = [null]
cmis:contentStreamLength = [null]
cmis:contentStreamMimeType = [null]
cmis:createdBy = Administrator
cmis:creationDate = GregorianCalendar(2010-01-21T16:14:05.000+01:00)
cmis:isLatestMajorVersion = false
cmis:isLatestVersion = true
cmis:isMajorVersion = false
cmis:isVersionSeriesCheckedOut = false
cmis:lastModificationDate = GregorianCalendar(2010-01-21T16:14:05.000+01:00)
cmis:lastModifiedBy = Administrator
cmis:name = sf-square.jpg
cmis:objectId = 01e009cc-11fd-4f84-a710-5af9cc12a97c
cmis:objectTypeId = File
cmis:versionLabel = [null]
cmis:versionSeriesCheckedOutBy = [null]
cmis:versionSeriesCheckedOutId = [null]
cmis:versionSeriesId = 01e009cc-11fd-4f84-a710-5af9cc12a97c
dc:contributors = [Ljava.lang.String;@555c07d8
dc:coverage = [null]
dc:description = [null]
dc:expired = [null]
dc:format = [null]
dc:issued = [null]
dc:language = [null]
dc:rights = [null]
dc:source = [null]
dc:subjects = [null]
dc:title = sf-square.jpg
dc:valid = [null]
filename = [null]
icon = /icons/file.gif
icon-expanded = [null]
major_version = 1
minor_version = 0
size = [null]
uid = [null]

|cmis.demo.nuxeo.org:pictures> get sf-square.jpg
Object stream saved to local file: ./sf-square.jpg

|cmis.demo.nuxeo.org:pictures> lls
sf-square.jpg

|cmis.demo.nuxeo.org:pictures> id
Object 0a37ffea-fd65-4e78-b3bc-074168dd99f9 of type PictureBook

|cmis.demo.nuxeo.org:pictures> quit
Bye

January 20, 2010

Cheryl's Nuxeo Blog

Nuxeo World - We're Changing the Date to November 17-18, 2010

Many of you are heard over the last day that the Nuxeo management team has changed the date of our first annual User Conference - Nuxeo World. 

The announcement is here on our web page: http://www.nuxeo.com/en/about/news/nuxeo-world-moves-to-november  (Français ici: http://www.nuxeo.com/fr/societe/actualites/nuxeo-world-decale-novembre)

Not an easy decision - we had a solid response to our Early Bird Discount sign up period, and have been impressed with the range of topics submitted for the breakout sessions - representing 3 continents and several countries! 

But we needed to listen to a large segment of our customers and partners who found themselves in a bit of a time and budget crunch in mid-March.  We're anticipating a very strong representation from customers in our French market - and became concerned that we presented a conflict with Salon Documation also in Paris. And some of our North American partners are already committed to spring events such as OSBC and AIIM

So we have pushed the Nuxeo World Event - the premier gathering of open source ECM experts - to November. Same Paris location, at Echangeur, a technology innovation centre in the heart of the historic Le Marais district.  We'll be extending the Early Bird registration rate until July 2010, and will keep the Call for Papers open until March 1.  So if the original date held you back from signing up or submitting a session abstract, now's your chance to participate.

All of the current registrants have been personally contacted, and we're really pleased that nearly everyone is able to attend on the new dates.  For those very few who cannot attend in November, we're working to ensure your registration investment is appropriately credited.

So thanks to everyone for your patience.  We at Nuxeo are confident that this decision will result in a bigger, better, more vibrant event that will give high value for your conference fee.

Hmmm.. there was one more thing. What was I forgetting?  Oh yes.  Our closing reception on Thursday November 18 will celebrate one of my personal long running traditions.... Any guesses what that might be?

If any further questions about our date change, I'm very happy to address them. Please reach me via email - cmckinnon @ nuxeo.com

See you in November!

Cheryl McKinnon
CMO - Nuxeo
Boston | Paris 

January 18, 2010

Nuxeo Developers Blog

CMIS Examples with the Nuxeo ECM platform

I recently had the opportunity to play with CMIS AtomPub bindings, in collaboration with our partners in Canada, as they were building a VBScript API to access a Nuxeo repository via the CMIS standard from a Microsoft-based environment. I had no concrete idea of what CMIS really was, but I had read a few articles about this "greatest common factor of document management concepts between all vendors," as Florent tweeted once ;-).

I don't intend, in this blog post, to give a complete description of CMIS, or its AtomPub bindings. There are good posts and tutorials for this. I want to explain a few points that were not initially straightforward to me, hoping that this will accelerate your first experience with CMIS. You should not be confronted with raw XML, as we'll see in this post, as long as you use mainstream languages: java, c#, python, etc. Indeed, there are or will be libraries to let you handle plain objects and methods. But the following approach will be very useful if you want to interface your document repository with a legacy application written in a not-so-common language that doesn't benefit from projects like Chemistry, or if you just want to understand some basics of CMIS.

Let's start with a few concepts:

  • in CMIS, entities are called objects and are described in XML using the Atom syntax. You'll find in the Atom entry a full description of an object (properties, linked objects, URLs, etc.)

  • each object and main collection of objects are tied to an HTTP URL. You will process information with respect to the semantic of the HTTP method used to communicate with the server:

    • GET is used to retrieve information on the object
    • PUT is used to update an object
    • POST to create
    • DELETE to delete
  • CMIS server gives you, in its Atom answers, URLs to get or process all the information you need. You just have to parse the answer, looking for "rel" links that give you URLs to download attached files, children, renditions, etc. You don't have to obtain the information from anywhere else but the server, which allows you to develop highly interoperable code.

For the operations that come next, you need to deploy the Chemistry Libraries and the Nuxeo-Chemistry implementation on your Nuxeo instance (or be sure that you have any other CMIS-compliant server and adapt the lengthening of the URLs). Or, an even easier solution is to use our Nuxeo CMIS demo server which is reset everyday and frequently updated to take into account your feedback.

To send an HTTP request to the server, I will use "curl." You can also use "wget", or any other HTTP requester. In some of the requests, I need to send XML file content (most often an Atom entry). You will find up-to-date samples of those XML files in the chemistry source code; they are very instructive. I also attached to this blog post the Atom entries I used in the following samples.

Let's start with the concrete experiment :)

The initial URL, to get information on the repository will be, from a shell:

curl -uAdministrator:Administrator \
   "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/repository"

It mainly gives:

  • the capabilities of the repository
  • the URL of the CMIS collections (types, children of the root, query)
  • URL patterns that are accepted by the server, in order to get information on an object, to make a query, etc.

Here is an extract of the server's answer:

  <?xml version='1.0' encoding='UTF-8'?>
  <service xmlns="http://www.w3.org/2007/app" xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
       xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
        <workspace>
            <title xmlns="http://www.w3.org/2005/Atom" type="text">default</title>
          <cmisra:repositoryInfo>
                <cmis:repositoryId>default</cmis:repositoryId>
              ...
                <cmis:rootFolderId>4fb1b8a1-6dfd-4da4-95b0-4ef41c27b920</cmis:rootFolderId>
                <cmis:latestChangeLogToken></cmis:latestChangeLogToken>
                <cmis:capabilities>
                <cmis:capabilityACL>none</cmis:capabilityACL>
                <cmis:capabilityAllVersionsSearchable>true</cmis:capabilityAllVersionsSearchable>
                <cmis:capabilityChanges>none</cmis:capabilityChanges>
                <cmis:capabilityContentStreamUpdatability>anytime</cmis:capabilityContentStreamUpdatability>
                <cmis:capabilityGetDescendants>false</cmis:capabilityGetDescendants>
              ...
              </cmis:capabilities>
            ...
            </cmisra:repositoryInfo>
            <collection href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/typechildren">
            <title xmlns="http://www.w3.org/2005/Atom" type="text">Types</title>
            <cmisra:collectionType>types</cmisra:collectionType>
            </collection>
            <collection href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/query">
            <title xmlns="http://www.w3.org/2005/Atom" type="text">query
                collection</title>
                <cmisra:collectionType>query</cmisra:collectionType>
                </collection>
                <collection
                href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/children/4fb1b8a1-6dfd-4da4-95b0-4ef41c27b920">
                <title xmlns="http://www.w3.org/2005/Atom" type="text">children
                collection</title>
                <cmisra:collectionType>root</cmisra:collectionType>
                </collection>
                ...
                <cmisra:uritemplate>
                <cmisra:type>objectbyid</cmisra:type>
                <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
                                        <cmisra:template>http://cmis.demo.nuxeo.org/nuxeo/site/cmis/object/{id}?filter={filter}&amp;renditionFilter={renditionFilter}&amp;includeRelationships={includeRelationships}&amp;includeAllowableActions={includeAllowableActions}&amp;includePolicyIds={includePolicyIds}&amp;includeACL={includeACL}</cmisra:template>


        ...
        </workspace>
        </service>

You need to look for the children root collection URL to start browsing following the repository hierarchy.

curl -uAdministrator:Administrator \
    "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/children/4fb1b8a1-6dfd-4da4-95b0-4ef41c27b920"

Doing so, you will receive a feed of atom entries which is actually the collection of children of the root. Here is the atom entry associated to "default domain" in Nuxeo:

  <entry xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
    <id>urn:uuid:4593d0e5-fa7f-4ae1-9472-3030c270bb1e</id>
        <title type="text">default-domain</title>
        <updated>2010-01-11T11:49:20.036Z</updated>
        <author>
        <name>system</name>
        </author>
        <summary type="text">default-domain</summary>
        <link href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/repository"
        rel="service" type="application/atomsvc+xml" />
        <link
        href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/object/4593d0e5-fa7f-4ae1-9472-3030c270bb1e"
        rel="self" type="application/atom+xml; type=entry" />
        <link
        href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/object/4593d0e5-fa7f-4ae1-9472-3030c270bb1e"
        rel="edit" type="application/atom+xml; type=entry" />
        <link
        href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/object/4593d0e5-fa7f-4ae1-9472-3030c270bb1e"
        rel="alternate" type="application/atom+xml; type=entry" />
        <link href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/type/Domain"
        rel="describedby" type="application/atom+xml; type=entry" />
        <link
        href="http://cmis.demo.nuxeo.org/nuxeo/site/cmis/object/4fb1b8a1-6dfd-4da4-95b0-4ef41c27b920"
        rel="up" type="application/atom+xml; type=entry" />
        ...
        <cmisra:object>
        <cmis:properties>
            <cmis:propertyString propertyDefinitionId="cmis:path"
                localName="def:path" displayName="Path">
                <cmis:value>/default-domain</cmis:value>
                </cmis:propertyString>
                <cmis:propertyId propertyDefinitionId="cmis:objectTypeId"
                localName="def:typeid" displayName="Type ID">
                <cmis:value>Domain</cmis:value>
                </cmis:propertyId>
                <cmis:propertyString propertyDefinitionId="content_roots"
                localName="def:nx:content_roots" displayName="content_roots" />
                <cmis:propertyString propertyDefinitionId="dc:description"
                localName="def:nx:dc:description" displayName="dc:description">
                <cmis:value>Nuxeo 5 default domain</cmis:value>
                </cmis:propertyString>
                <cmis:propertyString propertyDefinitionId="cmis:lastModifiedBy"
                localName="def:lastmodifiedby" displayName="Last Modified By">
                <cmis:value>system</cmis:value>
                </cmis:propertyString>
                <cmis:propertyString propertyDefinitionId="cmis:createdBy"
                localName="def:createdby" displayName="Created By">
                <cmis:value>system</cmis:value>
                </cmis:propertyString>
                <cmis:propertyString propertyDefinitionId="dc:subjects"
                localName="def:nx:dc:subjects" displayName="dc:subjects" />
                <cmis:propertyString propertyDefinitionId="dc:title"
                localName="def:nx:dc:title" displayName="dc:title">
                <cmis:value>Default domain</cmis:value>
                </cmis:propertyString>
                <cmis:propertyString propertyDefinitionId="icon"
                localName="def:nx:icon" displayName="icon">
                <cmis:value>/icons/domain.gif</cmis:value>
                </cmis:propertyString>
                <cmis:propertyString propertyDefinitionId="cmis:name"
                localName="def:name" displayName="Name">
                <cmis:value>default-domain</cmis:value>
                </cmis:propertyString>
                <cmis:propertyString propertyDefinitionId="dc:contributors"
                localName="def:nx:dc:contributors" displayName="dc:contributors">
                <cmis:value>system</cmis:value>
                </cmis:propertyString>
                <cmis:propertyDateTime propertyDefinitionId="cmis:creationDate"
                localName="def:creationdate" displayName="Creation Date">
                <cmis:value>2010-01-11T12:49:20+01:00
                </cmis:value>
                </cmis:propertyDateTime>
                ...
            </cmis:properties>
        </cmisra:object>
    </entry>

What is this Atom entry? It is the representation of the state of the object whose ID is 4593d0e5-fa7f-4ae1-9472-3030c270bb1e, transferred by the CMIS server (on top of our Nuxeo repository). You will find mainly four parts in it:

  • the Atom header, with elements id, title, updated, summary.
  • the content field (when it is "document", not a "folder") or an "alternate" element, that gives a URI to a remote content
  • the links associated to the document that give the URLs to request to perform operations on the object, such as service, self (the URL of the object), edit (to modify the object), alternate, described, up, down (we will see later the use of those links).
  • the cmisra object description, and among them you will find the custom type property values.

For some operations (like create or update metadata), and depending on how rigorous the implementation is, you need to be sure that:

  • the id element is not null
  • the title element is not null
  • the author or source is not null
  • either alternate link or content is not null

If you miss one of those rules, your request will be rejected. Now let's go with basic operations.

  1. To browse the repository, use the up and down links:

    curl -uAdministrator:Administrator \
      "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/children/4593d0e5-fa7f-4ae1-9472-3030c270bb1e"
    

    In the result of the previous command, where I asked for the children of the "Default domain" node, I looked for the string "workspaces" to get the id of the workspaces object. I can then send a request to get the children of the workspaces node, etc.

  2. To create a folder: Let's suppose you want to create a folder "myfolder" under the object of id "A", you will do a POST to the URL of the object that represents the collection of the children of "A". You get this URL by looking for the URL of type rel="down", and whose content-type is application/atom+xml;type=feed. Take care not to take the "tree" object, which is of type application/cmistree+xml and returns the hierarchy of descendants.

    curl -X POST -uAdministrator:Administrator \
      "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/children/5af586f4-6221-4ad5-8bc6-7c34d247bc2b" \
      -H "Content-Type:application/atom+xml;type=entry" \
      -d @ $localh_path/createfolder.atomentry.xml
    

    Note the header variables. If you forget to mention them, your request will not be processed successfully. The result of the previous request is an Atom entry corresponding to the newly created object. Note also that I specified in the Atom entry the Nuxeo custom type I wanted to use: "Workspace":

    <cmisra:object>
        <cmis:properties>
          <cmis:propertyId propertyDefinitionId="cmis:objectTypeId">
            <cmis:value>Workspace</cmis:value>
          </cmis:propertyId>
        </cmis:properties>
      </cmisra:object>
    

    I can check, by browsing Nuxeo DM, that my folder has been created.

  3. Document creation: To create a document with content in this folder, there are basically two methods:

    • either you create an empty document (without the binary file, just the metadata) and then you update the content using the edit-media link (two requests).
    • or you create the document with the content in the Atom entry (content element) encoded in base64 (one request only).

    Let's go with the first one. You need to prepare your Atom entry (basically get the one used for folder creation, and modify cmis:objectTypeId element with value "File"). Note that if you choose cmis:folder, or cmis:document, the Nuxeo implementation will map to Folder and File types. Also, the summary element is mapped to dc:description, title to the document name (and dc:title). The ID value you put in that case is not very important (not taken into account), but it should not be null.

    curl -X POST -uAdministrator:Administrator \
      "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/children/191c4778-6f8a-4dc0-9733-6e39725366f9" \
      -H  "Content-Type:application/atom+xml;type=entry" \
      -d @$PATH/createdocument.atomentry.xml
    

    In the resulting Atom entry, look for the link edit-media. You will be able to upload a file through that URL :

    curl -X PUT -uAdministrator:Administrator \
      "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/file/a0fe9d4f-1805-4c3d-b69c-eb44dd70d25f" \
      -H "Content-Type:application/pdf" \
      -H "Slug:NuxeoStudioOverview.pdf" \
      -d @$PATH/NuxeoStudioOverview.pdf
    

    Note here the Slug header parameter, to give the file name, as well as the Content-Type header parameter.

  4. Metadata update: To update your document's metadata, you need to PUT an Atom entry on the edit URL of the object, adding the values of the metadata you want to update under the element cmis:properties of the Atom entry describing the object. Let's say you want to update the title and to enter the "language" metadata of the previously created document. Metadata "language" belongs to the Dublin Core schema in Nuxeo.

    Here is the most interesting part of the updatedocument.atomentry.xml Atom entry:

      <cmisra:object>
      <cmis:properties>
        <cmis:propertyId propertyDefinitionId="cmis:objectTypeId">
          <cmis:value>File</cmis:value>
        </cmis:propertyId>
        <cmis:propertyString propertyDefinitionId="dc:title">
          <cmis:value>Change the title of the document using CMIS
          </cmis:value>
        </cmis:propertyString>
        <cmis:propertyString propertyDefinitionId="dc:language">
          <cmis:value>EN</cmis:value>
        </cmis:propertyString>
        </cmis:properties>
      </cmisra:object>
    

    Note under cmis:properties you find only the desired metadata plus the cmis:objectTypeId property, which is mandatory to avoid an error (ndlr:this should be verified).

    curl -X PUT -uAdministrator:Administrator \
      "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/object/a0fe9d4f-1805-4c3d-b69c-eb44dd70d25f" \
      -H "Content-Type:application/atom+xml;type=entry" \
      -d @$path/updatedocument.atomentry.xml
    
  5. Document deletion:

    • To delete the document, you can use the self URL in combination with DELETE method:

      curl -X DELETE -uAdministrator:Administrator \
        "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/object/a0fe9d4f-1805-4c3d-b69c-eb44dd70d25f"
      
    • To delete a non-empty folder, you need to perform the delete on the tree object, so you need to use the down link that returns an application/cmistree+xml object:

      curl -X DELETE -v -uAdministrator:Administrator \
        "http://cmis.demo.nuxeo.org/nuxeo/site/cmis/descendants/67df3f01-a4e5-4173-b685-88742cf22471"
      

Download AtomSamples

Don't miss a thing!

AddThis Feed Button

Our blogs

- (feed) Cheryl's Nuxeo Blog
- (feed) Eric's Nuxeo Blog
- (feed) Nuxeo Developers Blog
- (feed) Nuxeo Lounge
- (feed) Stefane Fermigier's Nuxeo Blog

Last updated:
March 13, 2010 01:20 AM
All times are UTC.

Powered by:
Planet

 

Our tweets

About Us

We're the friendly employees of Nuxeo, a leading open source software vendor, which develops a complete Enterprise Content Management (ECM) software platform to help companies better produce, process, publish, archive, expose and find their information from digital assets to transactional documents.

» Follow us @nuxeo (Twitter)

» Connect on LinkedIn

» Visit Nuxeo.com

 

Download Nuxeo DM Nuxeo DM Screencasts Nuxeo Products