<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Florent&#039;s Nuxeo Blog</title>
	<atom:link href="http://fguillaume.blogs.nuxeo.com/feed" rel="self" type="application/rss+xml" />
	<link>http://fguillaume.blogs.nuxeo.com</link>
	<description></description>
	<lastBuildDate>Wed, 18 Jan 2012 14:52:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Querying Complex Schemas in Nuxeo With NXQL</title>
		<link>http://fguillaume.blogs.nuxeo.com/2011/09/querying-complex-schemas-in-nuxeo-with-nxql.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2011/09/querying-complex-schemas-in-nuxeo-with-nxql.html#comments</comments>
		<pubDate>Fri, 09 Sep 2011 14:27:05 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[Nuxeo]]></category>
		<category><![CDATA[nuxeo]]></category>
		<category><![CDATA[nxql]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2011/09/querying-complex-schemas-in-nuxeo-with-nxql.html</guid>
		<description><![CDATA[<p>From the start, as we think it&#039;s important for a real <a href="http://www.nuxeo.com/en/products/enterprise-platform" target="_blank" title="Nuxeo Content Management Platform">content management platform</a>, Nuxeo has had the ability to send requests to the document repository using a SQL-like language that we call <a href="http://doc.nuxeo.com/x/uItH" target="_self">NXQL</a>. This allows you to do things like:</p>
<p><tt>SELECT * FROM Document WHERE dc:title = &#039;Some Report&#039;</tt></p>
<p>or:</p>
<p><tt>SELECT * FROM Document WHERE dc:modified &#62; DATE &#039;2011-08-01&#039;</tt></p>
<p>or more complex:</p>
<p><tt>SELECT * FROM Note WHERE dc:modified &#62; TIMESTAMP &#039;2011-08-01 12:43:38&#039; AND ecm:fulltext = &#039;merger OR ipo&#039; AND dc:lastContribtor IN (&#039;bob&#039;, &#039;john&#039;) AND (m:priority BETWEEN 1 AND 5 OR m:level &#62; 1000)</tt></p>
<p>Of course you can mix all standard operators, add parentheses, OR, etc. More details about NXQL are available at <a href="http://doc.nuxeo.com/x/uItH" target="_self">http://doc.nuxeo.com/x/uItH</a>.</p>
<p>But one limitation of NXQL used to be that, although Nuxeo can store and retrieve &#34;deep&#34; complex properties in its documents, there was no immediate way to use them in queries written in &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2011/09/querying-complex-schemas-in-nuxeo-with-nxql.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>From the start, as we think it&#039;s important for a real <a href="http://www.nuxeo.com/en/products/enterprise-platform" target="_blank" title="Nuxeo Content Management Platform">content management platform</a>, Nuxeo has had the ability to send requests to the document repository using a SQL-like language that we call <a href="http://doc.nuxeo.com/x/uItH" target="_self">NXQL</a>. This allows you to do things like:</p>
<p><tt>SELECT * FROM Document WHERE dc:title = &#039;Some Report&#039;</tt></p>
<p>or:</p>
<p><tt>SELECT * FROM Document WHERE dc:modified &gt; DATE &#039;2011-08-01&#039;</tt></p>
<p>or more complex:</p>
<p><tt>SELECT * FROM Note WHERE dc:modified &gt; TIMESTAMP &#039;2011-08-01 12:43:38&#039; AND ecm:fulltext = &#039;merger OR ipo&#039; AND dc:lastContribtor IN (&#039;bob&#039;, &#039;john&#039;) AND (m:priority BETWEEN 1 AND 5 OR m:level &gt; 1000)</tt></p>
<p>Of course you can mix all standard operators, add parentheses, OR, etc. More details about NXQL are available at <a href="http://doc.nuxeo.com/x/uItH" target="_self">http://doc.nuxeo.com/x/uItH</a>.</p>
<p>But one limitation of NXQL used to be that, although Nuxeo can store and retrieve &quot;deep&quot; complex properties in its documents, there was no immediate way to use them in queries written in NXQL. We call complex properties those from documents described by an <a href="http://www.w3.org/TR/xmlschema-0/" target="_self">XML Schema</a> that includes a <tt>&lt;xs:simpleType&gt;</tt> with a <tt>&lt;xs:list&gt;</tt>, or a <tt>&lt;xs:complexType&gt;</tt> with optionally a <tt>&lt;xs:sequence&gt;</tt>. Such schemas provide complex data modeling options to the developer, and are used a lot to store deeply structured objects in one document.</p>
<p>Starting with <strong>Nuxeo 5.4.3</strong>, the limitations on querying these complex schemas have been lifted, and you can now do queries on them!</p>
<p>Here are some sample queries that you could not make before Nuxeo 5.4.3, and are now possible:</p>
<p>The documents where the first subject is &#039;test&#039;:</p>
<p><tt>SELECT * FROM Document WHERE dc:subjects/0 = &#039;test&#039;</tt></p>
<p>All the possible subjects starting with &#039;test&#039;:</p>
<p><tt>SELECT DISTINCT dc:subjects/*1 FROM Document WHERE dc:subjects/*1 LIKE &#039;test%&#039;</tt></p>
<p>The files less that one KB:</p>
<p><tt>SELECT * FROM File WHERE content/length &lt; 1024</tt></p>
<p>The files sorted by size:</p>
<p><tt>SELECT * FROM File ORDER BY content/length DESC</tt></p>
<p>The files with a given file name:</p>
<p><tt>SELECT * FROM File WHERE content/name = &#039;report.doc&#039;</tt></p>
<p>The JPEG files, by filtering on the MIME type:</p>
<p><tt>SELECT * FROM File WHERE content/mime-type = &#039;image/jpeg&#039;</tt></p>
<p>The documents where the first attached file is more than one KB:</p>
<p><tt>SELECT * FROM Document WHERE files/0/length &gt;= 1024</tt></p>
<p>The documents with an attached text file and an attached file of length 0:</p>
<p><tt>SELECT * FROM Document WHERE files/*/name LIKE &#039;%.txt&#039; AND files/*/length = 0</tt></p>
<p>The documents with an attached file of type text and of length 0:</p>
<p><tt>SELECT * FROM Document WHERE files/*1/name LIKE &#039;%.txt&#039; AND files/*1/length = 0</tt></p>
<p>Note the difference, the second request needs to correlate the two file instances in the two clauses, which is why we use a special <tt>*n</tt> syntax to tell the query engine that this is the same one. The number after the <tt>*</tt> is arbitrary, but all the uses of <tt>files/*n</tt> with a given <tt>n</tt> will refer to the same file.</p>
<p>Using these new query capabilities, developers will now have full access to their data model from NXQL, and will no more have to drop to ad-hoc hibernate queries to do this kind of query.</p>
<p>One cautionary note to end this post: these NXQL queries are turned into SQL queries that use a number of JOIN operations, and the execution of such queries has its price if your database is not tuned correctly. Please note that just because you can make queries does not mean they will automatically be efficient, ensuring this is the job of a data architect and a DBA — this is true for any system, not just Nuxeo.</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2011/09/querying-complex-schemas-in-nuxeo-with-nxql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Chemistry Goes TLP</title>
		<link>http://fguillaume.blogs.nuxeo.com/2011/02/apache-chemistry-goes-tlp.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2011/02/apache-chemistry-goes-tlp.html#comments</comments>
		<pubDate>Thu, 24 Feb 2011 15:07:23 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[CMIS]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nuxeo]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2011/02/apache-chemistry-goes-tlp.html</guid>
		<description><![CDATA[<p>Just a few days ago <a href="http://chemistry.apache.org/" target="_self">Apache Chemistry</a> <a href="https://blogs.apache.org/foundation/entry/the_apache_software_foundation_announces11" target="_self">became a top-level project</a> (TLP) of the Apache Software Foundation (ASF).&#160;As a reminder, Chemistry provides client libraries implementing the <a href="http://docs.oasis-open.org/cmis/CMIS/v1.0/cmis-spec-v1.0.html" target="_self">CMIS</a> spec in Java, Python, PHP and .NET, and a server-oriented library for Java. Learn more about this on the&#160;<a href="http://chemistry.apache.org/" target="_self">Chemistry page</a>.</p>
<p>Before becoming a TLP, Chemistry was just an <em>incubating</em> project, guided in its growth by the Incubator, like all Apache projects when they begin life in the ASF. So what does the move to a TLP signify? Briefly:</p>
<ul>
<li>the project&#039;s scope is now clearly established,</li>
<li>the community around it has been deemed large enough to sustain the project,</li>
<li>a&#160;Project Management Committee (PMC) has been formed to make internal decisions,</li>
<li>the PMC and other committers have become acquainted with the <a href="http://www.apache.org/foundation/how-it-works.html" target="_self">Apache Way</a> of doing things,</li>
<li>successful releases of the software have been done.</li>
</ul>
<p>Now that Chemistry is a TLP, it means a &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2011/02/apache-chemistry-goes-tlp.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>Just a few days ago <a href="http://chemistry.apache.org/" target="_self">Apache Chemistry</a> <a href="https://blogs.apache.org/foundation/entry/the_apache_software_foundation_announces11" target="_self">became a top-level project</a> (TLP) of the Apache Software Foundation (ASF).&#160;As a reminder, Chemistry provides client libraries implementing the <a href="http://docs.oasis-open.org/cmis/CMIS/v1.0/cmis-spec-v1.0.html" target="_self">CMIS</a> spec in Java, Python, PHP and .NET, and a server-oriented library for Java. Learn more about this on the&#160;<a href="http://chemistry.apache.org/" target="_self">Chemistry page</a>.</p>
<p>Before becoming a TLP, Chemistry was just an <em>incubating</em> project, guided in its growth by the Incubator, like all Apache projects when they begin life in the ASF. So what does the move to a TLP signify? Briefly:</p>
<ul>
<li>the project&#039;s scope is now clearly established,</li>
<li>the community around it has been deemed large enough to sustain the project,</li>
<li>a&#160;Project Management Committee (PMC) has been formed to make internal decisions,</li>
<li>the PMC and other committers have become acquainted with the <a href="http://www.apache.org/foundation/how-it-works.html" target="_self">Apache Way</a> of doing things,</li>
<li>successful releases of the software have been done.</li>
</ul>
<p>Now that Chemistry is a TLP, it means a number of things:</p>
<ul>
<li>the project has now top-level visibility, like all other Apache projects,</li>
<li>it should be perceived as mature by other developers (even though we&#039;re not yet at 1.0),</li>
<li>Chemistry will be able to decide by itself when to do new releases without oversight from the Incubator&#039;s PMC.</li>
</ul>
<p>For <a href="http://community.nuxeo.com/" target="_self">Nuxeo</a> this means that we are more confident than ever that our involvement in the development of Chemistry under the Apache umbrella was the right choice. Thanks to Chemistry our <a href="http://www.nuxeo.com/en/products" target="_self">products</a> have top-notch support for CMIS, and we know this will continue to be the case in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2011/02/apache-chemistry-goes-tlp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuxeo and Java EE</title>
		<link>http://fguillaume.blogs.nuxeo.com/2011/02/nuxeo-and-java-ee.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2011/02/nuxeo-and-java-ee.html#comments</comments>
		<pubDate>Wed, 16 Feb 2011 18:06:47 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[ECM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nuxeo]]></category>
		<category><![CDATA[Standards]]></category>
		<category><![CDATA[java ee]]></category>
		<category><![CDATA[javaee]]></category>
		<category><![CDATA[nuxeo]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2011/02/nuxeo-and-java-ee.html</guid>
		<description><![CDATA[<p>A question we often get is &#34;Is Nuxeo Java EE compliant? Does it run in my preferred application server?&#34;.</p>
<p>Nuxeo has actually very little adherence to the Java EE&#160;spec.&#160;We use technologies like JPA, JSF or Servlets that are included in Java EE 6, but they predate it, so most containers already include them, and if not they can be used as simple libraries that are wildly&#160;available.&#160;We don&#039;t require EJBs, and we don&#039;t require JMS (although they&#160;<em>can</em>&#160;be used).</p>
<p>The only things we need really from Java EE that are usually not available outside of it are JTA (transaction management) and JCA (connector architecture with pooling and transactional support).&#160;And because we want Nuxeo to be able to run in non-Java EE&#160;containers, we have developed an optional module&#160;(called nuxeo-runtime-jtajca) providing the JTA and JCA infrastructure when needed. This module is based on code from the Apache Geronimo project.</p>
<p>The result is &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2011/02/nuxeo-and-java-ee.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>A question we often get is &quot;Is Nuxeo Java EE compliant? Does it run in my preferred application server?&quot;.</p>
<p>Nuxeo has actually very little adherence to the Java EE&#160;spec.&#160;We use technologies like JPA, JSF or Servlets that are included in Java EE 6, but they predate it, so most containers already include them, and if not they can be used as simple libraries that are wildly&#160;available.&#160;We don&#039;t require EJBs, and we don&#039;t require JMS (although they&#160;<em>can</em>&#160;be used).</p>
<p>The only things we need really from Java EE that are usually not available outside of it are JTA (transaction management) and JCA (connector architecture with pooling and transactional support).&#160;And because we want Nuxeo to be able to run in non-Java EE&#160;containers, we have developed an optional module&#160;(called nuxeo-runtime-jtajca) providing the JTA and JCA infrastructure when needed. This module is based on code from the Apache Geronimo project.</p>
<p>The result is that, provided the necessary deployment&#160;features are there, we can run out of the box in:</p>
<ul>
<li>Full embedded (no container),</li>
<li>OSGi,</li>
<li>Jetty,</li>
<li>Tomcat,</li>
<li>JBoss,</li>
<li>and more could be added.</li>
</ul>
<p>The important part in the above is &quot;provided the necessary&#160;deployment features are there&quot;. Because Nuxeo has a specific&#160;modular extension model not available in any spec (see our&#160;<a href="http://doc.nuxeo.com/display/NXDOC/Component+model+overview#Componentmodeloverview-ExtensionPoints" target="_blank">Component model overview</a>),&#160;we need, for the Nuxeo Runtime to work, to plug into the&#160;container&#039;s startup and deployment model.</p>
<p>For each container we have to write a small&#160;container-specific piece of code to be able to control the deployment order of our JARs, scan&#160;them, analyze what extension points are present, and inject&#160;their configuration in the Nuxeo Runtime. This is implemented in modules like nuxeo-jboss-deployer,&#160;nuxeo-runtime-jetty-adapter, or nuxeo-runtime-tomcat-adapter.</p>
<p>If you would like Nuxeo to run in other containers (GlassFish v3, JBoss 6,&#160;WebLogic, WebSphere, JOnAS, etc.), the you should know that the work is not huge, and that our architecture team planned for it. It just needs a bit of time and manpower; you should contact me directly if you&#039;re interested in contracting us for this open source work.</p>
<p>In the meantime, you should really try Nuxeo under Tomcat&#160;(which is the platform we recommend for now).</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2011/02/nuxeo-and-java-ee.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why Nuxeo Dropped JCR</title>
		<link>http://fguillaume.blogs.nuxeo.com/2011/01/why-nuxeo-dropped-jcr.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2011/01/why-nuxeo-dropped-jcr.html#comments</comments>
		<pubDate>Thu, 13 Jan 2011 02:34:39 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[CMIS]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nuxeo]]></category>
		<category><![CDATA[Standards]]></category>
		<category><![CDATA[cmis]]></category>
		<category><![CDATA[ecm]]></category>
		<category><![CDATA[jcr]]></category>
		<category><![CDATA[nuxeo]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2011/01/why-nuxeo-dropped-jcr.html</guid>
		<description><![CDATA[<p>There have been questions about JCR vs CMIS recently (<a href="http://www.cmswire.com/cms/web-cms/is-jcr-dead-009676.php" target="_self">Is JCR Dead?</a>), and I thought I&#039;d expand a bit on why we at Nuxeo decided to drop support for&#160;JCR.</p>
<p>Nuxeo used JCR in the past with great success; we&#039;ve been on the <a href="http://jcp.org/en/jsr/detail?id=170" target="_self">JSR-170</a> and <a href="http://jcp.org/en/jsr/detail?id=283" target="_self">JSR-283</a> Expert Group and it is a very nice spec. Several versions of our Nuxeo EP framework used Jackrabbit as a content store.</p>
<p>However for some time we&#039;ve decided to not rely on it solely, and for more than two years, since Nuxeo 5.1.6, we&#039;ve had an alternative storage engine, the Nuxeo Visible Content Store (VCS) (<a href="http://doc.nuxeo.com/display/NXDOC/VCS+Architecture" target="_self">http://doc.nuxeo.com/display/NXDOC/VCS+Architecture</a>). Since <a href="http://www.nuxeo.com/en/downloads" target="_self">Nuxeo 5.4</a> VCS is the only content store, and it&#039;s optimized for all the things we require of it.</p>
<p>The reason why we wanted an alternative storage, and why we now rely exclusively on it instead of maintaining costly compatibility with a second storage &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2011/01/why-nuxeo-dropped-jcr.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>There have been questions about JCR vs CMIS recently (<a href="http://www.cmswire.com/cms/web-cms/is-jcr-dead-009676.php" target="_self">Is JCR Dead?</a>), and I thought I&#039;d expand a bit on why we at Nuxeo decided to drop support for&#160;JCR.</p>
<p>Nuxeo used JCR in the past with great success; we&#039;ve been on the <a href="http://jcp.org/en/jsr/detail?id=170" target="_self">JSR-170</a> and <a href="http://jcp.org/en/jsr/detail?id=283" target="_self">JSR-283</a> Expert Group and it is a very nice spec. Several versions of our Nuxeo EP framework used Jackrabbit as a content store.</p>
<p>However for some time we&#039;ve decided to not rely on it solely, and for more than two years, since Nuxeo 5.1.6, we&#039;ve had an alternative storage engine, the Nuxeo Visible Content Store (VCS) (<a href="http://doc.nuxeo.com/display/NXDOC/VCS+Architecture" target="_self">http://doc.nuxeo.com/display/NXDOC/VCS+Architecture</a>). Since <a href="http://www.nuxeo.com/en/downloads" target="_self">Nuxeo 5.4</a> VCS is the only content store, and it&#039;s optimized for all the things we require of it.</p>
<p>The reason why we wanted an alternative storage, and why we now rely exclusively on it instead of maintaining costly compatibility with a second storage engine, is that Jackrabbit had a number of limitations:</p>
<ol>
<li>Opacity of the in-database storage. We wanted data stored in a SQL database to be real SQL tables with visible data. This is helpful for many things, be it imports, backups, debugging, etc. While the goal of JCR to be the &quot;SQL of content&quot; is noble, the reality is that all our customers want data to be in a SQL database, not in something they don&#039;t know. We had had previously the same problem with Zope and its ZODB btw. Serializing Java objects in database columns is really not our idea of a clean storage.</li>
<li>Limitations of the relational model. We wanted to be able to express arbitrary relational queries between objects, and the Jackrabbit query implementation, based on Lucene, really didn&#039;t allow for that, or not with adequate performance (see point 3. below also). There was a lot of work trying to optimize that in Jackrabbit, but I only saw it as a futile exercise in reinventing SQL JOINs and the tens of years of work behind current implementations of the extremely intelligent planners and optimizers of successful SQL database engines.</li>
<li>Performance. There were also unresolved performance problems with nodes containing a huge number of children, inherent in Jackrabbit&#039;s way of storing children information. I haven&#039;t kept up with the latest Jackrabbit releases but at the time this was killing us, and there was no simple fix available.</li>
<li>Over-strict versioning model. The JCR versioning model is fixed by the spec, and does not allow for instance for small changes of metadata on versions that were very useful to us, like updates to the number of readers of a doc.</li>
<li>Needless dynamicity. An important credo of JCR is that you can have &quot;free-form&quot; content, and can add or remove properties to nodes anytime. While this is in theory a great idea, and may appeal to the WCM-inclined, it also has a large performance impact, and is really not something that <em>any</em> of our customers want in their databases. Customers want well-defined and fixed schema. DBAs want to know beforehand what the tables will look like. Now, Nuxeo VCS can of course add or remove fields in its schemas, but it&#039;s an administrative step, and is not done in the normal course of an application&#039;s life.</li>
</ol>
<p>But the cinch really was the first point, a proper SQL representation. At the lower level the VCS architecture really resembles the JCR concepts of nodes and properties, but it stores them cleanly in tables (see the <a href="http://doc.nuxeo.com/display/NXDOC/VCS+Architecture" target="_self">above URL</a> for a description). For a time we considered overlaying a JCR API on top of it, but that has not proven necessary because there was little customer demand for it, and because we have a higher-level document abstraction that hides this anyway.</p>
<p>Now that <a href="http://www.oasis-open.org/committees/cmis" target="_self">CMIS</a> is getting recognition, we believe it&#039;s a better way to expose a document store than the Java Content Repository API. We are on the CMIS Technical Committee, and we now have a CMIS interface on top of Nuxeo (<a href="http://doc.nuxeo.com/display/NXDOC/CMIS+for+Nuxeo" target="_self">http://doc.nuxeo.com/display/NXDOC/CMIS+for+Nuxeo</a>), about which we&#039;re very happy.</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2011/01/why-nuxeo-dropped-jcr.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CMIS and Chemistry at ApacheCon 2010</title>
		<link>http://fguillaume.blogs.nuxeo.com/2010/10/cmis-and-chemistry-at-apachecon-2010.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2010/10/cmis-and-chemistry-at-apachecon-2010.html#comments</comments>
		<pubDate>Mon, 25 Oct 2010 15:26:54 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[CMIS]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2010/10/cmis-and-chemistry-at-apachecon-2010.html</guid>
		<description><![CDATA[<p><a href="http://na.apachecon.com/c/acna2010/" target="_self">ApacheCon 2010</a> starts next week in Atlanta, and if you want to know more about the <a href="http://www.oasis-open.org/committees/cmis" target="_self">CMIS</a> standard from <a href="http://www.oasis-open.org/" target="_self">OASIS</a>, <a href="http://incubator.apache.org/chemistry/index.html" target="_self">Apache Chemistry</a>, and <a href="http://incubator.apache.org/chemistry/opencmis.html" target="_self">OpenCMIS</a> then you should come! On Wednesday, Nov 3 (at 2pm) I&#039;ll be presenting a talk on these topics. Here&#039;s the abstract:</p>
<p><strong><a href="http://us.apachecon.com/c/acna2010/sessions/591" target="_self">Get your content under control with CMIS and Apache Chemistry</a></strong></p>
<p>The CMIS standard provides an answer to most issues met by typical content-centric applications by offering a common model and a set of services for ECM interoperability. In this session we&#039;ll first provide an introduction to the CMIS services and bindings, then we&#039;ll offer a view of the landscape of the different ECM providers and clients implementing CMIS, and we&#039;ll finish with practical examples of the uses of OpenCMIS, the Apache Chemistry (Java) library, designed to help you easily write CMIS applications.</p>
<p>I hope to meet you there!&#8230; <a href="http://fguillaume.blogs.nuxeo.com/2010/10/cmis-and-chemistry-at-apachecon-2010.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://na.apachecon.com/c/acna2010/" target="_self">ApacheCon 2010</a> starts next week in Atlanta, and if you want to know more about the <a href="http://www.oasis-open.org/committees/cmis" target="_self">CMIS</a> standard from <a href="http://www.oasis-open.org/" target="_self">OASIS</a>, <a href="http://incubator.apache.org/chemistry/index.html" target="_self">Apache Chemistry</a>, and <a href="http://incubator.apache.org/chemistry/opencmis.html" target="_self">OpenCMIS</a> then you should come! On Wednesday, Nov 3 (at 2pm) I&#039;ll be presenting a talk on these topics. Here&#039;s the abstract:</p>
<p><strong><a href="http://us.apachecon.com/c/acna2010/sessions/591" target="_self">Get your content under control with CMIS and Apache Chemistry</a></strong></p>
<p>The CMIS standard provides an answer to most issues met by typical content-centric applications by offering a common model and a set of services for ECM interoperability. In this session we&#039;ll first provide an introduction to the CMIS services and bindings, then we&#039;ll offer a view of the landscape of the different ECM providers and clients implementing CMIS, and we&#039;ll finish with practical examples of the uses of OpenCMIS, the Apache Chemistry (Java) library, designed to help you easily write CMIS applications.</p>
<p>I hope to meet you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2010/10/cmis-and-chemistry-at-apachecon-2010.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Chemistry meeting wrap up</title>
		<link>http://fguillaume.blogs.nuxeo.com/2010/04/apache-chemistry-meeting-wrap-up.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2010/04/apache-chemistry-meeting-wrap-up.html#comments</comments>
		<pubDate>Mon, 19 Apr 2010 17:15:45 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[CMIS]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nuxeo]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2010/04/apache-chemistry-meeting-wrap-up.html</guid>
		<description><![CDATA[<p>Last week a meeting took place in Munich between the main developers behind the two Java <a href="http://incubator.apache.org/chemistry/">Chemistry</a> projects (Chemistry and OpenCMIS). I can say that the meeting was a success and that the two codebases are now in the process of actively being merged!</p>
<p>People from Open Text (our host for this week), SAP, Alfresco and Nuxeo were present. There were lively discussions about many technical points, but following the Apache rules of conduct for such meetings all points were summarized each day to the mailing-list for larger visibility and input by the whole community (<a href="http://mail-archives.apache.org/mod_mbox/incubator-chemistry-dev/201004.mbox/date">see the archives here</a>). The remaining work to do for this merge will be logged in the Apache JIRA issue tracker, again to provide visibility.</p>
<p>Once the current code base is stabilized, which we hope will take no more than one or two weeks, we want to make a first 0.1-incubating release, in &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2010/04/apache-chemistry-meeting-wrap-up.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>Last week a meeting took place in Munich between the main developers behind the two Java <a href="http://incubator.apache.org/chemistry/">Chemistry</a> projects (Chemistry and OpenCMIS). I can say that the meeting was a success and that the two codebases are now in the process of actively being merged!</p>
<p>People from Open Text (our host for this week), SAP, Alfresco and Nuxeo were present. There were lively discussions about many technical points, but following the Apache rules of conduct for such meetings all points were summarized each day to the mailing-list for larger visibility and input by the whole community (<a href="http://mail-archives.apache.org/mod_mbox/incubator-chemistry-dev/201004.mbox/date">see the archives here</a>). The remaining work to do for this merge will be logged in the Apache JIRA issue tracker, again to provide visibility.</p>
<p>Once the current code base is stabilized, which we hope will take no more than one or two weeks, we want to make a first 0.1-incubating release, in order for clients to be able to start using a fixed version of the library. I will be the release manager for the first release, which will likely be the most complex one for us as we learn the ins and outs of releasing an Apache project.</p>
<p>Regarding naming, &#8220;Apache Chemistry&#8221; continues to be the global umbrella hosting CMIS-related projects at the Apache foundation. The particular Java sub-project providing a general-purpose library for the client and server side, that was the object of this merge, is named OpenCMIS in recognition of the origin of the majority of the code. Other sub-projects (a python library, a Javascript one, various other clients, etc.) will be encouraged to find their own name to have an easily remembered identity under Chemistry. The website will also soon be updated with more documentation about all the projects, including the new OpenCMIS.</p>
<p>At the moment Chemistry is still in incubation phase at Apache, but given that the community around it is now well established we hope to start the process of becoming a fully fledged top level Apache project soon.</p>
<p>Meanwhile the <a href="http://www.oasis-open.org/committees/document.php?document_id=36486">OASIS CMIS</a> standard itself is now being voted upon by the 323 voting members of OASIS. If all goes well, by early May the vote will be complete and CMIS will be an official 1.0 standard. If your company or organization is an OASIS voting member (see <a href="http://www.oasis-open.org/about/">http://www.oasis-open.org/about/</a> and <a href="http://www.oasis-open.org/about/contributors.php">http://www.oasis-open.org/about/contributors.php</a> for a list), please urge your representative to <a href="http://www.oasis-open.org/apps/org/workgroup/cmis/email/archives/201004/msg00007.html">vote for CMIS</a>.</p>
<p>At <a href="http://www.nuxeo.com/">Nuxeo</a>, we&#8217;re in the process of switching our <a href="http://www.nuxeo.org/xwiki/bin/view/Main/CMIS">CMIS support</a> from the Chemistry library to the OpenCMIS one. And of course this will be transparent to users of the CMIS API, that&#8217;s the whole point of having a standard <img src='http://fguillaume.blogs.nuxeo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Nuxeo will then be the first open source server whose CMIS support is implemented using the OpenCMIS library. Stay tuned for announcements of this release!</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2010/04/apache-chemistry-meeting-wrap-up.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuxeo CMIS Update</title>
		<link>http://fguillaume.blogs.nuxeo.com/2010/01/nuxeo-cmis-update.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2010/01/nuxeo-cmis-update.html#comments</comments>
		<pubDate>Thu, 21 Jan 2010 18:53:00 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[CMIS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nuxeo]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2010/01/nuxeo-cmis-update.html</guid>
		<description><![CDATA[<p>Thanks to lots of progress in <a href="http://incubator.apache.org/projects/chemistry.html">Apache Chemistry</a>, to which Nuxeo is contributing, and through updated Nuxeo Chemistry bindings, the support for CMIS in Nuxeo is getting quite good.</p>
<p>For more&#160;practical info on using CMIS in Nuxeo, including download links, see <a href="http://doc.nuxeo.org/xwiki/bin/view/Main/CMIS">http://doc.nuxeo.org/xwiki/bin/view/Main/CMIS</a>.</p>
<p>Note that our demo server at&#160;<a href="http://cmis.demo.nuxeo.org/">http://cmis.demo.nuxeo.org/</a> has been updated as well.</p>
<p>Below are most of the new features available since the last release.</p>

<h2>Better search</h2>

<p>Fulltext search with <span style="font-family: Courier">CONTAINS()</span> has been implemented so that you can do queries like:</p>
<p><span style="font-family: Courier">SELECT cmis:name FROM cmis:document WHERE CONTAINS(&#8216;foobar&#8217;)</span></p>
<p>(The full scope of the fulltext search syntax, with ORing of words and negation, is not there yet.)</p>
<p>You can now also use the <span style="font-family: Courier">IN_TREE()</span> and <span style="font-family: Courier">IN_FOLDER()</span> predicates.</p>
<p>The SQL keywords are now case-insensitive as the spec requires, and&#160;complex boolean functions have been fixed.</p>

<h2>More CRUD</h2>

<p>A number of fundamental features form the CMIS domain model are now complete: object &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2010/01/nuxeo-cmis-update.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>Thanks to lots of progress in <a href="http://incubator.apache.org/projects/chemistry.html">Apache Chemistry</a>, to which Nuxeo is contributing, and through updated Nuxeo Chemistry bindings, the support for CMIS in Nuxeo is getting quite good.</p>
<p>For more&nbsp;practical info on using CMIS in Nuxeo, including download links, see <a href="http://doc.nuxeo.org/xwiki/bin/view/Main/CMIS">http://doc.nuxeo.org/xwiki/bin/view/Main/CMIS</a>.</p>
<p>Note that our demo server at&nbsp;<a href="http://cmis.demo.nuxeo.org/">http://cmis.demo.nuxeo.org/</a> has been updated as well.</p>
<p>Below are most of the new features available since the last release.</p>
</p>
<h2>Better search</h2>
</p>
<p>Fulltext search with <span style="font-family: Courier">CONTAINS()</span> has been implemented so that you can do queries like:</p>
<p><span style="font-family: Courier">SELECT cmis:name FROM cmis:document WHERE CONTAINS(&#8216;foobar&#8217;)</span></p>
<p>(The full scope of the fulltext search syntax, with ORing of words and negation, is not there yet.)</p>
<p>You can now also use the <span style="font-family: Courier">IN_TREE()</span> and <span style="font-family: Courier">IN_FOLDER()</span> predicates.</p>
<p>The SQL keywords are now case-insensitive as the spec requires, and&nbsp;complex boolean functions have been fixed.</p>
</p>
<h2>More CRUD</h2>
</p>
<p>A number of fundamental features form the CMIS domain model are now complete: object move, folder tree, folder descendants, delete, delete descendants.</p>
</p>
<h2>Miscellaneous</h2>
</p>
<p>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.</p>
</p>
<h2>CMIS Shell</h2>
</p>
<p>Finally, keep in mind that there is now an easy way to test a CMIS repository using a command line client. See the <a href="http://blogs.nuxeo.com/fermigier/2010/01/announcing-cmis-shell-cmissh-commandline-client-cmis.html">CMIS Shell blog post</a> from Stéfane for more.</p>
</p>
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2010/01/nuxeo-cmis-update.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced CMIS</title>
		<link>http://fguillaume.blogs.nuxeo.com/2009/12/advanced-cmis.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2009/12/advanced-cmis.html#comments</comments>
		<pubDate>Wed, 02 Dec 2009 21:55:00 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[CMIS]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[cmis ecm]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2009/12/advanced-cmis.html</guid>
		<description><![CDATA[<p>The upcoming <a href="http://www.oasis-open.org/committees/cmis">CMIS</a> standard is approaching its final 1.0 version, and I thought I would take the time to present some of its most advanced features.</p>

<h2>Basics</h2>

<p>I will not detail here the basics of the CMIS domain model, but I will mention quickly for completeness:</p>

<ul>
<li>CMIS stores folders, documents and relationship (collectively called objects),</li>
<li>each object has a unique id,</li>
<li>objects have &#34;object types&#34; detailing the properties they&#039;re allowed to have,</li>
<li>properties have the usual basic &#34;property types&#34; (strings, numbers, dates, lists, etc.),</li>
<li>you can create, retrieve, update and delete objects (CRUD),</li>
<li>documents may have an associated content stream (an attachment),</li>
<li>you can search documents using a SQL-based language,</li>
<li>clients talk to CMIS servers using AtomPub or SOAP.</li>
</ul>
<p>Below I will detail the more advanced features of CMIS.</p>

<h2>Unfiling,&#160;Multi-filing</h2>
<p>While most people are used to storing documents inside a navigation tree, where the intermediate tree nodes are folders, there &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2009/12/advanced-cmis.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>The upcoming <a href="http://www.oasis-open.org/committees/cmis">CMIS</a> standard is approaching its final 1.0 version, and I thought I would take the time to present some of its most advanced features.</p>
</p>
<h2>Basics</h2>
</p>
<p>I will not detail here the basics of the CMIS domain model, but I will mention quickly for completeness:</p>
</p>
<ul>
<li>CMIS stores folders, documents and relationship (collectively called objects),</li>
<li>each object has a unique id,</li>
<li>objects have &quot;object types&quot; detailing the properties they&#039;re allowed to have,</li>
<li>properties have the usual basic &quot;property types&quot; (strings, numbers, dates, lists, etc.),</li>
<li>you can create, retrieve, update and delete objects (CRUD),</li>
<li>documents may have an associated content stream (an attachment),</li>
<li>you can search documents using a SQL-based language,</li>
<li>clients talk to CMIS servers using AtomPub or SOAP.</li>
</ul>
<p>Below I will detail the more advanced features of CMIS.</p>
</p>
<h2>Unfiling,&#160;Multi-filing</h2>
<p>While most people are used to storing documents inside a navigation tree, where the intermediate tree nodes are folders, there are other ways to deal with content, which CMIS exposes through the concepts of &quot;unfiling&quot; and&#160;&quot;multi-filing&quot; (the term &quot;filing&quot; expresses the idea that a document is stored in a place, much like in the real world).</p>
<p>The first alternative way of storing a document is to not file it anywhere: the document is not held in a folder, it just exists: it is then said to be <strong>unfiled</strong>. The document is not lost however, because given a document id you can retrieve the properties and content stream of the document, and if you don&#039;t know its id you can do a search based on relevant criteria to find your document.</p>
<p>This model of unfiled documents is quite common in the world of record management, where what is important is the &quot;record&quot; (the content and metadata),&#160;and not a folder in which it may live. The record&#160;itself carries all the metadata you need to find it (dates, keywords, tags, etc.), and instead of listing &quot;what&#039;s in a given folder&quot;, you can list records according to simple or complex search criteria.</p>
<p>The second alternative way provided by CMIS to store a document is to allow it to live in several folders at the same time: this is called <strong>multi-filing</strong>. It&#039;s another way of organizing content, and can be quite powerful.</p>
<p>Multi-filing is often used to organize documents in folders along several axes, where a folder represents a criterion and the presence of a document in a folder reflects the fact that the criterion applies to the document. Multi-filing can also be used to express &quot;publishing&quot; concepts (publishing a document in several categories means just filing it in different folders, each folder representing a category).</p>
<p>Both of these features are optional in a CMIS repository.</p>
</p>
<h2>Renditions</h2>
<p>In content management systems, it&#039;s quite common for a document to have different renditions. A <strong>rendition</strong> is an alternate way of viewing or representing a master document. For instance from an OpenDocument file you may derive a PDF rendition, a 100&#215;140 pixels image rendition of the cover page, a Microsoft Word rendition, a rendition as a series of high-resolution images for each page, an HTML rendition, a pure text rendition, an MP3 rendition of the content as spoken text, etc. From a video document you may get a H.264 rendition, a Flash rendition, a 64&#215;64 pixels image rendition, a&#160;rendition as a&#160;series of 320&#215;200 pixels images every 10 seconds of the video, an MP3 rendition of the audio stream, a pure text rendition of the speech extracted from that audio stream, a text rendition of the extracted subtitles, etc.</p>
<p>CMIS doesn&#039;t expose any way to create or control these renditions (it&#039;s too complex, and up to the content management system to decide what they are), but it exposes a way to discover and retrieve them.&#160;Documents and folders can both have renditions, each rendition being seen as an alternate content stream.</p>
<p>Renditions have rudimentary metadata, among which a MIME type, a width and height (recognizing that rendition are often visually oriented), a title, and a &quot;kind&quot; which is used to categorize the renditions. CMIS only defines one standard kind, the thumbnail, but more could be added in future versions of the specification. The fact that it&#039;s useful for a folder to have a thumbnail or an icon is the reason why folders are allowed to have renditions while they can&#039;t have a normal content stream.</p>
<p>Rendition support is optional (and in any case it&#039;s the repository that decides what renditions to expose for each object).</p>
</p>
<h2>Versioning</h2>
</p>
<p>In CMIS a document (if its type supports it) can be <strong>versioned</strong>, which means that &quot;old&quot; versions are retained by the system. A version can be &quot;major&quot; or not, but CMIS doesn&#039;t impose any semantics on this, it&#039;s just a useful abstraction. To create new versions, a model of checkin/checkout is used: after checkout from a version, a private working copy (PWC) is created, which can be modified and then checked back in, creating a new version.</p>
<p>Here the model gets complex because in the real world there are many ways in which versioning can be done.</p>
<p>In the most complete scenario, the repository allows read and write access to all versions, including the PWC, and allows all versions and the PWC to be searched. The versions can also be filed independently in the same (or different) folders, several versions being then accessible at the same time.</p>
<p>This model can be restricted by the CMIS repository in various ways. The repository can specify that:</p>
</p>
<ul>
<li>only the latest version may be accessible or searchable, not the older versions nor the PWC,</li>
<li>a PWC may be checked out from only the latest version,</li>
<li>a PWC may not be updatable at all, only checked back in with some modifications in a single operation,</li>
<li>a checkout may not be allowed at all, in which case new versions may be created only by applying an update to an existing version; this leaves the existing version unchanged but creates a new version holding the updated data (this is called auto-versioning),</li>
<li>all the versions of a given document are held in the same folder (this is called version-independent filing, the opposite is called version-specific filing),</li>
<li>only a single version of a document (the latest version or latest major version) may be filed in a folder, the other versions being &quot;hidden&quot; (not filed); when new versions or new major versions are created they automatically replace the previous one filed in the folder (this is another aspect of version-independent filing).</li>
</ul>
<p>Given this wide variation of capabilities, having a generic client that understands all the versioning models will certainly be a challenge, but this is the cost of having interoperability with many systems that have different ideas of what versioning should look like.</p>
</p>
</p>
<h2>Security through ACLs</h2>
<p>Being able to access documents is the basis of content management, but in existing systems this access is often restricted by various permissions that depend on the user doing the action. The permission systems implemented by content repositories are extremely varied (even more than for versioning), and even though CMIS cannot hope to model them in an interoperable manner it&#039;s been recognized that some minimal operations can be agreed upon.</p>
<p>In order to work with permissions, a basic (and optional) set of permission management operations has been defined,&#160;based on access control lists (<strong>ACLs</strong>). The ACL on a document is a list of basic assignment of permissions to users, defining what they can do on this document.</p>
<p>CMIS defines three basic permissions: Read, Write, and All. It&#039;s up to each repository to define exactly the semantics of these permissions, but they are common enough that a client should be able to work with them easily even if the details are unknown to it: a client can easily tell a user if it will have the right to modify a document or not.</p>
<p>If a client really needs it, however, the CMIS repository exposes exactly what individual CMIS operations are allowed for each of these permissions.&#160;A repository can also define additional non-standard permissions, and using the same mechanism tell a client what operations will be allowed for each. In this manner, a client can discover in advance the restrictions placed on a document.</p>
<p>Optionally, a repository may allow a client to not only check but also change the ACL on a document, so that for instance other users are given rights to modify it, or instead disallowed from even seeing it.</p>
<p>ACLs are often more complex than just a list of permissions given to users on a document, for example many systems have inheritance of ACLs, which means that an ACL applied to a folder has an effect on the documents filed in that folder, and also on other documents further down the tree. Other systems have more complex rules. A CMIS repository can tell a client which of these three models (object-only, with inheritance, or completely repository-specific) it uses. When retrieving the ACL effective on a document, a repository can also tell a client if the ACL has really been set directly on that document, or if has somehow been derived from inherited ACLs or through more complex policies.</p>
</p>
<h2>Change Log</h2>
<p>It&#039;s important for external search services, caching systems or synchronization engines to be able to know what has happened in a repository since their &quot;last visit&quot;. To that end, CMIS has an (optional) <strong>change log</strong> service that can be queried to discover the past operations that have been done in the repository after a specified date.</p>
<p>The change log service returns a list of basic operations that have happened in the repository: object creation, modification or deletion, as well as security changes on an object. For modification operations, the repository may also include the new values of properties set on that object.</p>
<p>The change log can be queried by starting from a given point in time materialized by an opaque &quot;change log token&quot;, which a client should ask to the repository whenever it checkpoints its state. The repository will later be capable of returning all the changes made since that time.</p>
<p>If the repository cannot record all its history since it was created,&#160;the change log may be &quot;incomplete&quot;; in that case it may not be possible to get a change log starting from very old change log tokens. However when a repository returns changes from a supported change log token, all the changes up to the current moment must be returned: no intermediate changes can be lost.</p>
</p>
</p>
<h2>Conclusion</h2>
</p>
</p>
</p>
</p>
</p>
<p>I hope that this overview of its advanced features has convinced you that CMIS is a worthwhile standard, that many powerful things can be done with it, and that many vendors will soon be using it for interoperability. Nuxeo is committed to CMIS, and we&#039;ll be releasing a new version of our <a href="http://doc.nuxeo.org/xwiki/bin/view/Main/CMIS">CMIS connector</a>, supporting the latest 1.0cd04 draft,&#160;in a few days.</p>
<p>A final approval of CMIS 1.0 is expected in early-to-mid 2010. In the meantime, the <a href="http://lists.oasis-open.org/archives/tc-announce/200910/msg00015.html">Public Review of CMIS</a> is still under way, please read the spec, implement it, and give feedback!</p></p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2009/12/advanced-cmis.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMIS Meeting, Day Two</title>
		<link>http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-two.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-two.html#comments</comments>
		<pubDate>Thu, 06 Aug 2009 18:22:00 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[CMIS]]></category>
		<category><![CDATA[ECM]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-two.html</guid>
		<description><![CDATA[<p>(The first part of this series described <a href="http://blogs.nuxeo.com/sections/blogs/florent_guillaume/2009_08_05_cmis-meeting-day-one">the first day of the meeting</a>.)</p>
<p>On the second day of the <a href="http://www.oasis-open.org/committees/cmis">CMIS</a> face-to-face meeting we again spent some quality time reading the spec nearly line by line, making sure everything is coherent, and discussing a few important points that people felt were important for their use cases.</p>
<p>Below I&#8217;ll outline some important changes made to the spec on the first and second day of this meeting. There&#8217;s more of course, you may want to follow everything in the <a href="http://tools.oasis-open.org/issues/browse/CMIS">CMIS JIRA</a>.</p>
<p>The XML and XHTML property types are gone. No vendor was in support of them, and it was actually quite hard to standardize on exactly what kind of XML would be stored in such a property (well-formed? fragment? etc.). We kept the HTML property type, as many repositories still want to distinguish between &#8220;basic text&#8221; and &#8220;rich text&#8221;, especially for &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-two.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>(The first part of this series described <a href="http://blogs.nuxeo.com/sections/blogs/florent_guillaume/2009_08_05_cmis-meeting-day-one">the first day of the meeting</a>.)</p>
<p>On the second day of the <a href="http://www.oasis-open.org/committees/cmis">CMIS</a> face-to-face meeting we again spent some quality time reading the spec nearly line by line, making sure everything is coherent, and discussing a few important points that people felt were important for their use cases.</p>
<p>Below I&#8217;ll outline some important changes made to the spec on the first and second day of this meeting. There&#8217;s more of course, you may want to follow everything in the <a href="http://tools.oasis-open.org/issues/browse/CMIS">CMIS JIRA</a>.</p>
<p>The XML and XHTML property types are gone. No vendor was in support of them, and it was actually quite hard to standardize on exactly what kind of XML would be stored in such a property (well-formed? fragment? etc.). We kept the HTML property type, as many repositories still want to distinguish between &#8220;basic text&#8221; and &#8220;rich text&#8221;, especially for presentation purposes. If a repository has XML or XHTML properties, it can easily expose them as Strings.</p>
<p>The ability to use paths to get to folders was extended to documents as well (getFolderByPath turns into getObjectByPath). For folders (were paths are well-defined), paths are retrieved through an explicit property &#8220;cmis:path&#8221;, but for documents (which may be multi-filed) we have to be more careful. Whenever a document is retrieved in the context of a folder (getChildren, getDescendants, getObjectParents), its last path segment inside that folder will be available, so that clients can determine a full path for the document — but this segment is not a real property of the document, as it may change depending on context. Finally, the &#8220;cmis:name&#8221; property will be only a hint for the repository to choose a path segment for new objects, but the only way to be sure of an object&#8217;s path is through folder&#8217;s cmis:path and the aforementioned document path segment.</p>
<p>ACLs have been available since 0.62, but the exact set of basic permissions that they can expose is hard to pin down. We had cmis:read, cmis:write, cmis:delete and cmis:all, however some vendors have a hard time mapping their native permissions (or pseudo-roles) to such a basic model, and especially to cmis:delete which in itself is ambiguous considering that in a given repository deleting an object may require some permission on the parent and some other permission on the child. To further simplify the model, it&#8217;s been decided that cmis:delete would go. But fear not, the ACL model is such that each vendor has the possibility of exposing its native permissions, and exposing which of them are required for each of the CMIS operations, so clients will still be able to make good use of ACLs even if not everything about them is standardized.</p>
<p>With ACLs come principals, and some special principals are sufficiently common that it&#8217;s worthwhile for a client to know their ids. Therefore we added a way for a repository to tell a client what&#8217;s the principal id for &#8220;anonymous&#8221;, what&#8217;s the one for &#8220;everybody&#8221;, and we added a way to specify &#8220;me&#8221; when setting ACLs.</p>
<p>The need for Policies has been discussed as well, as there are no actual uses of them in the spec; they&#8217;re an abstract placeholder for vendor extensions. Should they go? We now have ACLs after all&#8230; But there are already vendors making use of them to expose features of their repositories, so keeping them is good for them, and costs little to others (they&#8217;re optional after all).</p>
<p>We now have a way to do copies! For the longest of time, this wasn&#8217;t the case. There was strong opposition to adding a copy method, as copy semantics is very varied among repositories (do you copy document relations? acls? versions? renditions? streams? folder children? what about multi-filing? etc.). Nevertheless myself and others persistently asked for a way to do copies. The deciding argument this time was that even though in most cases the clients can do the copy themselves, by just creating a new object with the same properties as the one to copy, there is a problem with content streams as they may be multi-gigabyte objects — at a minimum we need a way to copy content streams. After lots of discussions, we decided to introduce a createDocumentFromSource method, which works just like a normal creation except that a source document is also provided. The repository will then use whatever it feels is best from this source document to fill in the created document. Note that we don&#8217;t specify a way to do folder copies, as these very too much between implementations.</p>
<p>In AtomPub, if you want to create a document with a content stream, you have several standard ways available. However the only way to do creation in just one call is to embed the content stream in the message, and AtomPub has strong constraints on how you can do that: for XML- or text-related content types, AtomPub mandates that the stream be inlined in clear text (presumably for the benefit of AtomPub readers). But this is problematic as soon as you want to transfer content that is slightly invalid (but nevertheless stored in your repository!), or whose text content encoding is unknown, or is XML where you want to keep exact formatting, comments, prefixes, namespaces and all. Therefore, we added an extension to AtomPub (cmisra:content) that allows base64 transfer of content in all cases.</p>
<p>URI templates had been added to the AtomPub bindings in order to have a non-REST but very fast way for a client to access a document by ID, by path, or to make a query without a POST. URI templates, however, are still a draft, and it&#8217;s problematic to include them in a standard. Furthermore the URI templates draft specifies many different ways along which variable replacement can be done, including tests, defaults, list delimiters, escaping, etc. We thus decided that a simplified subset would be used: just simple {variable} replacement, with percent-escaping. This solves most of the problems, and is still better than nothing.</p>
<p>Today is the third and last day of the meeting, mostly filled with interoperability tests and still more discussions about the spec. Stay tuned for more!</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-two.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMIS Meeting, Day One</title>
		<link>http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-one.html</link>
		<comments>http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-one.html#comments</comments>
		<pubDate>Wed, 05 Aug 2009 18:23:00 +0000</pubDate>
		<dc:creator>Florent Guillaume</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[CMIS]]></category>
		<category><![CDATA[ECM]]></category>

		<guid isPermaLink="false">http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-one.html</guid>
		<description><![CDATA[<p>Yesterday was the first day of the <a href="http://www.oasis-open.org/committees/cmis">CMIS</a> Technical Committee face-to-face meeting. This time we&#8217;re grateful to Oracle for hosting us in their offices in Boulder, Colorado.</p>
<p>Here are a few highlights of what transpired during this first day.</p>
<p>First, CMIS is really taking hold inside the big companies in this TC. Most of them plan to make available, privately to other TC members, some test versions of the CMIS servers they are working on, to ensure interoperability as early as possible. Of course these face-to-face meetings are also designed as &#8220;plugfests&#8221;, where we set up test servers and let other&#8217;s clients connect to them, but it&#8217;s important to have it continue beyond these three days of meetings. It&#8217;s unfortunate that these servers can&#8217;t be public, but it&#8217;s a fact of life inside big companies that you can&#8217;t publicly speak about or show what you&#8217;re working on.</p>
<p>Of course in &#8230; <a href="http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-one.html" class="read_more">Read more</a></p>]]></description>
			<content:encoded><![CDATA[<p>Yesterday was the first day of the <a href="http://www.oasis-open.org/committees/cmis">CMIS</a> Technical Committee face-to-face meeting. This time we&#8217;re grateful to Oracle for hosting us in their offices in Boulder, Colorado.</p>
<p>Here are a few highlights of what transpired during this first day.</p>
<p>First, CMIS is really taking hold inside the big companies in this TC. Most of them plan to make available, privately to other TC members, some test versions of the CMIS servers they are working on, to ensure interoperability as early as possible. Of course these face-to-face meetings are also designed as &#8220;plugfests&#8221;, where we set up test servers and let other&#8217;s clients connect to them, but it&#8217;s important to have it continue beyond these three days of meetings. It&#8217;s unfortunate that these servers can&#8217;t be public, but it&#8217;s a fact of life inside big companies that you can&#8217;t publicly speak about or show what you&#8217;re working on.</p>
<p>Of course in the open source world we have much more latitude, and <a href="http://www.nuxeo.com/">Nuxeo</a> will be putting up soon a page with instructions for downloading and using <a href="http://incubator.apache.org/chemistry/">Apache Chemistry</a> and the <a href="http://hg.nuxeo.org/sandbox/nuxeo-chemistry/">Nuxeo CMIS bindings</a>, as well as a public server that people can use for testing. And with all the code available! <img src='http://fguillaume.blogs.nuxeo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Another thing that became clear today is that everybody is pretty happy with the spec as it is, and that we&#8217;re nearly ready to start the <a href="http://www.oasis-open.org/">OASIS</a> review process that will first make it go through formal public review, and then open the OASIS vote for CMIS to become a standard. This process takes time (a minimum of four month), so we should start it as early as possible. But this means that, baring problems, CMIS should be a 1.0 standard by the end of the year, which is great news!</p>
<p>Much of the afternoon of this first day was taken up by a paragraph-by-paragraph review of the spec, where we criticized, clarified, reworded, or otherwise discussed every aspect of the spec. This process is long but invaluable, and we all agree that it makes the spec better. It will continue tomorrow and the day after, both for the first part that describes the domain model, and for the AtomPub and SOAP bindings.</p>
<p>Stay tuned for more news&#8230;</p>
<p>(The second part of this series describes <a href="http://blogs.nuxeo.com/sections/blogs/florent_guillaume/2009_08_06_cmis-meeting-day-two">the second day of the meeting</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://fguillaume.blogs.nuxeo.com/2009/08/cmis-meeting-day-one.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

