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

January 17, 2010

Cheryl's Nuxeo Blog

ECM for Life Sciences – Balancing Business Needs with Regulatory Requirements

On January 14, Nuxeo was pleased to host a webinar jointly with Galaxy Partner Carnegie Technology Associates (CTA).  Was great to share the virtual stage with Lawrence Rich, consultant and partner at CTA.

An exciting time for Nuxeo as we kick off 2010 with more joint efforts with our Galaxy partner community, and embark on a deeper level of industry and vertical marketing campaigns, starting with Life Sciences.

The regulatory and compliance burdens on biotech, pharmaceutical and medical research companies are among the most stringent across vertical markets, and content management requirements can be onerous. Vast amount of research - high value intellectual property - as well as patents, patient data, packaging and labeling content - all require rigorous management controls to ensure information is captured, protected, preserved and secured in accordance with both internally and externally mandated procedures.

ECM has long been a core infrastructure need in Life Sciences - but as Nuxeo and CTA see it, companies in startup phase or early stage research need to have ECM options available to them at reasonable and fair costs - without giving up the functionality demanded by business managers and regulatory bodies.  Open source ECM helps fuel innovation and level the playing field allowing smaller, leaner, cutting edge research companies in Life Sciences to compete and succeed.


If you missed the webinar, please check out the slide deck here on SlideShare, and please reach out to us for any further information on the joint CTA/Nuxeo Life Sciences ECM offering.

CTA has also written a Whitepaper - "Nuxeo and the Life Sciences" - PDF download available here.


January 15, 2010

Nuxeo Developers Blog

GWT Integration for Nuxeo

I've added recently a new project in nuxeo-webengine: nuxeo-webengine-gwt

This project provides the capability to develop GWT applications in Eclipse and launch an embedded Nuxeo Server as part of the GWT dev. mode server to be able to debug your Nuxeo GWT applications inside eclipse (without the need to deploy it on a real Nuxeo server).

Also it provides a mechanism to transparently deploy the compiled GWT applications in Nuxeo WebEngine (without the need to create separate WARs).

Nuxeo GWT applications are packaged as regular Nuxeo bundles.
Also you can make use of the GWT RPC mechanism in your application without worrying about RPC servlets deployment in Nuxeo.

The GWT applications can be exposed to clients either through WebEngine objects, JAX-RS objects or custom servlets.

Note that this bundle is not yet part of any Nuxeo distribution so you need to put it by hand in your nuxeo server.

You can find more documentation about this here:

http://doc.nuxeo.org/xwiki/bin/view/FAQ/GWT+Integration+for+Nuxeo

December 28, 2009

Cheryl's Nuxeo Blog

Words That Deserve to Disappear in 2010

Please consider this post to be somewhat tongue-in-cheek, in the spirit of out with the old and in with the new as we close out 2009. But as a marketer and passionate defender of the importance of ECM, there are a few expressions and terms that deserve a rest - or at least a rethink of how and why we use them.

(In no particular order)

Compliance
This term has been bugging me for years. No - I am not suggesting that companies neglect requirements to protect, secure, disclose or destroy records or establish clear retention and access rules.  But the term "compliance" has been tossed around as lazy shorthand by ECM vendors and consultants for years.  I often want to scream - Compliance? ... WITH WHAT?  Compliance does not mean records management. Nor does records management mean compliance.  The term means entirely different things to different audiences - the SOX officer, the HR manager, the ISO 9000 auditor, the Webmaster - all have very different requirements to be compliant with the specific laws, rules, standards or policies that affect their work.

Compliance as an end goal is wrong. Compliance should be the natural outcome of doing good business. Let's be a little more specific as vendors. 
And using 'compliance' as a some vague threat to throw cold water on technologies that accelerate collaboration, network building and innovation is dead in my books.

Brand 
The next social media guru who starts spouting off about "personal brand" better actually have a red-hot iron in his hand and be prepared to use it.  Nothing screams phony more than a carefully crafted online persona with photoshopped avatar and stream of tweets that sound like a bumper sticker. I'm much more a fan of an authentic voice - a consistent personality that seems real whether in person or online. A semblance of humility, eagerness to learn, and a willingness to share.

'Brand' has become so terribly overused - it's the default term when really what is meant is "company", "product", "reputation", "values".  Why not say what you mean?

Strategy

Everything today is called 'strategic'. Guess what? No. It is not.  Strategic is that which has a game plan crafted like a chess player -  a set of moves mapped out several in advance, and accomodating for a range of options beyond your control. Supporting a new platform, implementing a new process, most technology alliances - really are opportunistic and tactical - not strategic. Let's not over-inflate.  And what's wrong with the tactical? Strategy is useless without the execution. More people and companies need to focus on talking up their execution success, and worry less about being perceived as strategic. Maybe it's just me, but when I read a LinkedIn profile that is all about strategic thinking, I wonder... that's nice, but what can you do?
 
Evangelist
This term conjures up a visual of the 1990s for me: the phony fire and brimstone TV performer but wearing the dotcom uniform of khakis and a company-logoed golf shirt.  If you have to tell someone you're an evangelist, you probably aren't. Evangelist is not a job title, it's a state of mind. And as the tech market matures, aren't we getting tired of the cult of personality telling us what to believe?  Why don't we all work harder to become educators instead.


I had a couple of other suggestions via Twitter last week... "alignment", "resource" and "enterprise". What sayeth you? What other terms are ready for a rest?

December 23, 2009

Nuxeo Lounge

Manage Word document templates

Hello ! 

Today, the screencast is about Word templates management. I recently took part in a great prototype preparation where one of the requirements was to show the ability of updating the content of a word document programatically, to be able to use word templates to instantiate documents. The plugin developed to achieve this goal is committed in an internal sandbox currently, but  I think it is interesting to share what has been done there so far.

Happy holidays !

December 17, 2009

Eric's Nuxeo Blog

Recruiting 2.0 @ Nuxeo - a real world story

Dream-job-signal As you might have noticed, in September we (proudly) welcomed a new member of our executive team, Cheryl McKinnon has joined to lead our marketing, bringing many years of ECM experience from big name players.

Cheryl is a key member of our executive team and I am proud to have her on board: she brings deep knowledge of ECM alongside great sense or marketing. It's a unusual hire for a company like Nuxeo. I believe the hiring process is a very interesting aspect of this story... It's a total "2.0" process.

Earlier this month, Cheryl organized and hosted a workshop for tech professionals who needed to get back into the job market – a move that 'went viral'. She has lived the new Recruiting 2.0 experience and offered to share her learnings with others – because this is how we found her:

For several months I was thinking of finding a CMO to accelerate and strengthen our go-to-market strategy, as well add some serious brain power and experience in the field of ECM to our company. It wasn't an active search at first – it took time to imagine the profile I was looking for. Once figured out, it became one of those sticky ideas I get sometimes... I had to fix this!

I considered several options to find the right person:

  1. Hunter Route -> great to find the typical "world-class marketing guy" but he/she might miss the twist that I was after. Plus I wasn't sure I could properly explain the profile, let alone assuming the head hunter really gets it. :-)

  2. Wait for somebody to send a resume spontaneously -> can work, but I wasn't confident in the exact timeline for obvious reasons! :-)

  3. Find her/him myself using my own (limited) resources.

As the first route seemed wrong (and/or too expensive) and the second one too uncertain I went for the third one and started to work on the topic.

I wanted an "ECM expert / Web 2.0 thinker / social media pundit / community-aware marketer". That would have been the first brief for a head-hunter. Hence, I headed to LinkedIn: refined searches, careful manual review of profiles (including blog / twitter-feed reading).

Applying several rules: proper Linkedin profile, a professional blog, a twitter account, some activities in social media and communities of practice. But more than anything, I was looking for the "twist", the small things, difficult to describe, that make a person right for a particular job at our company. The thing that makes your company special and that is so difficult to describe. I was looking for "Nuxeo's CMO", not "a CMO".

I ended up with a very small hand-picked group of people that seemed to fit the profile. Next, I sent an intro email to explain the opportunity, got answers, (lot of) calls, in person meetings, explained and discussed about vision and strategy. Kind of a standard hiring process, actually, for a key position. With a difference, however, from the old times... I would never had been able to do it, just 5 years ago. LinkedIn, social media, blogs and twitter made that possible: find great people for key position in (close to) no time. Less time than describing such a complex profile and complex position to a head hunter actually.

I now use this approach for all key positions in the company: you don't find us, we find you (well, if you find us that's cool too...). The social web is just a wonderful opportunity for great companies to find great people and for great people to find great companies. It enables to hear the voice of the talents and connect with them, before the first interview. That's a brand new way of seeing the hiring process. This would have been completely impossible just 5 years ago. And I don't think we're an isolated case, my wife has been hunted and hired the same way a few month ago (which is maybe what got me started with this approach, actually).

As a CEO, it's the most valuable result I'm getting from social media: being able to connect and engage with great people that can join and strengthen the company, at no cost (except participating to the system, being very open and transparent). I have access to a virtually unlimited pool of talent: just need to pay attention and look for people. This is a huge opportunity, totally new compared to what our predecessors had to deal with. And a great threat for those who don't get it.

We're living amazing times...

EB.

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) Nuxeo Studio
- (feed) Stefane Fermigier's Nuxeo Blog

Last updated:
February 09, 2010 12:00 PM
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