<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.cms.nuxeo.scm">
    <title>gmane.comp.cms.nuxeo.scm</title>
    <link>http://blog.gmane.org/gmane.comp.cms.nuxeo.scm</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73229"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73228"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73227"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73226"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73225"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73224"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73223"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73222"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73221"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73220"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73219"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73218"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73217"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73216"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73215"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73214"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73213"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73212"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73211"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73210"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73229">
    <title>nuxeo-distribution: NXP-9268: FixinstallAfterRestart issue + addmp-init and mp-purge commands(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73229</link>
    <description>&lt;pre&gt;Message:
    NXP-9268: Fix installAfterRestart issue + add mp-init and mp-purge commands

Repository: nuxeo-distribution
Branch: master
Author: Mathieu Guillaume &amp;lt;mg&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-26T01:45:31-07:00
URL: https://github.com/nuxeo/nuxeo-distribution/commit/a89caff426b3d9cf95c2f475dc741c63cf867dcd
JIRA: https://jira.nuxeo.com/browse/NXP-9268

Files:
M nuxeo-distribution-jboss/src/main/assemble/assembly.xml
M nuxeo-distribution-tomcat/src/main/assemble/assembly.xml
M nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
M nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
M nuxeo-startup-wizard/src/main/java/org/nuxeo/wizard/download/PackageDownloader.java

diff --git a/nuxeo-distribution-jboss/src/main/assemble/assembly.xml b/nuxeo-distribution-jboss/src/main/assemble/assembly.xml
index d5d3944..171fb5a 100644
--- a/nuxeo-distribution-jboss/src/main/assemble/assembly.xml
+++ b/nuxeo-distribution-jboss/src/main/assemble/assembly.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -140,18 +140,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;move file="${maven.project.build.directory}/nuxeo-marketplace-social-collaboration-${nuxeo.distribution.version}.zip"
           tofile="${jboss}/setupWizardDownloads/${SCMPMD5}" /&amp;gt;
 
-    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-DM.log"&amp;gt;file:setupWizardDownloads/${VPCBMPMD5}
-file:setupWizardDownloads/${DMMPMD5}
+    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-DM.log"&amp;gt;init
+install nuxeo-dm
 &amp;lt;/echo&amp;gt;
-    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-SC.log"&amp;gt;file:setupWizardDownloads/${VPCBMPMD5}
-file:setupWizardDownloads/${DMMPMD5}
-file:setupWizardDownloads/${SCMPMD5}
+    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-SC.log"&amp;gt;init
+install nuxeo-social-collaboration
 &amp;lt;/echo&amp;gt;
-    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-DAM.log"&amp;gt;file:setupWizardDownloads/${VPCBMPMD5}
-file:setupWizardDownloads/${DAMMPMD5}
+    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-DAM.log"&amp;gt;init
+install nuxeo-dam
 &amp;lt;/echo&amp;gt;
-    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-CMF.log"&amp;gt;file:setupWizardDownloads/${VPCBCMFMPMD5}
-file:setupWizardDownloads/${CMFMPMD5}
+    &amp;lt;echo file="${jboss}/server/default/data/NXRuntime/data/installAfterRestart-CMF.log"&amp;gt;init
+install nuxeo-cmf
 &amp;lt;/echo&amp;gt;
   &amp;lt;/target&amp;gt;
 
diff --git a/nuxeo-distribution-tomcat/src/main/assemble/assembly.xml b/nuxeo-distribution-tomcat/src/main/assemble/assembly.xml
index 89f13fe..40d7581 100644
--- a/nuxeo-distribution-tomcat/src/main/assemble/assembly.xml
+++ b/nuxeo-distribution-tomcat/src/main/assemble/assembly.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -199,18 +199,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;move file="${maven.project.build.directory}/nuxeo-marketplace-social-collaboration-${nuxeo.distribution.version}.zip"
           tofile="${tomcat}/setupWizardDownloads/${SCMPMD5}" /&amp;gt;
 
-    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-DM.log"&amp;gt;file:setupWizardDownloads/${VPCBMPMD5}
-file:setupWizardDownloads/${DMMPMD5}
+    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-DM.log"&amp;gt;init
+install nuxeo-dm
 &amp;lt;/echo&amp;gt;
-    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-SC.log"&amp;gt;file:setupWizardDownloads/${VPCBMPMD5}
-file:setupWizardDownloads/${DMMPMD5}
-file:setupWizardDownloads/${SCMPMD5}
+    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-SC.log"&amp;gt;init
+install nuxeo-social-collaboration
 &amp;lt;/echo&amp;gt;
-    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-DAM.log"&amp;gt;file:setupWizardDownloads/${VPCBMPMD5}
-file:setupWizardDownloads/${DAMMPMD5}
+    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-DAM.log"&amp;gt;init
+install nuxeo-dam
 &amp;lt;/echo&amp;gt;
-    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-CMF.log"&amp;gt;file:setupWizardDownloads/${VPCBCMFMPMD5}
-file:setupWizardDownloads/${CMFMPMD5}
+    &amp;lt;echo file="${tomcat}/nxserver/data/installAfterRestart-CMF.log"&amp;gt;init
+install nuxeo-cmf
 &amp;lt;/echo&amp;gt;
   &amp;lt;/target&amp;gt;
 
diff --git a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
index 5cb8b91..88c5598 100644
--- a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
+++ b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -632,7 +632,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public static void launch(final NuxeoLauncher launcher) throws IOException,
         if (launcher.command == null) {
             return;
         }
-        if ("mp-add".equalsIgnoreCase(launcher.command)
+        if ("mp-init".equalsIgnoreCase(launcher.command)
+                || "mp-purge".equalsIgnoreCase(launcher.command)
+                || "mp-add".equalsIgnoreCase(launcher.command)
                 || "mp-install".equalsIgnoreCase(launcher.command)
                 || "mp-uninstall".equalsIgnoreCase(launcher.command)
                 || "mp-remove".equalsIgnoreCase(launcher.command)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -697,6 +699,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void run() {
             commandSucceeded = launcher.pack();
         } else if ("mp-list".equalsIgnoreCase(launcher.command)) {
             launcher.pkgList();
+        } else if ("mp-init".equalsIgnoreCase(launcher.command)) {
+            launcher.pkgInit();
+        } else if ("mp-purge".equalsIgnoreCase(launcher.command)) {
+            launcher.pkgPurge();
         } else if ("mp-add".equalsIgnoreCase(launcher.command)) {
             if (launcher.hasOption(OPTION_NODEPS)) {
                 commandSucceeded = launcher.pkgAdd(params);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1514,6 +1520,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public static void printLongHelp() {
         log.error("\tpack &amp;lt;target&amp;gt;\t\tBuild a static archive. Same as the \"pack\" Shell script.");
         log.error("\tshowconf\t\tDisplay the instance configuration.");
         log.error("\tmp-list\t\t\tList marketplace packages.");
+        log.error("\tmp-init\t\t\tPre-cache marketplace packages from the distribution.");
         log.error("\tmp-update\t\tUpdate cache of marketplace packages list.");
         log.error("\tmp-add\t\t\tAdd marketplace package(s) to local cache. You must provide the package file(s) as parameter.");
         log.error("\tmp-install\t\tRun marketplace package installation. "
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1522,6 +1529,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public static void printLongHelp() {
         log.error("\tmp-uninstall\t\tUninstall marketplace package(s). You must provide the package ID(s) as parameter (see \"mp-list\" command).");
         log.error("\tmp-remove\t\tRemove marketplace package(s). You must provide the package ID(s) as parameter (see \"mp-list\" command).");
         log.error("\tmp-reset\t\tReset all packages to DOWNLOADED state. May be useful after a manual server upgrade.");
+        log.error("\tmp-purge\t\t\tUninstall and remove all packages from the local cache.");
     }
 
     /**
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1890,4 +1898,31 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean pkgRefreshCache() throws IOException, PackageException {
         return true;
     }
 
+    /**
+     * Add packages from the distribution to the local cache
+     * 
+     * &amp;lt; at &amp;gt;throws PackageException
+     * &amp;lt; at &amp;gt;throws IOException
+     * 
+     * &amp;lt; at &amp;gt;since 5.6
+     * 
+     */
+    protected void pkgInit() throws IOException, PackageException {
+        ConnectBroker pkgman = getConnectBroker();
+        pkgman.addDistributionPackages();
+    }
+
+    /**
+     * Uninstall and remove all packages from the local cache
+     * 
+     * &amp;lt; at &amp;gt;throws PackageException
+     * &amp;lt; at &amp;gt;throws IOException
+     * 
+     * &amp;lt; at &amp;gt;since 5.6
+     * 
+     */
+    protected boolean pkgPurge() throws PackageException, IOException {
+        ConnectBroker pkgman = getConnectBroker();
+        return pkgman.pkgPurge();
+    }
 }
diff --git a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
index bb1ed5d..93c93f1 100644
--- a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
+++ b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,7 +107,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public ConnectBroker(Environment env) throws IOException, PackageException {
                 + env.getProperty(Environment.DISTRIBUTION_VERSION);
         distributionMPDir = env.getProperty(PARAM_MP_DIR,
                 DISTRIBUTION_MP_DIR_DEFAULT);
-        addDistributionPackages();
     }
 
     public String getCLID() throws NoCLID {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -327,18 +326,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected void addDistributionPackage(String md5) {
         if (distributionFile.exists()) {
             try {
                 pkgAdd(distributionFile.getCanonicalPath());
-                FileUtils.deleteQuietly(distributionFile);
             } catch (IOException e) {
                 log.warn("Could not add distribution file " + md5);
             }
         }
     }
 
-    protected void deleteDistributionPackage(String md5) {
-        File distributionFile = new File(distributionMPDir, md5);
-        FileUtils.deleteQuietly(distributionFile);
-    }
-
     public void addDistributionPackages() {
         Map&amp;lt;String, PackageDefinition&amp;gt; distributionPackages = getDistributionDefinitions(getDistributionFilenames());
         if (distributionPackages.isEmpty()) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -366,9 +359,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void addDistributionPackages() {
                         pkgRemove(localPackage.getId());
                         addDistributionPackage(md5);
                     }
-                } else {
-                    // Package is already in cache
-                    deleteDistributionPackage(md5);
                 }
             } else {
                 // No package with this Id is in cache
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -470,6 +460,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean pkgReset() {
         }
     }
 
+    public boolean pkgPurge() throws PackageException {
+        List&amp;lt;String&amp;gt; localIds = new ArrayList&amp;lt;String&amp;gt;();
+        for (LocalPackage pkg : service.getPackages()) {
+            localIds.add(pkg.getId());
+        }
+        return pkgRequest(null, null, null, localIds);
+    }
+
     public LocalPackage pkgUninstall(String pkgId) {
         CommandInfo cmdInfo = new CommandInfo();
         cmdInfo.name = CommandInfo.CMD_UNINSTALL;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -746,10 +744,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean executePending(File commandsFile, boolean doExecute,
                 } else if (split.length == 1) {
                     if (line.length() &amp;gt; 0 &amp;amp;&amp;amp; !line.startsWith("#")) {
                         if (doExecute) {
-                            if (useResolver) {
-                                pkgsToInstall.add(line);
+                            if ("init".equals(line)) {
+                                addDistributionPackages();
                             } else {
-                                pkgInstall(line);
+                                if (useResolver) {
+                                    pkgsToInstall.add(line);
+                                } else {
+                                    pkgInstall(line);
+                                }
                             }
                         } else {
                             CommandInfo cmdInfo = new CommandInfo();
diff --git a/nuxeo-startup-wizard/src/main/java/org/nuxeo/wizard/download/PackageDownloader.java b/nuxeo-startup-wizard/src/main/java/org/nuxeo/wizard/download/PackageDownloader.java
index 2b80231..e2588e2 100644
--- a/nuxeo-startup-wizard/src/main/java/org/nuxeo/wizard/download/PackageDownloader.java
+++ b/nuxeo-startup-wizard/src/main/java/org/nuxeo/wizard/download/PackageDownloader.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -413,21 +413,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected File getLocalPackagesDescriptor() {
     public void scheduleDownloadedPackagesForInstallation(
             String installationFilePath) throws IOException {
         List&amp;lt;String&amp;gt; fileEntries = new ArrayList&amp;lt;String&amp;gt;();
+        fileEntries.add("init");
 
         List&amp;lt;DownloadPackage&amp;gt; pkgs = downloadOptions.getPkg4Download();
         List&amp;lt;String&amp;gt; pkgInstallIds = new ArrayList&amp;lt;String&amp;gt;();
         for (DownloadPackage pkg : pkgs) {
             if (pkg.isAlreadyInLocal()) {
-                File file = pkg.getLocalFile();
-                fileEntries.add("install file:" + file.getAbsolutePath());
+                fileEntries.add("install " + pkg.getId());
                 pkgInstallIds.add(pkg.getId());
             } else {
                 for (PendingDownload download : pendingDownloads) {
                     if (download.getPkg().equals(pkg)) {
                         if (download.getStatus() == PendingDownload.VERIFIED) {
                             File file = download.getDowloadingFile();
-                            fileEntries.add("install file:"
+                            fileEntries.add("add file:"
                                     + file.getAbsolutePath());
+                            fileEntries.add("install " + pkg.getId());
                             pkgInstallIds.add(pkg.getId());
                         } else {
                             log.error("One selected package has not been downloaded : "
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -438,15 +439,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void scheduleDownloadedPackagesForInstallation(
             }
         }
 
-        // make downloaded packages available in Admin Center for later offline
-        // usage
-        for (DownloadPackage pkg : downloadOptions.getAllPackages()) {
-            if (!pkgInstallIds.contains(pkg.getId()) &amp;amp;&amp;amp; !needToDownload(pkg)) {
-                fileEntries.add("add file:"
-                        + pkg.getLocalFile().getAbsolutePath());
-            }
-        }
-
         File installLog = new File(installationFilePath);
         if (fileEntries.size() &amp;gt; 0) {
             if (!installLog.exists()) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -458,6 +450,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void scheduleDownloadedPackagesForInstallation(
             }
             FileUtils.writeLines(installLog, fileEntries);
         } else {
+            // Should not happen as the file always has "init"
             if (installLog.exists()) {
                 installLog.delete();
             }

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Mathieu Guillaume</dc:creator>
    <dc:date>2012-05-26T08:45:56</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73228">
    <title>nuxeo-diff: NXP-8596: Add a diffDisplay contrib forthe Folder doctype (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73228</link>
    <description>&lt;pre&gt;Message:
    NXP-8596: Add a diffDisplay contrib for the Folder doc type

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T21:38:35-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/bd15faeb12be663b34df4c36e4a509af697d8da9
JIRA: https://jira.nuxeo.com/browse/NXP-8596

Files:
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java

diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
index f71d11a..46f7922 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,6 +12,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   &amp;lt;extension target="org.nuxeo.ecm.diff.service.DiffDisplayService"
     point="diffDisplay"&amp;gt;
 
+    &amp;lt;diffDisplay type="Folder"&amp;gt;
+      &amp;lt;diffBlocks&amp;gt;
+        &amp;lt;diffBlock name="heading" /&amp;gt;
+        &amp;lt;diffBlock name="dublincore" /&amp;gt;
+      &amp;lt;/diffBlocks&amp;gt;
+    &amp;lt;/diffDisplay&amp;gt;
+
     &amp;lt;diffDisplay type="File"&amp;gt;
       &amp;lt;diffBlocks&amp;gt;
         &amp;lt;diffBlock name="heading" /&amp;gt;
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
index f2fd16e..5e12935 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -89,7 +89,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffDisplayContrib() {
         // Check diffDisplay contribs
         Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; diffDisplays = diffDisplayService.getDiffDisplays();
         assertNotNull(diffDisplays);
-        assertEquals(2, diffDisplays.size());
+        assertEquals(3, diffDisplays.size());
+        assertTrue(diffDisplays.containsKey("Folder"));
         assertTrue(diffDisplays.containsKey("File"));
         assertTrue(diffDisplays.containsKey("Note"));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -97,14 +98,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffDisplayContrib() {
         List&amp;lt;String&amp;gt; diffDisplay = diffDisplayService.getDiffDisplay("Test");
         assertNull(diffDisplay);
 
-        // Check File diffDisplay contrib
-        diffDisplay = diffDisplayService.getDiffDisplay("File");
+        // Check Folder diffDisplay contrib
+        diffDisplay = diffDisplayService.getDiffDisplay("Folder");
         assertNotNull(diffDisplay);
 
         List&amp;lt;String&amp;gt; expectedDiffDisplay = new ArrayList&amp;lt;String&amp;gt;();
         expectedDiffDisplay.add("heading");
         expectedDiffDisplay.add("dublincore");
-        expectedDiffDisplay.add("files");
         assertEquals(expectedDiffDisplay, diffDisplay);
 
         // Check that order is taken into account
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -113,6 +113,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffDisplayContrib() {
         expectedDiffDisplay.add(diffBlockRef);
         assertFalse(expectedDiffDisplay.equals(diffDisplay));
 
+        // Check File diffDisplay contrib
+        diffDisplay = diffDisplayService.getDiffDisplay("File");
+        assertNotNull(diffDisplay);
+
+        expectedDiffDisplay = new ArrayList&amp;lt;String&amp;gt;();
+        expectedDiffDisplay.add("heading");
+        expectedDiffDisplay.add("dublincore");
+        expectedDiffDisplay.add("files");
+        assertEquals(expectedDiffDisplay, diffDisplay);
+
         // Check Note diffDisplay contrib
         diffDisplay = diffDisplayService.getDiffDisplay("Note");
         assertNotNull(diffDisplay);
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
index a34626c..51be418 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -95,17 +95,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffDisplayContrib() {
         // Check diffDisplay contribs
         Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; diffDisplays = diffDisplayService.getDiffDisplays();
         assertNotNull(diffDisplays);
-        assertEquals(3, diffDisplays.size());
+        assertEquals(4, diffDisplays.size());
+        assertTrue(diffDisplays.containsKey("Folder"));
         assertTrue(diffDisplays.containsKey("File"));
         assertTrue(diffDisplays.containsKey("Note"));
         assertTrue(diffDisplays.containsKey("SampleType"));
 
-        // Check overridden File diffDisplay contrib
-        List&amp;lt;String&amp;gt; diffDisplay = diffDisplayService.getDiffDisplay("File");
+        // Check non overridden Folder diffDisplay contrib
+        List&amp;lt;String&amp;gt; diffDisplay = diffDisplayService.getDiffDisplay("Folder");
         assertNotNull(diffDisplay);
 
         List&amp;lt;String&amp;gt; expectedDiffDisplay = new ArrayList&amp;lt;String&amp;gt;();
         expectedDiffDisplay.add("heading");
+        expectedDiffDisplay.add("dublincore");
+        assertEquals(expectedDiffDisplay, diffDisplay);
+
+        // Check overridden File diffDisplay contrib
+        diffDisplay = diffDisplayService.getDiffDisplay("File");
+        assertNotNull(diffDisplay);
+
+        expectedDiffDisplay = new ArrayList&amp;lt;String&amp;gt;();
+        expectedDiffDisplay.add("heading");
         expectedDiffDisplay.add("files");
         expectedDiffDisplay.add("testNoFields");
         assertEquals(expectedDiffDisplay, diffDisplay);

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T04:39:47</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73227">
    <title>nuxeo-diff: NXP-9379: Add diff action on the currentsectionselection (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73227</link>
    <description>&lt;pre&gt;Message:
    NXP-9379: Add diff action on the current section selection

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T21:27:28-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/a9ee0bbc1d117f1acdac43a7ebf1e6e6bb222a26
JIRA: https://jira.nuxeo.com/browse/NXP-9379

Files:
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml

diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
index ccafde0..224c395 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,6 +107,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean getCanDiffCurrentTrashSelection() {
 
     /**
      * Checks if the diff action is available for the
+     * {&amp;lt; at &amp;gt;link DocumentsListsManager#CURRENT_DOCUMENT_SECTION_SELECTION} working
+     * list.
+     *
+     * &amp;lt; at &amp;gt;return true if can diff the current section selection
+     */
+    public boolean getCanDiffCurrentSectionSelection() {
+
+        return getCanDiffWorkingList(DocumentsListsManager.CURRENT_DOCUMENT_SECTION_SELECTION);
+    }
+
+    /**
+     * Checks if the diff action is available for the
      * {&amp;lt; at &amp;gt;link VersionDocumentsListsConstants#CURRENT_VERSION_SELECTION} working
      * list.
      *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -169,6 +181,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String prepareCurrentTrashSelectionDiff() throws ClientException {
     }
 
     /**
+     * Prepares a diff of the current section selection.
+     *
+     * &amp;lt; at &amp;gt;return the view id
+     * &amp;lt; at &amp;gt;throws ClientException the client exception
+     */
+    public String prepareCurrentSectionSelectionDiff() throws ClientException {
+
+        diffSelectionType = DiffSelectionType.content.name();
+        return prepareWorkingListDiff(DocumentsListsManager.CURRENT_DOCUMENT_SECTION_SELECTION);
+    }
+
+    /**
      * Prepares a diff of the current version selection.
      *
      * &amp;lt; at &amp;gt;return the view id
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml
index 8eeedd8..278ba7f 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,6 +19,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;filter-id&amp;gt;canDiffCurrentTrashSelection&amp;lt;/filter-id&amp;gt;
     &amp;lt;/action&amp;gt;
 
+    &amp;lt;!-- Section actions --&amp;gt;
+    &amp;lt;action id="CURRENT_SECTION_SELECTION_DIFF"
+      link="#{diffActions.prepareCurrentSectionSelectionDiff}" label="command.clipboard.diff"
+      order="100"&amp;gt;
+      &amp;lt;category&amp;gt;CURRENT_SELECTION_SECTIONS_LIST&amp;lt;/category&amp;gt;
+      &amp;lt;filter-id&amp;gt;canDiffCurrentSectionSelection&amp;lt;/filter-id&amp;gt;
+    &amp;lt;/action&amp;gt;
+
     &amp;lt;!-- Worklist actions --&amp;gt;
     &amp;lt;action id="CURRENT_DEFAULT_SELECTION_DIFF"
       link="#{diffActions.prepareCurrentDefaultSelectionDiff}" label="command.clipboard.diff"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,6 +67,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;/rule&amp;gt;
     &amp;lt;/filter&amp;gt;
 
+    &amp;lt;filter id="canDiffCurrentSectionSelection"&amp;gt;
+      &amp;lt;rule grant="true"&amp;gt;
+        &amp;lt;condition&amp;gt;#{diffActions.canDiffCurrentSectionSelection}
+        &amp;lt;/condition&amp;gt;
+      &amp;lt;/rule&amp;gt;
+    &amp;lt;/filter&amp;gt;
+
     &amp;lt;filter id="canDiffCurrentVersionSelection"&amp;gt;
       &amp;lt;rule grant="true"&amp;gt;
         &amp;lt;condition&amp;gt;#{diffActions.canDiffCurrentVersionSelection}

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T04:27:36</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73226">
    <title>nuxeo-diff: NXP-8596: Add missing label for the uiddiffBlock(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73226</link>
    <description>&lt;pre&gt;Message:
    NXP-8596: Add missing label for the uid diffBlock

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T21:02:41-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/95c243d1146babb25c71a18c5c6ede4be522d637
JIRA: https://jira.nuxeo.com/browse/NXP-8596

Files:
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties

diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
index fd47979..1751479 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,6 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.backToCurrentDoc=Back to current document
 document.diff.backToVersions=Back to archived versions
 document.diff.backToTrash=Back to trash
 
+label.diffBlock.uid=Version
 label.diffBlock.heading=Summary
 label.diffBlock.dublincore=Dublincore
 label.diffBlock.files=Content
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
index fd47979..1751479 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,6 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.backToCurrentDoc=Back to current document
 document.diff.backToVersions=Back to archived versions
 document.diff.backToTrash=Back to trash
 
+label.diffBlock.uid=Version
 label.diffBlock.heading=Summary
 label.diffBlock.dublincore=Dublincore
 label.diffBlock.files=Content
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
index 81c3247..000d3ed 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,6 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.backToCurrentDoc=Retour au document courant
 document.diff.backToVersions=Retour aux versions archiv\u00e9es
 document.diff.backToTrash=Retour \u00e0 la corbeille
 
+label.diffBlock.uid=Version
 label.diffBlock.heading=Sommaire
 label.diffBlock.dublincore=Dublincore
 label.diffBlock.files=Contenu

pZmZCbG9ja_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T04:02:54</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73225">
    <title>nuxeo-diff: NXP-9158: Always display a 'Back to...'link in the diffresult page (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73225</link>
    <description>&lt;pre&gt;Message:
    NXP-9158: Always display a 'Back to...' link in the diff result page

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T20:51:10-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/85887a0c8fc9ecfc80a6e0d843f0db0d03c1154d
JIRA: https://jira.nuxeo.com/browse/NXP-9158

Files:
A nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffSelectionType.java
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
M nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml

diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
index cca4c12..a1fab60 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -80,7 +80,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     protected String selectedVersionId;
 
-    protected boolean isVersionDiff = false;
+    protected String diffSelectionType = DiffSelectionType.content.name();
 
     /**
      * Checks if the diff action is available for the
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -140,7 +140,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean getCanDiffWorkingList(String listName) {
      */
     public String prepareCurrentDocumentSelectionDiff() throws ClientException {
 
-        isVersionDiff = false;
+        diffSelectionType = DiffSelectionType.content.name();
         return prepareWorkingListDiff(DocumentsListsManager.CURRENT_DOCUMENT_SELECTION);
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -152,7 +152,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String prepareCurrentDocumentSelectionDiff() throws ClientException {
      */
     public String prepareCurrentVersionSelectionDiff() throws ClientException {
 
-        isVersionDiff = true;
+        diffSelectionType = DiffSelectionType.version.name();
         return prepareWorkingListDiff(DocumentsListsManager.CURRENT_VERSION_SELECTION);
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -164,7 +164,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String prepareCurrentVersionSelectionDiff() throws ClientException {
      */
     public String prepareCurrentDefaultSelectionDiff() throws ClientException {
 
-        isVersionDiff = false;
+        diffSelectionType = DiffSelectionType.content.name();
         return prepareWorkingListDiff(DocumentsListsManager.DEFAULT_WORKING_LIST);
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -213,7 +213,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String prepareCurrentVersionDiff() throws ClientException {
             leftDoc = docVersion;
             rightDoc = currentDocument;
 
-            isVersionDiff = true;
+            diffSelectionType = DiffSelectionType.version.name();
 
             return DOC_DIFF_VIEW;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -423,11 +423,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void setRightDoc(DocumentModel rightDoc) {
         this.rightDoc = rightDoc;
     }
 
-    public boolean isVersionDiff() {
-        return isVersionDiff;
+    public String getDiffSelectionType() {
+        return diffSelectionType;
     }
 
-    public void setVersionDiff(boolean isVersionDiff) {
-        this.isVersionDiff = isVersionDiff;
+    public void setDiffSelectionType(String diffSelectionType) {
+        this.diffSelectionType = diffSelectionType;
     }
 }
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffSelectionType.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffSelectionType.java
new file mode 100644
index 0000000..f2dae1e
--- /dev/null
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffSelectionType.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Antoine Taillefer
+ */
+package org.nuxeo.ecm.diff.web;
+
+/**
+ * Enumerates the types of document selection to diff.
+ *
+ * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
+ */
+public enum DiffSelectionType {
+
+    content, version, trash;
+}
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
index 5806ee4..840d8a1 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,6 +8,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.subTitle=Only the metadatas that are different are displayed.
 document.diff.noDiffAvailable=No comparaison is available since no documents have been selected for comparison.
 document.diff.emptyDiff=There are no differences between the two documents.
 document.diff.refresh=Refresh
+document.diff.backToCurrentDoc=Back to current document
 document.diff.backToVersions=Back to archived versions
 
 label.diffBlock.heading=Summary
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
index 5806ee4..840d8a1 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,6 +8,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.subTitle=Only the metadatas that are different are displayed.
 document.diff.noDiffAvailable=No comparaison is available since no documents have been selected for comparison.
 document.diff.emptyDiff=There are no differences between the two documents.
 document.diff.refresh=Refresh
+document.diff.backToCurrentDoc=Back to current document
 document.diff.backToVersions=Back to archived versions
 
 label.diffBlock.heading=Summary
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
index 8f040a7..f47ec21 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,6 +8,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.subTitle=Seules les m\u00e9tadonn\u00e9es qui pr\u00e9sentent une
 document.diff.noDiffAvailable=Comparaison indisponible puisqu'aucun document n'a \u00e9t\u00e9 s\u00e9lectionn\u00e9 pour la comparaison.
 document.diff.emptyDiff=Il n'y a aucune diff\u00e9rence entre les deux documents.
 document.diff.refresh=Rafra\u00eechir
+document.diff.backToCurrentDoc=Retour au document courant
 document.diff.backToVersions=Retour aux versions archiv\u00e9es
 
 label.diffBlock.heading=Sommaire
diff --git a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
index 3ff2715..c9cf995 100644
--- a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
+++ b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -37,7 +37,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
               &amp;lt;/ui:include&amp;gt;
             &amp;lt;/td&amp;gt;
             &amp;lt;td class="contentDiffColumn"&amp;gt;
-              &amp;lt;c:if test="#{diffActions.versionDiff}"&amp;gt;
+              &amp;lt;c:if test="#{diffActions.diffSelectionType == 'content'}"&amp;gt;
+                &amp;lt;nxd:restDocumentLink document="#{currentDocument}" styleClass="docLink"&amp;gt;
+                  &amp;lt;h:outputText value="#{messages['document.diff.backToCurrentDoc']}" /&amp;gt;
+                &amp;lt;/nxd:restDocumentLink&amp;gt;
+              &amp;lt;/c:if&amp;gt;
+              &amp;lt;c:if test="#{diffActions.diffSelectionType == 'version'}"&amp;gt;
                 &amp;lt;nxd:restDocumentLink document="#{currentDocument}" tab="TAB_CONTENT_HISTORY"
                   subTab="TAB_VERSIONS" styleClass="docLink"&amp;gt;
                   &amp;lt;h:outputText value="#{messages['document.diff.backToVersions']}" /&amp;gt;

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T03:53:09</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73224">
    <title>nuxeo-diff: NXP-9378: Add diff action on the currenttrash selection(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73224</link>
    <description>&lt;pre&gt;Message:
    NXP-9378: Add diff action on the current trash selection

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T20:52:50-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/c715bc28a1081717776c620bd56524e5ca291dea
JIRA: https://jira.nuxeo.com/browse/NXP-9378

Files:
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
M nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml

diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
index a1fab60..ccafde0 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/web/DiffActionsBean.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -95,6 +95,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean getCanDiffCurrentDocumentSelection() {
 
     /**
      * Checks if the diff action is available for the
+     * {&amp;lt; at &amp;gt;link DocumentsListsManager#CURRENT_DOCUMENT_TRASH_SELECTION} working
+     * list.
+     *
+     * &amp;lt; at &amp;gt;return true if can diff the current document trash selection
+     */
+    public boolean getCanDiffCurrentTrashSelection() {
+
+        return getCanDiffWorkingList(DocumentsListsManager.CURRENT_DOCUMENT_TRASH_SELECTION);
+    }
+
+    /**
+     * Checks if the diff action is available for the
      * {&amp;lt; at &amp;gt;link VersionDocumentsListsConstants#CURRENT_VERSION_SELECTION} working
      * list.
      *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -145,6 +157,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String prepareCurrentDocumentSelectionDiff() throws ClientException {
     }
 
     /**
+     * Prepares a diff of the current document trash selection.
+     *
+     * &amp;lt; at &amp;gt;return the view id
+     * &amp;lt; at &amp;gt;throws ClientException the client exception
+     */
+    public String prepareCurrentTrashSelectionDiff() throws ClientException {
+
+        diffSelectionType = DiffSelectionType.trash.name();
+        return prepareWorkingListDiff(DocumentsListsManager.CURRENT_DOCUMENT_TRASH_SELECTION);
+    }
+
+    /**
      * Prepares a diff of the current version selection.
      *
      * &amp;lt; at &amp;gt;return the view id
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml
index 924746f..8eeedd8 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-actions-contrib.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,6 +12,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;filter-id&amp;gt;canDiffCurrentDocumentSelection&amp;lt;/filter-id&amp;gt;
     &amp;lt;/action&amp;gt;
 
+    &amp;lt;!-- Trash actions --&amp;gt;
+    &amp;lt;action id="CURRENT_TRASH_SELECTION_DIFF" link="#{diffActions.prepareCurrentTrashSelectionDiff}"
+      label="command.clipboard.diff" order="100"&amp;gt;
+      &amp;lt;category&amp;gt;CURRENT_SELECTION_TRASH_LIST&amp;lt;/category&amp;gt;
+      &amp;lt;filter-id&amp;gt;canDiffCurrentTrashSelection&amp;lt;/filter-id&amp;gt;
+    &amp;lt;/action&amp;gt;
+
     &amp;lt;!-- Worklist actions --&amp;gt;
     &amp;lt;action id="CURRENT_DEFAULT_SELECTION_DIFF"
       link="#{diffActions.prepareCurrentDefaultSelectionDiff}" label="command.clipboard.diff"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,6 +52,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;/rule&amp;gt;
     &amp;lt;/filter&amp;gt;
 
+    &amp;lt;filter id="canDiffCurrentTrashSelection"&amp;gt;
+      &amp;lt;rule grant="true"&amp;gt;
+        &amp;lt;condition&amp;gt;#{diffActions.canDiffCurrentTrashSelection}
+        &amp;lt;/condition&amp;gt;
+      &amp;lt;/rule&amp;gt;
+    &amp;lt;/filter&amp;gt;
+
     &amp;lt;filter id="canDiffCurrentVersionSelection"&amp;gt;
       &amp;lt;rule grant="true"&amp;gt;
         &amp;lt;condition&amp;gt;#{diffActions.canDiffCurrentVersionSelection}
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
index 840d8a1..fd47979 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,6 +10,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.emptyDiff=There are no differences between the two documents.
 document.diff.refresh=Refresh
 document.diff.backToCurrentDoc=Back to current document
 document.diff.backToVersions=Back to archived versions
+document.diff.backToTrash=Back to trash
 
 label.diffBlock.heading=Summary
 label.diffBlock.dublincore=Dublincore
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
index 840d8a1..fd47979 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_en.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,6 +10,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.emptyDiff=There are no differences between the two documents.
 document.diff.refresh=Refresh
 document.diff.backToCurrentDoc=Back to current document
 document.diff.backToVersions=Back to archived versions
+document.diff.backToTrash=Back to trash
 
 label.diffBlock.heading=Summary
 label.diffBlock.dublincore=Dublincore
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
index f47ec21..81c3247 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/l10n/messages_fr.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,6 +10,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; document.diff.emptyDiff=Il n'y a aucune diff\u00e9rence entre les deux documents
 document.diff.refresh=Rafra\u00eechir
 document.diff.backToCurrentDoc=Retour au document courant
 document.diff.backToVersions=Retour aux versions archiv\u00e9es
+document.diff.backToTrash=Retour \u00e0 la corbeille
 
 label.diffBlock.heading=Sommaire
 label.diffBlock.dublincore=Dublincore
diff --git a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
index c9cf995..67151cb 100644
--- a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
+++ b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -48,6 +48,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                   &amp;lt;h:outputText value="#{messages['document.diff.backToVersions']}" /&amp;gt;
                 &amp;lt;/nxd:restDocumentLink&amp;gt;
               &amp;lt;/c:if&amp;gt;
+              &amp;lt;c:if test="#{diffActions.diffSelectionType == 'trash'}"&amp;gt;
+                &amp;lt;nxd:restDocumentLink document="#{currentDocument}" tab="TAB_MANAGE"
+                  subTab="TAB_TRASH_CONTENT" styleClass="docLink"&amp;gt;
+                  &amp;lt;h:outputText value="#{messages['document.diff.backToTrash']}" /&amp;gt;
+                &amp;lt;/nxd:restDocumentLink&amp;gt;
+              &amp;lt;/c:if&amp;gt;
             &amp;lt;/td&amp;gt;
           &amp;lt;/tr&amp;gt;
         &amp;lt;/table&amp;gt;

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T03:53:09</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73223">
    <title>nuxeo-diff: NXP-8596: FixDiffBlockDefinitionImpl#equals(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73223</link>
    <description>&lt;pre&gt;Message:
    NXP-8596: Fix DiffBlockDefinitionImpl#equals

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T20:03:13-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/bd0384ab67bf71f69f61e65974c4575cbcf1fd43
JIRA: https://jira.nuxeo.com/browse/NXP-8596

Files:
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java

diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java
index de70960..bf18677 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -122,16 +122,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean equals(Object other) {
         if (MapUtils.isEmpty(templates) &amp;amp;&amp;amp; !MapUtils.isEmpty(otherTemplates)
                 || !MapUtils.isEmpty(templates)
                 &amp;amp;&amp;amp; MapUtils.isEmpty(otherTemplates)
-                || !templates.equals(otherTemplates)
+                || (templates != null &amp;amp;&amp;amp; !templates.equals(otherTemplates))
                 || CollectionUtils.isEmpty(fields)
                 &amp;amp;&amp;amp; !CollectionUtils.isEmpty(otherFields)
                 || !CollectionUtils.isEmpty(fields)
                 &amp;amp;&amp;amp; CollectionUtils.isEmpty(otherFields)
-                || !fields.equals(otherFields) || MapUtils.isEmpty(properties)
+                || (fields != null &amp;amp;&amp;amp; !fields.equals(otherFields))
+                || MapUtils.isEmpty(properties)
                 &amp;amp;&amp;amp; !MapUtils.isEmpty(otherProperties)
                 || !MapUtils.isEmpty(properties)
                 &amp;amp;&amp;amp; MapUtils.isEmpty(otherProperties)
-                || !properties.equals(otherProperties)) {
+                || (properties != null &amp;amp;&amp;amp; !properties.equals(otherProperties))) {
             return false;
         }
 

sEmpty(pro_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T03:53:08</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73222">
    <title>nuxeo-diff: NXP-8596: Add templates and propertiesto the diffBlockdescriptor (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73222</link>
    <description>&lt;pre&gt;Message:
    NXP-8596: Add templates and properties to the diffBlock descriptor

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T18:45:52-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/d54da5ab389589a530f2cf4544e3999d5af53c49
JIRA: https://jira.nuxeo.com/browse/NXP-8596

Files:
M nuxeo-diff-jsf/pom.xml
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffBlockDefinition.java
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffBlockDescriptor.java
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
M nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
M nuxeo-diff-jsf/src/test/resources/OSGI-INF/test-diff-display-contrib.xml

diff --git a/nuxeo-diff-jsf/pom.xml b/nuxeo-diff-jsf/pom.xml
index 9fdfc50..dfd6ca1 100644
--- a/nuxeo-diff-jsf/pom.xml
+++ b/nuxeo-diff-jsf/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -41,7 +41,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;dependency&amp;gt;
       &amp;lt;groupId&amp;gt;org.nuxeo.ecm.platform&amp;lt;/groupId&amp;gt;
       &amp;lt;artifactId&amp;gt;nuxeo-platform-forms-layout-core&amp;lt;/artifactId&amp;gt;
-      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
     &amp;lt;/dependency&amp;gt;
 
   &amp;lt;/dependencies&amp;gt;
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffBlockDefinition.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffBlockDefinition.java
index 8b715d4..778fa46 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffBlockDefinition.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffBlockDefinition.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -18,34 +18,43 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import java.io.Serializable;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Diff block definition interface.
- * 
+ *
  * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
  * &amp;lt; at &amp;gt;since 5.6
  */
 public interface DiffBlockDefinition extends Serializable {
 
     /**
-     * Gets the diff block name.
-     * 
-     * &amp;lt; at &amp;gt;return the schema name
+     * Gets the diff block definition name.
      */
     String getName();
 
     /**
-     * Gets the diff block label.
-     * 
-     * &amp;lt; at &amp;gt;return the label
+     * Returns the template to use in a given mode.
      */
-    String getLabel();
+    String getTemplate(String mode);
 
     /**
-     * Gets the diff block fields.
-     * 
-     * &amp;lt; at &amp;gt;return the schema fields
+     * Returns a map of templates by mode.
+     */
+    Map&amp;lt;String, String&amp;gt; getTemplates();
+
+    /**
+     * Returns the list of field definitions.
      */
     List&amp;lt;DiffFieldDefinition&amp;gt; getFields();
 
+    /**
+     * Returns a map of properties to use in a given mode.
+     */
+    Map&amp;lt;String, Serializable&amp;gt; getProperties(String layoutMode);
+
+    /**
+     * Returns a map of properties by mode.
+     */
+    Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; getProperties();
 }
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java
index b6587c0..de70960 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffBlockDefinitionImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,17 +16,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 package org.nuxeo.ecm.diff.model.impl;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.collections.MapUtils;
 import org.nuxeo.ecm.diff.model.DiffBlockDefinition;
 import org.nuxeo.ecm.diff.model.DiffFieldDefinition;
+import org.nuxeo.ecm.platform.forms.layout.api.BuiltinModes;
+import org.nuxeo.ecm.platform.forms.layout.api.impl.WidgetDefinitionImpl;
 
 /**
  * Default implementation of a {&amp;lt; at &amp;gt;link DiffBlockDefinition}.
- * 
+ *
  * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
  * &amp;lt; at &amp;gt;since 5.6
  */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,41 +38,58 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     private static final long serialVersionUID = 511776842683091931L;
 
-    protected static final String DIFF_DISPLAY_BLOCK_LABEL_PREFIX = "label.diffBlock.";
-
     protected String name;
 
-    protected String label;
+    protected Map&amp;lt;String, String&amp;gt; templates;
 
     protected List&amp;lt;DiffFieldDefinition&amp;gt; fields;
 
-    public DiffBlockDefinitionImpl(String name, String label,
-            List&amp;lt;DiffFieldDefinition&amp;gt; fields) {
+    protected Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; properties;
+
+    public DiffBlockDefinitionImpl(String name, Map&amp;lt;String, String&amp;gt; templates,
+            List&amp;lt;DiffFieldDefinition&amp;gt; fields,
+            Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; properties) {
         this.name = name;
-        if (StringUtils.isEmpty(label)) {
-            this.label = DIFF_DISPLAY_BLOCK_LABEL_PREFIX + name;
-        } else {
-            this.label = label;
-        }
+        this.templates = templates;
         if (fields == null) {
             this.fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
         } else {
             this.fields = fields;
         }
+        this.properties = properties;
     }
 
     public String getName() {
         return name;
     }
 
-    public String getLabel() {
-        return label;
+    public String getTemplate(String mode) {
+        if (templates != null) {
+            String template = templates.get(mode);
+            if (template == null) {
+                template = templates.get(BuiltinModes.ANY);
+            }
+            return template;
+        }
+        return null;
+    }
+
+    public Map&amp;lt;String, String&amp;gt; getTemplates() {
+        return templates;
     }
 
     public List&amp;lt;DiffFieldDefinition&amp;gt; getFields() {
         return fields;
     }
 
+    public Map&amp;lt;String, Serializable&amp;gt; getProperties(String layoutMode) {
+        return WidgetDefinitionImpl.getProperties(properties, layoutMode);
+    }
+
+    public Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; getProperties() {
+        return properties;
+    }
+
     &amp;lt; at &amp;gt;Override
     public boolean equals(Object other) {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,16 +109,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean equals(Object other) {
             return false;
         }
 
+        Map&amp;lt;String, String&amp;gt; otherTemplates = ((DiffBlockDefinition) other).getTemplates();
         List&amp;lt;DiffFieldDefinition&amp;gt; otherFields = ((DiffBlockDefinition) other).getFields();
-        if (CollectionUtils.isEmpty(fields)
-                &amp;amp;&amp;amp; CollectionUtils.isEmpty(otherFields)) {
+        Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; otherProperties = ((DiffBlockDefinition) other).getProperties();
+        if (MapUtils.isEmpty(templates) &amp;amp;&amp;amp; MapUtils.isEmpty(otherTemplates)
+                &amp;amp;&amp;amp; CollectionUtils.isEmpty(fields)
+                &amp;amp;&amp;amp; CollectionUtils.isEmpty(otherFields)
+                &amp;amp;&amp;amp; MapUtils.isEmpty(properties)
+                &amp;amp;&amp;amp; MapUtils.isEmpty(otherProperties)) {
             return true;
         }
-        if (CollectionUtils.isEmpty(fields)
+        if (MapUtils.isEmpty(templates) &amp;amp;&amp;amp; !MapUtils.isEmpty(otherTemplates)
+                || !MapUtils.isEmpty(templates)
+                &amp;amp;&amp;amp; MapUtils.isEmpty(otherTemplates)
+                || !templates.equals(otherTemplates)
+                || CollectionUtils.isEmpty(fields)
                 &amp;amp;&amp;amp; !CollectionUtils.isEmpty(otherFields)
                 || !CollectionUtils.isEmpty(fields)
                 &amp;amp;&amp;amp; CollectionUtils.isEmpty(otherFields)
-                || !fields.equals(otherFields)) {
+                || !fields.equals(otherFields) || MapUtils.isEmpty(properties)
+                &amp;amp;&amp;amp; !MapUtils.isEmpty(otherProperties)
+                || !MapUtils.isEmpty(properties)
+                &amp;amp;&amp;amp; MapUtils.isEmpty(otherProperties)
+                || !properties.equals(otherProperties)) {
             return false;
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -106,6 +140,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean equals(Object other) {
 
     &amp;lt; at &amp;gt;Override
     public String toString() {
-        return name + fields;
+        return name + fields + templates + properties;
     }
 }
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffBlockDescriptor.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffBlockDescriptor.java
index d984ec3..33c74e5 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffBlockDescriptor.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffBlockDescriptor.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,20 +12,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     ataillefer
+ *     Antoine Taillefer
  */
 package org.nuxeo.ecm.diff.service.impl;
 
+import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.nuxeo.common.xmap.annotation.XNode;
 import org.nuxeo.common.xmap.annotation.XNodeList;
+import org.nuxeo.common.xmap.annotation.XNodeMap;
 import org.nuxeo.common.xmap.annotation.XObject;
+import org.nuxeo.ecm.platform.forms.layout.api.BuiltinModes;
+import org.nuxeo.ecm.platform.forms.layout.descriptors.PropertiesDescriptor;
+import org.nuxeo.ecm.platform.forms.layout.descriptors.WidgetDescriptor;
 
 /**
  * Diff block descriptor.
- * 
+ *
  * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
  * &amp;lt; at &amp;gt;since 5.6
  */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,12 +42,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt; at &amp;gt;XNode("&amp;lt; at &amp;gt;name")
     public String name;
 
-    &amp;lt; at &amp;gt;XNode("&amp;lt; at &amp;gt;label")
-    public String label;
+    &amp;lt; at &amp;gt;XNodeMap(value = "templates/template", key = "&amp;lt; at &amp;gt;mode", type = HashMap.class, componentType = String.class)
+    Map&amp;lt;String, String&amp;gt; templates = new HashMap&amp;lt;String, String&amp;gt;();
 
     &amp;lt; at &amp;gt;XNodeList(value = "fields/field", type = ArrayList.class, componentType = DiffFieldDescriptor.class)
     public List&amp;lt;DiffFieldDescriptor&amp;gt; fields;
 
+    &amp;lt; at &amp;gt;XNodeMap(value = "properties", key = "&amp;lt; at &amp;gt;mode", type = HashMap.class, componentType = PropertiesDescriptor.class)
+    Map&amp;lt;String, PropertiesDescriptor&amp;gt; properties = new HashMap&amp;lt;String, PropertiesDescriptor&amp;gt;();
+
     public String getName() {
         return name;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -49,12 +59,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void setName(String name) {
         this.name = name;
     }
 
-    public String getLabel() {
-        return label;
+    public String getTemplate(String mode) {
+        String template = templates.get(mode);
+        if (template == null) {
+            template = templates.get(BuiltinModes.ANY);
+        }
+        return template;
     }
 
-    public void setLabel(String label) {
-        this.label = label;
+    public Map&amp;lt;String, String&amp;gt; getTemplates() {
+        return templates;
+    }
+
+    public void setTemplates(Map&amp;lt;String, String&amp;gt; templates) {
+        this.templates = templates;
     }
 
     public List&amp;lt;DiffFieldDescriptor&amp;gt; getFields() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -64,4 +82,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void setLabel(String label) {
     public void setFields(List&amp;lt;DiffFieldDescriptor&amp;gt; fields) {
         this.fields = fields;
     }
+
+    public Map&amp;lt;String, Serializable&amp;gt; getProperties(String layoutMode) {
+        return WidgetDescriptor.getProperties(properties, layoutMode);
+    }
+
+    public Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; getProperties() {
+        return WidgetDescriptor.getProperties(properties);
+    }
+
+    public void setProperties(Map&amp;lt;String, PropertiesDescriptor&amp;gt; properties) {
+        this.properties = properties;
+    }
 }
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
index 3f069ab..2834cd4 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -94,6 +94,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     protected static final String DIFF_WIDGET_CATEGORY = "diff";
 
+    protected static final String DIFF_BLOCK_DEFAULT_TEMPLATE_PATH = "/layouts/layout_diff_template.xhtml";
+
+    protected static final String DIFF_BLOCK_LABEL_PROPERTY_NAME = "label";
+
+    protected static final String DIFF_BLOCK_DEFAULT_LABEL_PREFIX = "label.diffBlock.";
+
     protected static final String DIFF_WIDGET_LABEL_PREFIX = "label.";
 
     protected static final String CONTENT_DIFF_LINKS_WIDGET_NAME = "contentDiffLinks";
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -395,7 +401,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final void registerDiffBlock(DiffBlockDescriptor descriptor) {
                 diffBlockContribs.put(
                         diffBlockName,
                         new DiffBlockDefinitionImpl(diffBlockName,
-                                descriptor.getLabel(), fields));
+                                descriptor.getTemplates(), fields,
+                                descriptor.getProperties()));
             }
         }
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -419,8 +426,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final void registerDiffBlock(DiffBlockDescriptor descriptor) {
                                 fieldName));
                     }
                 }
-                diffBlockDefs.add(new DiffBlockDefinitionImpl(schemaName, null,
-                        fieldDefs));
+
+                Map&amp;lt;String, String&amp;gt; defaultDiffBlockTemplates = new HashMap&amp;lt;String, String&amp;gt;();
+                defaultDiffBlockTemplates.put(BuiltinModes.ANY,
+                        DIFF_BLOCK_DEFAULT_TEMPLATE_PATH);
+
+                Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; defaultDiffBlockProperties = new HashMap&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt;();
+                Map&amp;lt;String, Serializable&amp;gt; labelProperty = new HashMap&amp;lt;String, Serializable&amp;gt;();
+                labelProperty.put(DIFF_BLOCK_LABEL_PROPERTY_NAME,
+                        DIFF_BLOCK_DEFAULT_LABEL_PREFIX + schemaName);
+                defaultDiffBlockProperties.put(BuiltinModes.ANY, labelProperty);
+
+                diffBlockDefs.add(new DiffBlockDefinitionImpl(schemaName,
+                        defaultDiffBlockTemplates, fieldDefs,
+                        defaultDiffBlockProperties));
             }
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -566,13 +585,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final DiffDisplayBlock getDiffDisplayBlock(
 
         // Build layout definition
         LayoutDefinition layoutDefinition = new LayoutDefinitionImpl(
-                diffBlockDefinition.getName(), null, null,
-                layoutRowDefinitions, widgetDefinitions);
+                diffBlockDefinition.getName(),
+                diffBlockDefinition.getProperties(),
+                diffBlockDefinition.getTemplates(), layoutRowDefinitions,
+                widgetDefinitions);
 
         // Build diff display block
+        Map&amp;lt;String, Serializable&amp;gt; diffBlockProperties = diffBlockDefinition.getProperties(BuiltinModes.ANY);
         DiffDisplayBlock diffDisplayBlock = new DiffDisplayBlockImpl(
-                diffBlockDefinition.getLabel(), leftValue, rightValue,
-                contentDiffValue, layoutDefinition);
+                (String) diffBlockProperties.get(DIFF_BLOCK_LABEL_PROPERTY_NAME),
+                leftValue, rightValue, contentDiffValue, layoutDefinition);
 
         return diffDisplayBlock;
     }
diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
index 247fc1f..f71d11a 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-display-contrib.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,14 +34,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   &amp;lt;extension target="org.nuxeo.ecm.diff.service.DiffDisplayService"
     point="diffBlock"&amp;gt;
 
-    &amp;lt;diffBlock name="heading" label="label.diffBlock.heading"&amp;gt;
+    &amp;lt;diffBlock name="heading"&amp;gt;
+      &amp;lt;properties mode="any"&amp;gt;
+        &amp;lt;property name="label"&amp;gt;label.diffBlock.heading&amp;lt;/property&amp;gt;
+      &amp;lt;/properties&amp;gt;
       &amp;lt;fields&amp;gt;
         &amp;lt;field schema="dublincore" name="title" /&amp;gt;
         &amp;lt;field schema="dublincore" name="description" /&amp;gt;
       &amp;lt;/fields&amp;gt;
+      &amp;lt;templates&amp;gt;
+        &amp;lt;template mode="any"&amp;gt;/layouts/layout_diff_template.xhtml
+        &amp;lt;/template&amp;gt;
+      &amp;lt;/templates&amp;gt;
     &amp;lt;/diffBlock&amp;gt;
 
-    &amp;lt;diffBlock name="dublincore" label="label.diffBlock.dublincore"&amp;gt;
+    &amp;lt;diffBlock name="dublincore"&amp;gt;
+      &amp;lt;properties mode="any"&amp;gt;
+        &amp;lt;property name="label"&amp;gt;label.diffBlock.dublincore&amp;lt;/property&amp;gt;
+      &amp;lt;/properties&amp;gt;
       &amp;lt;fields&amp;gt;
         &amp;lt;field schema="dublincore" name="nature" /&amp;gt;
         &amp;lt;field schema="dublincore" name="subjects" /&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,9 +67,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         &amp;lt;field schema="dublincore" name="contributors" /&amp;gt;
         &amp;lt;field schema="dublincore" name="lastContributor" /&amp;gt;
       &amp;lt;/fields&amp;gt;
+      &amp;lt;templates&amp;gt;
+        &amp;lt;template mode="any"&amp;gt;/layouts/layout_diff_template.xhtml
+        &amp;lt;/template&amp;gt;
+      &amp;lt;/templates&amp;gt;
     &amp;lt;/diffBlock&amp;gt;
 
-    &amp;lt;diffBlock name="files" label="label.diffBlock.files"&amp;gt;
+    &amp;lt;diffBlock name="files"&amp;gt;
+      &amp;lt;properties mode="any"&amp;gt;
+        &amp;lt;property name="label"&amp;gt;label.diffBlock.files&amp;lt;/property&amp;gt;
+      &amp;lt;/properties&amp;gt;
       &amp;lt;fields&amp;gt;
         &amp;lt;field schema="file" name="content"
           displayContentDiffLinks="true" /&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -71,21 +88,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
           &amp;lt;/items&amp;gt;
         &amp;lt;/field&amp;gt;
       &amp;lt;/fields&amp;gt;
+      &amp;lt;templates&amp;gt;
+        &amp;lt;template mode="any"&amp;gt;/layouts/layout_diff_template.xhtml
+        &amp;lt;/template&amp;gt;
+      &amp;lt;/templates&amp;gt;
     &amp;lt;/diffBlock&amp;gt;
 
-    &amp;lt;diffBlock name="note" label="label.diffBlock.note"&amp;gt;
+    &amp;lt;diffBlock name="note"&amp;gt;
+      &amp;lt;properties mode="any"&amp;gt;
+        &amp;lt;property name="label"&amp;gt;label.diffBlock.note&amp;lt;/property&amp;gt;
+      &amp;lt;/properties&amp;gt;
       &amp;lt;fields&amp;gt;
         &amp;lt;field schema="note" name="note" displayContentDiffLinks="true" /&amp;gt;
       &amp;lt;/fields&amp;gt;
+      &amp;lt;templates&amp;gt;
+        &amp;lt;template mode="any"&amp;gt;/layouts/layout_diff_template.xhtml
+        &amp;lt;/template&amp;gt;
+      &amp;lt;/templates&amp;gt;
     &amp;lt;/diffBlock&amp;gt;
 
-    &amp;lt;!-- &amp;lt;diffBlock name="dublincore"&amp;gt; &amp;lt;properties mode="any"&amp;gt; &amp;lt;property 
-      name="label"&amp;gt;label.diffBlock.dublincore&amp;lt;/property&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;templates&amp;gt; 
-      &amp;lt;template mode="any"&amp;gt;/layouts/layout_default_template.xhtml &amp;lt;/template&amp;gt; &amp;lt;/templates&amp;gt; 
-      &amp;lt;fields&amp;gt; &amp;lt;field schema="dublincore" name="created" category="truc" /&amp;gt; &amp;lt;field 
-      schema="dublincore" name="modified" /&amp;gt; &amp;lt;field schema="dublincore" name="creator" 
-      /&amp;gt; &amp;lt;field schema="dublincore" name="lastContributor" /&amp;gt; &amp;lt;/fields&amp;gt; &amp;lt;/diffBlock&amp;gt; --&amp;gt;
-
   &amp;lt;/extension&amp;gt;
 
 &amp;lt;/component&amp;gt;
diff --git a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
index 3400ebe..3ff2715 100644
--- a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
+++ b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/incl/diff/doc_diff_result.xhtml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,7 +66,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             &amp;lt;/h3&amp;gt;
             &amp;lt;div class="boxBody"&amp;gt;
               &amp;lt;nxl:layout mode="view" definition="#{diffDisplayBlock.layoutDefinition}"
-                value="#{diffDisplayBlock}" template="/layouts/layout_diff_template.xhtml"/&amp;gt;
+                value="#{diffDisplayBlock}" /&amp;gt;
             &amp;lt;/div&amp;gt;
           &amp;lt;/div&amp;gt;
         &amp;lt;/c:forEach&amp;gt;
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
index c719724..05120a9 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -22,7 +22,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,6 +37,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.ecm.diff.model.impl.DiffBlockDefinitionImpl;
 import org.nuxeo.ecm.diff.model.impl.DiffFieldDefinitionImpl;
 import org.nuxeo.ecm.diff.model.impl.DiffFieldItemDefinitionImpl;
+import org.nuxeo.ecm.platform.forms.layout.api.BuiltinModes;
 import org.nuxeo.runtime.test.runner.Deploy;
 import org.nuxeo.runtime.test.runner.Features;
 import org.nuxeo.runtime.test.runner.FeaturesRunner;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -148,8 +151,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         List&amp;lt;DiffFieldDefinition&amp;gt; fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
         fields.add(new DiffFieldDefinitionImpl("dublincore", "title"));
         fields.add(new DiffFieldDefinitionImpl("dublincore", "description"));
+
+        Map&amp;lt;String, String&amp;gt; templates = new HashMap&amp;lt;String, String&amp;gt;();
+        templates.put(BuiltinModes.ANY, "/layouts/layout_diff_template.xhtml");
+
+        Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; properties = new HashMap&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt;();
+        Map&amp;lt;String, Serializable&amp;gt; labelProperty = new HashMap&amp;lt;String, Serializable&amp;gt;();
+        labelProperty.put("label", "label.diffBlock.heading");
+        properties.put(BuiltinModes.ANY, labelProperty);
+
         DiffBlockDefinition expectedDiffBlockDefinition = new DiffBlockDefinitionImpl(
-                "heading", null, fields);
+                "heading", templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check that order is taken into account
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -177,8 +189,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         fields.add(new DiffFieldDefinitionImpl("dublincore", "creator"));
         fields.add(new DiffFieldDefinitionImpl("dublincore", "contributors"));
         fields.add(new DiffFieldDefinitionImpl("dublincore", "lastContributor"));
+
+        labelProperty.put("label", "label.diffBlock.dublincore");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("dublincore",
-                null, fields);
+                templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check files diffDisplay contrib
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -190,8 +204,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         List&amp;lt;DiffFieldItemDefinition&amp;gt; items = new ArrayList&amp;lt;DiffFieldItemDefinition&amp;gt;();
         items.add(new DiffFieldItemDefinitionImpl("file", true));
         fields.add(new DiffFieldDefinitionImpl("files", "files", items));
+
+        labelProperty.put("label", "label.diffBlock.files");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("files",
-                null, fields);
+                templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check note diffDisplay contrib
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -200,8 +216,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
         fields.add(new DiffFieldDefinitionImpl("note", "note", true));
-        expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("note", null,
-                fields);
+
+        labelProperty.put("label", "label.diffBlock.note");
+        expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("note",
+                templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
     }
 }
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
index 0384643..107b358 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -21,7 +21,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,6 +36,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.ecm.diff.model.impl.DiffBlockDefinitionImpl;
 import org.nuxeo.ecm.diff.model.impl.DiffFieldDefinitionImpl;
 import org.nuxeo.ecm.diff.model.impl.DiffFieldItemDefinitionImpl;
+import org.nuxeo.ecm.platform.forms.layout.api.BuiltinModes;
 import org.nuxeo.runtime.test.runner.Deploy;
 import org.nuxeo.runtime.test.runner.Features;
 import org.nuxeo.runtime.test.runner.FeaturesRunner;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -159,8 +162,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         List&amp;lt;DiffFieldDefinition&amp;gt; fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
         fields.add(new DiffFieldDefinitionImpl("dublincore", "title"));
         fields.add(new DiffFieldDefinitionImpl("dublincore", "description"));
+
+        Map&amp;lt;String, String&amp;gt; templates = new HashMap&amp;lt;String, String&amp;gt;();
+        templates.put(BuiltinModes.ANY, "/layouts/layout_diff_template.xhtml");
+
+        Map&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt; properties = new HashMap&amp;lt;String, Map&amp;lt;String, Serializable&amp;gt;&amp;gt;();
+        Map&amp;lt;String, Serializable&amp;gt; labelProperty = new HashMap&amp;lt;String, Serializable&amp;gt;();
+        labelProperty.put("label", "label.diffBlock.heading");
+        properties.put(BuiltinModes.ANY, labelProperty);
+
         DiffBlockDefinition expectedDiffBlockDefinition = new DiffBlockDefinitionImpl(
-                "heading", null, fields);
+                "heading", templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check overridden dublincore diffDisplay contrib
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -174,8 +186,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         fields.add(new DiffFieldDefinitionImpl("dublincore", "lastContributor"));
         fields.add(new DiffFieldDefinitionImpl("dublincore", "contributors"));
         fields.add(new DiffFieldDefinitionImpl("dublincore", "subjects"));
+
+        labelProperty.put("label", "label.diffBlock.dublincore");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("dublincore",
-                null, fields);
+                templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check non overridden files diffDisplay contrib
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -187,8 +201,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         List&amp;lt;DiffFieldItemDefinition&amp;gt; items = new ArrayList&amp;lt;DiffFieldItemDefinition&amp;gt;();
         items.add(new DiffFieldItemDefinitionImpl("file", true));
         fields.add(new DiffFieldDefinitionImpl("files", "files", items));
+
+        labelProperty.put("label", "label.diffBlock.files");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("files",
-                null, fields);
+                templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check non overridden note diffDisplay contrib
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -197,8 +213,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
         fields.add(new DiffFieldDefinitionImpl("note", "note", true));
-        expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("note", null,
-                fields);
+
+        labelProperty.put("label", "label.diffBlock.note");
+        expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("note",
+                templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check new simpleTypes diffDisplay contrib
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -213,8 +231,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         fields.add(new DiffFieldDefinitionImpl("simpletypes", "date"));
         fields.add(new DiffFieldDefinitionImpl("simpletypes", "htmlText", true));
         fields.add(new DiffFieldDefinitionImpl("simpletypes", "multivalued"));
+
+        labelProperty.put("label", "label.diffBlock.simpleTypes");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl(
-                "simpleTypes", null, fields);
+                "simpleTypes", templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
 
         // Check new complexTypesAndListOfLists diffDisplay contrib
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -235,8 +255,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         fields.add(new DiffFieldDefinitionImpl("complextypes", "complexList",
                 items));
         fields.add(new DiffFieldDefinitionImpl("listoflists", "listOfLists"));
+
+        labelProperty.put("label", "label.diffBlock.complexTypesAndListOfLists");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl(
-                "complexTypesAndListOfLists", null, fields);
+                "complexTypesAndListOfLists", templates, fields, properties);
         assertEquals(expectedDiffBlockDefinition, diffBlockDefinition);
     }
 }
diff --git a/nuxeo-diff-jsf/src/test/resources/OSGI-INF/test-diff-display-contrib.xml b/nuxeo-diff-jsf/src/test/resources/OSGI-INF/test-diff-display-contrib.xml
index e15cafe..ed453d7 100644
--- a/nuxeo-diff-jsf/src/test/resources/OSGI-INF/test-diff-display-contrib.xml
+++ b/nuxeo-diff-jsf/src/test/resources/OSGI-INF/test-diff-display-contrib.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -49,7 +49,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;diffBlock name="testNoFields" /&amp;gt;
 
     &amp;lt;!-- Override dublincore diffBlock --&amp;gt;
-    &amp;lt;diffBlock name="dublincore" label="label.diffBlock.dublincore"&amp;gt;
+    &amp;lt;diffBlock name="dublincore"&amp;gt;
+      &amp;lt;properties mode="any"&amp;gt;
+        &amp;lt;property name="label"&amp;gt;label.diffBlock.dublincore&amp;lt;/property&amp;gt;
+      &amp;lt;/properties&amp;gt;
       &amp;lt;fields&amp;gt;
         &amp;lt;field schema="dublincore" name="created" /&amp;gt;
         &amp;lt;field schema="dublincore" name="creator" /&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,10 +61,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         &amp;lt;field schema="dublincore" name="contributors" /&amp;gt;
         &amp;lt;field schema="dublincore" name="subjects" /&amp;gt;
       &amp;lt;/fields&amp;gt;
+      &amp;lt;templates&amp;gt;
+        &amp;lt;template mode="any"&amp;gt;/layouts/layout_diff_template.xhtml
+        &amp;lt;/template&amp;gt;
+      &amp;lt;/templates&amp;gt;
     &amp;lt;/diffBlock&amp;gt;
 
     &amp;lt;!-- simpleTypes diffBlock --&amp;gt;
-    &amp;lt;diffBlock name="simpleTypes" label="label.diffBlock.simpleTypes"&amp;gt;
+    &amp;lt;diffBlock name="simpleTypes"&amp;gt;
+      &amp;lt;properties mode="any"&amp;gt;
+        &amp;lt;property name="label"&amp;gt;label.diffBlock.simpleTypes&amp;lt;/property&amp;gt;
+      &amp;lt;/properties&amp;gt;
       &amp;lt;fields&amp;gt;
         &amp;lt;field schema="simpletypes" name="string" /&amp;gt;
         &amp;lt;field schema="simpletypes" name="textarea"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -73,11 +83,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
           displayContentDiffLinks="true" /&amp;gt;
         &amp;lt;field schema="simpletypes" name="multivalued" /&amp;gt;
       &amp;lt;/fields&amp;gt;
+      &amp;lt;templates&amp;gt;
+        &amp;lt;template mode="any"&amp;gt;/layouts/layout_diff_template.xhtml
+        &amp;lt;/template&amp;gt;
+      &amp;lt;/templates&amp;gt;
     &amp;lt;/diffBlock&amp;gt;
 
     &amp;lt;!-- complexTypesAndListOfLists diffBlock --&amp;gt;
-    &amp;lt;diffBlock name="complexTypesAndListOfLists"
-      label="label.diffBlock.complexTypesAndListOfLists"&amp;gt;
+    &amp;lt;diffBlock name="complexTypesAndListOfLists"&amp;gt;
+      &amp;lt;properties mode="any"&amp;gt;
+        &amp;lt;property name="label"&amp;gt;label.diffBlock.complexTypesAndListOfLists
+        &amp;lt;/property&amp;gt;
+      &amp;lt;/properties&amp;gt;
       &amp;lt;fields&amp;gt;
         &amp;lt;field schema="complextypes" name="complex"&amp;gt;
           &amp;lt;items&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -96,6 +113,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         &amp;lt;/field&amp;gt;
         &amp;lt;field schema="listoflists" name="listOfLists" /&amp;gt;
       &amp;lt;/fields&amp;gt;
+      &amp;lt;templates&amp;gt;
+        &amp;lt;template mode="any"&amp;gt;/layouts/layout_diff_template.xhtml
+        &amp;lt;/template&amp;gt;
+      &amp;lt;/templates&amp;gt;
     &amp;lt;/diffBlock&amp;gt;
 
   &amp;lt;/extension&amp;gt;

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T03:53:07</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73221">
    <title>nuxeo-diff: NXP-8596: Add category to the fielddescriptor(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73221</link>
    <description>&lt;pre&gt;Message:
    NXP-8596: Add category to the field descriptor

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T20:02:20-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/66e1157c4c7f55a925eb85038a21569a5f5d678f
JIRA: https://jira.nuxeo.com/browse/NXP-8596

Files:
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffFieldDefinition.java
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffFieldDefinitionImpl.java
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
M nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffFieldDescriptor.java
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java

diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffFieldDefinition.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffFieldDefinition.java
index e3f8c33..9866228 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffFieldDefinition.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/DiffFieldDefinition.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,7 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     ataillefer
+ *     Antoine Taillefer
  */
 package org.nuxeo.ecm.diff.model;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,6 +28,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 public interface DiffFieldDefinition extends Serializable {
 
     /**
+     * Optional category on the field: if this category is filled, the widget
+     * instance will be looked up with this category in the store
+     */
+    String getCategory();
+
+    /**
      * Gets the field schema.
      *
      * &amp;lt; at &amp;gt;return the field schema
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffFieldDefinitionImpl.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffFieldDefinitionImpl.java
index 55d45eb..bb91256 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffFieldDefinitionImpl.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/model/impl/DiffFieldDefinitionImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,7 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     ataillefer
+ *     Antoine Taillefer
  */
 package org.nuxeo.ecm.diff.model.impl;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,6 +33,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     private static final long serialVersionUID = 6192730067253949180L;
 
+    protected String category;
+
     protected String schema;
 
     protected String name;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -41,29 +43,34 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     protected List&amp;lt;DiffFieldItemDefinition&amp;gt; items;
 
-    public DiffFieldDefinitionImpl(String schema, String name) {
-        this(schema, name, false);
+    public DiffFieldDefinitionImpl(String category, String schema, String name) {
+        this(category, schema, name, false);
     }
 
-    public DiffFieldDefinitionImpl(String schema, String name,
+    public DiffFieldDefinitionImpl(String category, String schema, String name,
             boolean displayContentDiffLinks) {
-        this(schema, name, displayContentDiffLinks,
+        this(category, schema, name, displayContentDiffLinks,
                 new ArrayList&amp;lt;DiffFieldItemDefinition&amp;gt;());
     }
 
-    public DiffFieldDefinitionImpl(String schema, String name,
+    public DiffFieldDefinitionImpl(String category, String schema, String name,
             List&amp;lt;DiffFieldItemDefinition&amp;gt; items) {
-        this(schema, name, false, items);
+        this(category, schema, name, false, items);
     }
 
-    public DiffFieldDefinitionImpl(String schema, String name,
+    public DiffFieldDefinitionImpl(String category, String schema, String name,
             boolean displayContentDiffLinks, List&amp;lt;DiffFieldItemDefinition&amp;gt; items) {
+        this.category = category;
         this.schema = schema;
         this.name = name;
         this.displayContentDiffLinks = displayContentDiffLinks;
         this.items = items;
     }
 
+    public String getCategory() {
+        return category;
+    }
+
     public String getSchema() {
         return schema;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,16 +97,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean equals(Object other) {
             return false;
         }
 
+        String otherCategory = ((DiffFieldDefinition) other).getCategory();
         String otherSchema = ((DiffFieldDefinition) other).getSchema();
         String otherName = ((DiffFieldDefinition) other).getName();
         boolean otherDisplayContentDiffLinks = ((DiffFieldDefinition) other).isDisplayContentDiffLinks();
-        if (schema == null &amp;amp;&amp;amp; otherSchema == null &amp;amp;&amp;amp; name == null
-                &amp;amp;&amp;amp; otherName == null) {
+        if (category == null &amp;amp;&amp;amp; otherCategory == null &amp;amp;&amp;amp; schema == null
+                &amp;amp;&amp;amp; otherSchema == null &amp;amp;&amp;amp; name == null &amp;amp;&amp;amp; otherName == null) {
             return true;
         }
         if (schema == null || otherSchema == null || name == null
-                || otherName == null || !schema.equals(otherSchema)
-                || !name.equals(otherName)
+                || otherName == null
+                || (category == null &amp;amp;&amp;amp; otherCategory != null)
+                || (category != null &amp;amp;&amp;amp; otherCategory == null)
+                || (category != null &amp;amp;&amp;amp; !category.equals(otherCategory))
+                || (schema != null &amp;amp;&amp;amp; !schema.equals(otherSchema))
+                || (name != null &amp;amp;&amp;amp; !name.equals(otherName))
                 || displayContentDiffLinks != otherDisplayContentDiffLinks) {
             return false;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -122,8 +134,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean equals(Object other) {
 
     &amp;lt; at &amp;gt;Override
     public String toString() {
-        return schema + ":" + name + " (displayContentDiffLinks: "
-                + displayContentDiffLinks + ") "
-                + (!CollectionUtils.isEmpty(items) ? items : "");
+        StringBuilder sb = new StringBuilder();
+        sb.append("category=");
+        sb.append(category);
+        sb.append(" / ");
+        sb.append(schema);
+        sb.append(":");
+        sb.append(name);
+        sb.append(" / ");
+        sb.append("displayContentDiffLinks=");
+        sb.append(displayContentDiffLinks);
+        sb.append(!CollectionUtils.isEmpty(items) ? " / " + items : "");
+        return sb.toString();
     }
 }
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
index 2834cd4..47b31a1 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffDisplayServiceImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,7 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     ataillefer
+ *     Antoine Taillefer
  */
 package org.nuxeo.ecm.diff.service.impl;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -381,6 +381,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final void registerDiffBlock(DiffBlockDescriptor descriptor) {
                 // Some field descriptors were found =&amp;gt; use them to add the
                 // described fields, taking their order into account.
                 for (DiffFieldDescriptor fieldDescriptor : fieldDescriptors) {
+                    String category = fieldDescriptor.getCategory();
                     String schema = fieldDescriptor.getSchema();
                     String name = fieldDescriptor.getName();
                     boolean displayContentDiffLinks = fieldDescriptor.isDisplayContentDiffLinks();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -393,8 +394,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final void registerDiffBlock(DiffBlockDescriptor descriptor) {
                                     fieldItemDescriptor.getName(),
                                     fieldItemDescriptor.isDisplayContentDiffLinks()));
                         }
-                        fields.add(new DiffFieldDefinitionImpl(schema, name,
-                                displayContentDiffLinks, items));
+                        fields.add(new DiffFieldDefinitionImpl(category,
+                                schema, name, displayContentDiffLinks, items));
                     }
                 }
                 // TODO: implement merge
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -422,8 +423,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final void registerDiffBlock(DiffBlockDescriptor descriptor) {
                     // Only add the field if it is not excluded
                     if (diffExcludedFields == null
                             || !diffExcludedFields.contains(fieldName)) {
-                        fieldDefs.add(new DiffFieldDefinitionImpl(schemaName,
-                                fieldName));
+                        fieldDefs.add(new DiffFieldDefinitionImpl(
+                                DIFF_WIDGET_CATEGORY, schemaName, fieldName));
                     }
                 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -493,6 +494,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final DiffDisplayBlock getDiffDisplayBlock(
         List&amp;lt;DiffFieldDefinition&amp;gt; fieldDefinitions = diffBlockDefinition.getFields();
         for (DiffFieldDefinition fieldDefinition : fieldDefinitions) {
 
+            String category = fieldDefinition.getCategory();
+            if (StringUtils.isEmpty(category)) {
+                category = DIFF_WIDGET_CATEGORY;
+            }
             String schemaName = fieldDefinition.getSchema();
             String fieldName = fieldDefinition.getName();
             boolean displayContentDiffLinks = fieldDefinition.isDisplayContentDiffLinks();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -508,12 +513,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final DiffDisplayBlock getDiffDisplayBlock(
 
                     // Set property widget definition
                     WidgetDefinition propertyWidgetDefinition = getWidgetDefinition(
-                            propertyName, fieldDiff.getPropertyType(), null,
-                            fieldItemDefs, false);
+                            category, propertyName,
+                            fieldDiff.getPropertyType(), null, fieldItemDefs,
+                            false);
                     widgetDefinitions.add(propertyWidgetDefinition);
                     // Set property widget ref
                     WidgetReferenceImpl propertyWidgetRef = new WidgetReferenceImpl(
-                            DIFF_WIDGET_CATEGORY, propertyName);
+                            category, propertyName);
                     widgetReferences.add(propertyWidgetRef);
 
                     // Check if must display the content diff links widget
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -529,11 +535,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final DiffDisplayBlock getDiffDisplayBlock(
                     // needed
                     if (displayContentDiffLinks) {
                         WidgetDefinition contentDiffLinksWidgetDefinition = getWidgetDefinition(
-                                propertyName, fieldDiff.getPropertyType(),
-                                null, fieldItemDefs, true);
+                                category, propertyName,
+                                fieldDiff.getPropertyType(), null,
+                                fieldItemDefs, true);
                         widgetDefinitions.add(contentDiffLinksWidgetDefinition);
                         WidgetReferenceImpl contentDiffLinksWidgetRef = new WidgetReferenceImpl(
-                                DIFF_WIDGET_CATEGORY, propertyName
+                                category, propertyName
                                         + CONTENT_DIFF_LINKS_WIDGET_NAME_SUFFIX);
                         widgetReferences.add(contentDiffLinksWidgetRef);
                     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1258,8 +1265,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean isComplexType(Serializable property) {
 
     // TODO: better separate regular and contentDiffLinksWidget cases (call
     // submethods)
-    protected final WidgetDefinition getWidgetDefinition(String propertyName,
-            String propertyType, Field field,
+    protected final WidgetDefinition getWidgetDefinition(String category,
+            String propertyName, String propertyType, Field field,
             List&amp;lt;DiffFieldItemDefinition&amp;gt; complexFieldItemDefs,
             boolean isContentDiffLinksWidget) throws ClientException {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1270,14 +1277,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final WidgetDefinition getWidgetDefinition(String propertyName,
         if (!isContentDiffLinksWidget) {
             // Look for a specific widget in the "diff" category named with the
             // property name
-            wDef = getLayoutStore().getWidgetDefinition(DIFF_WIDGET_CATEGORY,
-                    propertyName);
+            wDef = getLayoutStore().getWidgetDefinition(category, propertyName);
             if (wDef == null) {
                 isGeneric = true;
                 // Fallback on a generic widget in the "diff" category named
                 // with the property type
-                wDef = getLayoutStore().getWidgetDefinition(
-                        DIFF_WIDGET_CATEGORY, propertyType);
+                wDef = getLayoutStore().getWidgetDefinition(category,
+                        propertyType);
                 if (wDef == null) {
                     throw new ClientException(
                             String.format(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1289,8 +1295,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final WidgetDefinition getWidgetDefinition(String propertyName,
             isGeneric = true;
             if (PropertyType.isSimpleType(propertyType)
                     || PropertyType.isContentType(propertyType)) {
-                wDef = getLayoutStore().getWidgetDefinition(
-                        DIFF_WIDGET_CATEGORY, CONTENT_DIFF_LINKS_WIDGET_NAME);
+                wDef = getLayoutStore().getWidgetDefinition(category,
+                        CONTENT_DIFF_LINKS_WIDGET_NAME);
                 if (wDef == null) {
                     throw new ClientException(
                             String.format(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1300,8 +1306,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final WidgetDefinition getWidgetDefinition(String propertyName,
             } else {
                 // Get the generic widget in the "diff" category named with
                 // the property type
-                wDef = getLayoutStore().getWidgetDefinition(
-                        DIFF_WIDGET_CATEGORY, propertyType);
+                wDef = getLayoutStore().getWidgetDefinition(category,
+                        propertyType);
                 if (wDef == null) {
                     throw new ClientException(
                             String.format(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1399,7 +1405,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final WidgetDefinition getWidgetDefinition(String propertyName,
                     wDef = wDef.clone();
                     isCloned = true;
                 }
-                wDef.setSubWidgetDefinitions(getSubWidgetDefinitions(
+                wDef.setSubWidgetDefinitions(getSubWidgetDefinitions(category,
                         propertyName, propertyType, declaringField,
                         complexFieldItemDefs, isDisplayItemIndexes(wDef),
                         isContentDiffLinksWidget));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1433,7 +1439,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final String getFieldDefinitionStyleClassFieldName(
                 + DIFF_WIDGET_FIELD_DEFINITION_STYLE_CLASS_SUFFIX;
     }
 
-    protected final WidgetDefinition[] getSubWidgetDefinitions(
+    protected final WidgetDefinition[] getSubWidgetDefinitions(String category,
             String propertyName, String propertyType, Field field,
             List&amp;lt;DiffFieldItemDefinition&amp;gt; complexFieldItemDefs,
             boolean isDisplayItemIndexes, boolean isContentDiffLinks)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1443,8 +1449,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final String getFieldDefinitionStyleClassFieldName(
         // Complex
         if (PropertyType.isComplexType(propertyType)
                 &amp;amp;&amp;amp; !PropertyType.isContentType(propertyType)) {
-            subWidgetDefs = getComplexSubWidgetDefinitions(propertyName, field,
-                    complexFieldItemDefs, false, isContentDiffLinks);
+            subWidgetDefs = getComplexSubWidgetDefinitions(category,
+                    propertyName, field, complexFieldItemDefs, false,
+                    isContentDiffLinks);
         }
         // Scalar or content list
         else if (PropertyType.isScalarListType(propertyType)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1452,6 +1459,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; else if (PropertyType.isScalarListType(propertyType)
             Field listFieldItem = ComplexPropertyHelper.getListFieldItem(field);
             subWidgetDefs = initSubWidgetDefinitions(isDisplayItemIndexes, 1);
             subWidgetDefs[subWidgetDefs.length - 1] = getWidgetDefinition(
+                    category,
                     getSubPropertyFullName(propertyName,
                             listFieldItem.getName().getLocalName()),
                     ComplexPropertyHelper.getFieldType(listFieldItem),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1463,15 +1471,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; else if (PropertyType.isScalarListType(propertyType)
         // Complex list
         else if (PropertyType.isComplexListType(propertyType)) {
             Field listFieldItem = ComplexPropertyHelper.getListFieldItem(field);
-            subWidgetDefs = getComplexSubWidgetDefinitions(propertyName,
-                    listFieldItem, complexFieldItemDefs, isDisplayItemIndexes,
-                    isContentDiffLinks);
+            subWidgetDefs = getComplexSubWidgetDefinitions(category,
+                    propertyName, listFieldItem, complexFieldItemDefs,
+                    isDisplayItemIndexes, isContentDiffLinks);
         }
         return subWidgetDefs;
     }
 
     protected final WidgetDefinition[] getComplexSubWidgetDefinitions(
-            String propertyName, Field field,
+            String category, String propertyName, Field field,
             List&amp;lt;DiffFieldItemDefinition&amp;gt; complexFieldItemDefs,
             boolean isDisplayItemIndexes, boolean isContentDiffLinks)
             throws ClientException {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1486,6 +1494,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; else if (PropertyType.isComplexListType(propertyType)) {
 
             for (Field complexFieldItem : complexFieldItems) {
                 subWidgetDefs[subWidgetIndex] = getWidgetDefinition(
+                        category,
                         getSubPropertyFullName(propertyName,
                                 complexFieldItem.getName().getLocalName()),
                         ComplexPropertyHelper.getFieldType(complexFieldItem),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1515,6 +1524,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; else if (PropertyType.isComplexListType(propertyType)) {
                             field, complexFieldItemName);
                     if (complexFieldItem != null) {
                         subWidgetDefs[subWidgetIndex] = getWidgetDefinition(
+                                category,
                                 getSubPropertyFullName(propertyName,
                                         complexFieldItemName),
                                 ComplexPropertyHelper.getFieldType(complexFieldItem),
diff --git a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffFieldDescriptor.java b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffFieldDescriptor.java
index 90d4f0d..4ba6d60 100644
--- a/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffFieldDescriptor.java
+++ b/nuxeo-diff-jsf/src/main/java/org/nuxeo/ecm/diff/service/impl/DiffFieldDescriptor.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,7 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     ataillefer
+ *     Antoine Taillefer
  */
 package org.nuxeo.ecm.diff.service.impl;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -22,6 +22,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.common.xmap.annotation.XNode;
 import org.nuxeo.common.xmap.annotation.XNodeList;
 import org.nuxeo.common.xmap.annotation.XObject;
+import org.nuxeo.ecm.diff.model.DiffFieldDefinition;
+import org.nuxeo.ecm.diff.model.impl.DiffFieldDefinitionImpl;
 
 /**
  * Diff field descriptor.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,6 +34,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 &amp;lt; at &amp;gt;XObject("field")
 public class DiffFieldDescriptor {
 
+    &amp;lt; at &amp;gt;XNode("&amp;lt; at &amp;gt;category")
+    public String category;
+
     &amp;lt; at &amp;gt;XNode("&amp;lt; at &amp;gt;schema")
     public String schema;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -44,12 +49,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt; at &amp;gt;XNodeList(value = "items/item", type = ArrayList.class, componentType = DiffFieldItemDescriptor.class)
     public List&amp;lt;DiffFieldItemDescriptor&amp;gt; items;
 
-    public String getName() {
-        return name;
+    public String getCategory() {
+        return category;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setCategory(String category) {
+        this.category = category;
     }
 
     public String getSchema() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,12 +65,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void setSchema(String schema) {
         this.schema = schema;
     }
 
-    public List&amp;lt;DiffFieldItemDescriptor&amp;gt; getItems() {
-        return items;
+    public String getName() {
+        return name;
     }
 
-    public void setItems(List&amp;lt;DiffFieldItemDescriptor&amp;gt; items) {
-        this.items = items;
+    public void setName(String name) {
+        this.name = name;
     }
 
     public boolean isDisplayContentDiffLinks() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -75,4 +80,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean isDisplayContentDiffLinks() {
     public void setDisplayContentDiffLinks(boolean displayContentDiffLinks) {
         this.displayContentDiffLinks = displayContentDiffLinks;
     }
+
+    public List&amp;lt;DiffFieldItemDescriptor&amp;gt; getItems() {
+        return items;
+    }
+
+    public void setItems(List&amp;lt;DiffFieldItemDescriptor&amp;gt; items) {
+        this.items = items;
+    }
+
+    public DiffFieldDefinition getDiffFieldDefinition() {
+        return new DiffFieldDefinitionImpl(getCategory(), getSchema(),
+                getName());
+    }
 }
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
index 05120a9..f2fd16e 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContrib.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,7 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     ataillefer
+ *     Antoine Taillefer
  */
 package org.nuxeo.ecm.diff.service;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -149,8 +149,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         List&amp;lt;DiffFieldDefinition&amp;gt; fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "title"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "description"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "title"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore",
+                "description"));
 
         Map&amp;lt;String, String&amp;gt; templates = new HashMap&amp;lt;String, String&amp;gt;();
         templates.put(BuiltinModes.ANY, "/layouts/layout_diff_template.xhtml");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -176,19 +177,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "nature"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "subjects"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "rights"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "source"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "coverage"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "created"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "modified"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "format"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "language"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "expired"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "creator"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "contributors"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "lastContributor"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "nature"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "subjects"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "rights"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "source"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "coverage"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "created"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "modified"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "format"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "language"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "expired"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "creator"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore",
+                "contributors"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore",
+                "lastContributor"));
 
         labelProperty.put("label", "label.diffBlock.dublincore");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("dublincore",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -200,10 +203,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("file", "content", true));
+        fields.add(new DiffFieldDefinitionImpl(null, "file", "content", true));
         List&amp;lt;DiffFieldItemDefinition&amp;gt; items = new ArrayList&amp;lt;DiffFieldItemDefinition&amp;gt;();
         items.add(new DiffFieldItemDefinitionImpl("file", true));
-        fields.add(new DiffFieldDefinitionImpl("files", "files", items));
+        fields.add(new DiffFieldDefinitionImpl(null, "files", "files", items));
 
         labelProperty.put("label", "label.diffBlock.files");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("files",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -215,7 +218,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("note", "note", true));
+        fields.add(new DiffFieldDefinitionImpl(null, "note", "note", true));
 
         labelProperty.put("label", "label.diffBlock.note");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("note",
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
index 107b358..a34626c 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayContribOverride.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,7 +12,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     ataillefer
+ *     Antoine Taillefer
  */
 package org.nuxeo.ecm.diff.service;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -160,8 +160,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         List&amp;lt;DiffFieldDefinition&amp;gt; fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "title"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "description"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "title"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore",
+                "description"));
 
         Map&amp;lt;String, String&amp;gt; templates = new HashMap&amp;lt;String, String&amp;gt;();
         templates.put(BuiltinModes.ANY, "/layouts/layout_diff_template.xhtml");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -180,12 +181,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "created"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "creator"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "modified"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "lastContributor"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "contributors"));
-        fields.add(new DiffFieldDefinitionImpl("dublincore", "subjects"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "created"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "creator"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "modified"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore",
+                "lastContributor"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore",
+                "contributors"));
+        fields.add(new DiffFieldDefinitionImpl(null, "dublincore", "subjects"));
 
         labelProperty.put("label", "label.diffBlock.dublincore");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("dublincore",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -197,10 +200,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("file", "content", true));
+        fields.add(new DiffFieldDefinitionImpl(null, "file", "content", true));
         List&amp;lt;DiffFieldItemDefinition&amp;gt; items = new ArrayList&amp;lt;DiffFieldItemDefinition&amp;gt;();
         items.add(new DiffFieldItemDefinitionImpl("file", true));
-        fields.add(new DiffFieldDefinitionImpl("files", "files", items));
+        fields.add(new DiffFieldDefinitionImpl(null, "files", "files", items));
 
         labelProperty.put("label", "label.diffBlock.files");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("files",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -212,7 +215,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("note", "note", true));
+        fields.add(new DiffFieldDefinitionImpl(null, "note", "note", true));
 
         labelProperty.put("label", "label.diffBlock.note");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl("note",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -224,13 +227,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         assertNotNull(diffBlockDefinition);
 
         fields = new ArrayList&amp;lt;DiffFieldDefinition&amp;gt;();
-        fields.add(new DiffFieldDefinitionImpl("simpletypes", "string"));
-        fields.add(new DiffFieldDefinitionImpl("simpletypes", "textarea", true));
-        fields.add(new DiffFieldDefinitionImpl("simpletypes", "boolean"));
-        fields.add(new DiffFieldDefinitionImpl("simpletypes", "integer"));
-        fields.add(new DiffFieldDefinitionImpl("simpletypes", "date"));
-        fields.add(new DiffFieldDefinitionImpl("simpletypes", "htmlText", true));
-        fields.add(new DiffFieldDefinitionImpl("simpletypes", "multivalued"));
+        fields.add(new DiffFieldDefinitionImpl(null, "simpletypes", "string"));
+        fields.add(new DiffFieldDefinitionImpl(null, "simpletypes", "textarea",
+                true));
+        fields.add(new DiffFieldDefinitionImpl(null, "simpletypes", "boolean"));
+        fields.add(new DiffFieldDefinitionImpl(null, "simpletypes", "integer"));
+        fields.add(new DiffFieldDefinitionImpl(null, "simpletypes", "date"));
+        fields.add(new DiffFieldDefinitionImpl(null, "simpletypes", "htmlText",
+                true));
+        fields.add(new DiffFieldDefinitionImpl(null, "simpletypes",
+                "multivalued"));
 
         labelProperty.put("label", "label.diffBlock.simpleTypes");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -247,14 +253,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testDiffBlockContrib() {
         items.add(new DiffFieldItemDefinitionImpl("integerItem"));
         items.add(new DiffFieldItemDefinitionImpl("dateItem"));
         items.add(new DiffFieldItemDefinitionImpl("booleanItem"));
-        fields.add(new DiffFieldDefinitionImpl("complextypes", "complex", items));
+        fields.add(new DiffFieldDefinitionImpl(null, "complextypes", "complex",
+                items));
         items = new ArrayList&amp;lt;DiffFieldItemDefinition&amp;gt;();
         items.add(new DiffFieldItemDefinitionImpl("stringItem", true));
         items.add(new DiffFieldItemDefinitionImpl("dateItem"));
         items.add(new DiffFieldItemDefinitionImpl("integerItem"));
-        fields.add(new DiffFieldDefinitionImpl("complextypes", "complexList",
-                items));
-        fields.add(new DiffFieldDefinitionImpl("listoflists", "listOfLists"));
+        fields.add(new DiffFieldDefinitionImpl(null, "complextypes",
+                "complexList", items));
+        fields.add(new DiffFieldDefinitionImpl(null, "listoflists",
+                "listOfLists"));
 
         labelProperty.put("label", "label.diffBlock.complexTypesAndListOfLists");
         expectedDiffBlockDefinition = new DiffBlockDefinitionImpl(

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T03:53:08</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73220">
    <title>nuxeo-diff: NXP-8596: Use the schema:field notationfor the'note:note' widget field definitions (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73220</link>
    <description>&lt;pre&gt;Message:
    NXP-8596: Use the schema:field notation for the 'note:note' widget field definitions

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T16:46:19-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/0fb5cf708e12ecbbc227900ffa54e740ee3e6588
JIRA: https://jira.nuxeo.com/browse/NXP-8596

Files:
M nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-widgets-contrib.xml

diff --git a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-widgets-contrib.xml b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-widgets-contrib.xml
index 20b18db..6bf9fa1 100644
--- a/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-widgets-contrib.xml
+++ b/nuxeo-diff-jsf/src/main/resources/OSGI-INF/diff-widgets-contrib.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -158,8 +158,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;/labels&amp;gt;
       &amp;lt;translated&amp;gt;true&amp;lt;/translated&amp;gt;
       &amp;lt;fields&amp;gt;
-        &amp;lt;field schema="note"&amp;gt;note/value&amp;lt;/field&amp;gt;
-        &amp;lt;field schema="note"&amp;gt;mime_type/value&amp;lt;/field&amp;gt;
+        &amp;lt;field&amp;gt;note:note/value&amp;lt;/field&amp;gt;
+        &amp;lt;field&amp;gt;note:mime_type/value&amp;lt;/field&amp;gt;
       &amp;lt;/fields&amp;gt;
       &amp;lt;properties mode="any"&amp;gt;
         &amp;lt;property name="translatedHtml"&amp;gt;

"note"&amp;gt;note/val_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-26T03:53:07</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73219">
    <title>nuxeo-distribution: NXP-9268: Automatically adddistribution packagesto local cache (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73219</link>
    <description>&lt;pre&gt;Message:
    NXP-9268: Automatically add distribution packages to local cache

Repository: nuxeo-distribution
Branch: master
Author: Mathieu Guillaume &amp;lt;mg&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T15:47:29-07:00
URL: https://github.com/nuxeo/nuxeo-distribution/commit/c3794d29f6c66c371d3e3e8e1d095cd93ce639d2
JIRA: https://jira.nuxeo.com/browse/NXP-9268

Files:
M nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
M nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java

diff --git a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
index b9961bd..5cb8b91 100644
--- a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
+++ b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/NuxeoLauncher.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -328,14 +328,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private ProcessManager getOSProcessManager() {
     /**
      * Do not directly call this method without a call to
      * {&amp;lt; at &amp;gt;link #checkNoRunningServer()}
-     *
+     * 
      * &amp;lt; at &amp;gt;see #doStart()
      * &amp;lt; at &amp;gt;throws IOException In case of issue with process.
      * &amp;lt; at &amp;gt;throws InterruptedException If any thread has interrupted the current
      *             thread.
      */
     protected void start(boolean logProcessOutput) throws IOException,
-    InterruptedException {
+            InterruptedException {
         List&amp;lt;String&amp;gt; startCommand = new ArrayList&amp;lt;String&amp;gt;();
         startCommand.add(getJavaExecutable().getPath());
         startCommand.addAll(Arrays.asList(getJavaOptsProperty().split(" ")));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -363,9 +363,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected void start(boolean logProcessOutput) throws IOException,
 
     /**
      * Gets the java options with Nuxeo properties substituted.
-     *
+     * 
      * It enables usage of property like ${nuxeo.log.dir} inside JAVA_OPTS.
-     *
+     * 
      * &amp;lt; at &amp;gt;return the java options string.
      */
     protected String getJavaOptsProperty() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -388,7 +388,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected String getJavaOptsProperty() {
      * Check if some server is already running (from another thread) and throw a
      * Runtime exception if it finds one. That method will work where
      * {&amp;lt; at &amp;gt;link #isRunning()} won't.
-     *
+     * 
      * &amp;lt; at &amp;gt;throws IllegalThreadStateException Thrown if a server is already
      *             running.
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -434,7 +434,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void checkNoRunningServer() throws IllegalStateException {
 
     /**
      * Will wrap, if necessary, the command within a Shell command
-     *
+     * 
      * &amp;lt; at &amp;gt;param roughCommand Java command which will be run
      * &amp;lt; at &amp;gt;return wrapped command depending on the OS
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -605,7 +605,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected static CommandLine parseOptions(String[] args)
     }
 
     public static void main(String[] args) throws ConfigurationException,
-    IOException, PackageException {
+            IOException, PackageException {
         try {
             final NuxeoLauncher launcher = createLauncher(args);
             if (launcher.useGui &amp;amp;&amp;amp; launcher.getGUI() == null) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -626,7 +626,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public static void main(String[] args) throws ConfigurationException,
      * &amp;lt; at &amp;gt;throws IOException
      */
     public static void launch(final NuxeoLauncher launcher) throws IOException,
-    PackageException {
+            PackageException {
         int exitStatus = 0;
         boolean commandSucceeded = true;
         if (launcher.command == null) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -854,7 +854,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void stop() {
 
     /**
      * Call {&amp;lt; at &amp;gt;link #doStart(boolean)} with false as parameter.
-     *
+     * 
      * &amp;lt; at &amp;gt;see #doStart(boolean)
      * &amp;lt; at &amp;gt;return true if the server started successfully
      * &amp;lt; at &amp;gt;throws PackageException
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -867,9 +867,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean doStart() throws PackageException {
      * Whereas {&amp;lt; at &amp;gt;link #doStart()} considers the server as started when the
      * process is running, {&amp;lt; at &amp;gt;link #doStartAndWait()} waits for effective start
      * by watching the logs
-     *
+     * 
      * &amp;lt; at &amp;gt;param logProcessOutput Must process output stream must be logged or not.
-     *
+     * 
      * &amp;lt; at &amp;gt;return true if the server started successfully
      * &amp;lt; at &amp;gt;throws PackageException
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -963,7 +963,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean waitForEffectiveStart() throws InterruptedException {
 
     /**
      * Must be called after {&amp;lt; at &amp;gt;link #getStartupSummary()}
-     *
+     * 
      * &amp;lt; at &amp;gt;since 5.5
      * &amp;lt; at &amp;gt;return last detected status of running Nuxeo server
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -987,7 +987,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String getStartupSummary() {
 
     /**
      * Starts the server in background.
-     *
+     * 
      * &amp;lt; at &amp;gt;return true if server successfully started
      * &amp;lt; at &amp;gt;throws PackageException
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1114,9 +1114,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected void printXMLOutput(JAXBContext jaxbContext, Object objectToOutput) {
 
     /**
      * Stop stream gobblers contained in the given ArrayList
-     *
+     * 
      * &amp;lt; at &amp;gt;throws InterruptedException
-     *
+     * 
      * &amp;lt; at &amp;gt;since 5.5
      * &amp;lt; at &amp;gt;see #logProcessStreams(Process, boolean)
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1188,7 +1188,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected void addShutdownHook() {
 
     /**
      * Stops the server.
-     *
+     * 
      * Will try to call specific class for a clean stop, retry
      * {&amp;lt; at &amp;gt;link #STOP_NB_TRY}, waiting {&amp;lt; at &amp;gt;link #STOP_SECONDS_BEFORE_NEXT_TRY}
      * between each try, then kill the process if still running.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1298,7 +1298,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private String getPid() throws IOException {
 
     /**
      * Configure the server after checking installation
-     *
+     * 
      * &amp;lt; at &amp;gt;throws ConfigurationException If an installation error is detected or if
      *             configuration fails
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1322,7 +1322,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private String getDefaultMaxWait() {
      * Return process status (running or not) as String, depending on OS
      * capability to manage processes. Set status value following
      * "http://refspecs.freestandards.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html"
-     *
+     * 
      * &amp;lt; at &amp;gt;see #status
      */
     public String status() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1394,7 +1394,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public static NuxeoLauncher createLauncher(String[] args)
     /**
      * Sets from program arguments the launcher command and additional
      * parameters.
-     *
+     * 
      * &amp;lt; at &amp;gt;param cmdLine Program arguments; may be used by launcher implementation.
      *            Must not be null or empty.
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1528,7 +1528,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public static void printLongHelp() {
      * Work best with current nuxeoProcess. If nuxeoProcess is null or has
      * exited, then will try to get process ID (so, result in that case depends
      * on OS capabilities).
-     *
+     * 
      * &amp;lt; at &amp;gt;return true if current process is running or if a running PID is found
      */
     public boolean isRunning() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1583,7 +1583,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String getURL() {
     }
 
     protected ConnectBroker getConnectBroker() throws IOException,
-    PackageException {
+            PackageException {
         if (connectBroker == null) {
             connectBroker = new ConnectBroker(configurationGenerator.getEnv());
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1598,7 +1598,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected void pkgList() throws IOException, PackageException {
     }
 
     protected boolean pkgAdd(String[] pkgNames) throws IOException,
-    PackageException {
+            PackageException {
         ConnectBroker pkgman = getConnectBroker();
         boolean cmdOK = true;
         LocalPackage pkg;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1614,7 +1614,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean pkgAdd(String[] pkgNames) throws IOException,
     }
 
     protected boolean pkgInstall(String[] pkgIDs) throws IOException,
-    PackageException {
+            PackageException {
         ConnectBroker pkgman = getConnectBroker();
         boolean cmdOK = true;
         if (configurationGenerator.isInstallInProgress()) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1634,7 +1634,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean pkgInstall(String[] pkgIDs) throws IOException,
     }
 
     protected boolean pkgUninstall(String[] pkgIDs) throws IOException,
-    PackageException {
+            PackageException {
         ConnectBroker pkgman = getConnectBroker();
         boolean cmdOK = true;
         LocalPackage pkg;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1650,7 +1650,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean pkgUninstall(String[] pkgIDs) throws IOException,
     }
 
     protected boolean pkgRemove(String[] pkgIDs) throws IOException,
-    PackageException {
+            PackageException {
         ConnectBroker pkgman = getConnectBroker();
         boolean cmdOK = true;
         LocalPackage pkg;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1806,7 +1806,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean showConfig() throws IOException, PackageException {
             } else {
                 File testBase = new File(configurationGenerator.getNuxeoHome(),
                         ConfigurationGenerator.TEMPLATES + File.separator
-                        + template);
+                                + template);
                 if (testBase.exists()) {
                     nxConfig.basetemplates.add(template);
                     log.info("Base template: " + template);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1867,8 +1867,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean pkgRequest(List&amp;lt;String&amp;gt; pkgsToAdd,
                             configurationGenerator.getInstallFile(), true, true);
         }
         cmdOK = cmdOK
-                &amp;amp;&amp;amp; pkgman.pkgRequest(pkgsToAdd, pkgsToInstall,
-                        pkgsToUninstall, pkgsToRemove);
+                &amp;amp;&amp;amp; pkgman.pkgRequest(pkgsToAdd, pkgsToInstall, pkgsToUninstall,
+                        pkgsToRemove);
         cset = pkgman.getCommandSet();
         if (!cmdOK) {
             errorValue = 3;
diff --git a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
index af09a6b..bb1ed5d 100644
--- a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
+++ b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -22,13 +22,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.logging.Log;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -49,11 +61,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.connect.update.PackageState;
 import org.nuxeo.connect.update.ValidationStatus;
 import org.nuxeo.connect.update.Version;
+import org.nuxeo.connect.update.model.PackageDefinition;
 import org.nuxeo.connect.update.standalone.StandaloneUpdateService;
 import org.nuxeo.connect.update.task.Task;
 import org.nuxeo.launcher.info.CommandInfo;
 import org.nuxeo.launcher.info.CommandSetInfo;
 import org.nuxeo.launcher.info.PackageInfo;
+import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
 
 /**
  * &amp;lt; at &amp;gt;since 5.6
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -64,6 +79,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     private static final int PACKAGES_DOWNLOAD_TIMEOUT_SECONDS = 300;
 
+    public static final String PARAM_MP_DIR = "nuxeo.distribution.marketplace.dir";
+
+    public static final String DISTRIBUTION_MP_DIR_DEFAULT = "setupWizardDownloads";
+
+    public static final String PACKAGES_XML = "packages.xml";
+
     private Environment env;
 
     private StandaloneUpdateService service;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -74,6 +95,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     private String targetPlatform;
 
+    private String distributionMPDir;
+
     public ConnectBroker(Environment env) throws IOException, PackageException {
         this.env = env;
         service = new StandaloneUpdateService(env);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -82,6 +105,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public ConnectBroker(Environment env) throws IOException, PackageException {
         NuxeoConnectClient.setCallBackHolder(cbHolder);
         targetPlatform = env.getProperty(Environment.DISTRIBUTION_NAME) + "-"
                 + env.getProperty(Environment.DISTRIBUTION_VERSION);
+        distributionMPDir = env.getProperty(PARAM_MP_DIR,
+                DISTRIBUTION_MP_DIR_DEFAULT);
+        addDistributionPackages();
     }
 
     public String getCLID() throws NoCLID {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -226,6 +252,131 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean isLocalPackageFile(String pkgFile) {
         return (getLocalPackageFile(pkgFile) != null);
     }
 
+    protected List&amp;lt;String&amp;gt; getDistributionFilenames() {
+        File distributionMPFile = new File(distributionMPDir, PACKAGES_XML);
+        List&amp;lt;String&amp;gt; md5Filenames = new ArrayList&amp;lt;String&amp;gt;();
+        // Try to get md5 files from packages.xml
+        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+        docFactory.setNamespaceAware(true);
+        try {
+            DocumentBuilder builder = docFactory.newDocumentBuilder();
+            Document doc = builder.parse(distributionMPFile);
+            XPathFactory xpFactory = XPathFactory.newInstance();
+            XPath xpath = xpFactory.newXPath();
+            XPathExpression expr = xpath.compile("//package/&amp;lt; at &amp;gt;md5");
+            NodeList nodes = (NodeList) expr.evaluate(doc,
+                    XPathConstants.NODESET);
+            for (int i = 0; i &amp;lt; nodes.getLength(); i++) {
+                String md5 = nodes.item(i).getNodeValue();
+                if ((md5 != null) &amp;amp;&amp;amp; (md5.length() &amp;gt; 0)) {
+                    md5Filenames.add(md5);
+                }
+            }
+        } catch (Exception e) {
+            // Parsing failed - return empty list
+            log.error("Failed parsing " + distributionMPFile, e);
+            return new ArrayList&amp;lt;String&amp;gt;();
+        }
+        return md5Filenames;
+    }
+
+    protected Map&amp;lt;String, PackageDefinition&amp;gt; getDistributionDefinitions(
+            List&amp;lt;String&amp;gt; md5Filenames) {
+        Map&amp;lt;String, PackageDefinition&amp;gt; allDefinitions = new HashMap&amp;lt;String, PackageDefinition&amp;gt;();
+        if (md5Filenames == null) {
+            return allDefinitions;
+        }
+        for (String md5Filename : md5Filenames) {
+            File md5File = new File(distributionMPDir, md5Filename);
+            if (!md5File.exists()) {
+                // distribution file has been deleted
+                continue;
+            }
+            ZipFile zipFile;
+            try {
+                zipFile = new ZipFile(md5File);
+            } catch (ZipException e) {
+                log.warn("Unzip error reading file " + md5File, e);
+                continue;
+            } catch (IOException e) {
+                log.warn("Could not read file " + md5File, e);
+                continue;
+            }
+            try {
+                ZipEntry zipEntry = zipFile.getEntry("package.xml");
+                InputStream in = zipFile.getInputStream(zipEntry);
+                PackageDefinition pd = NuxeoConnectClient.getPackageUpdateService().loadPackage(
+                        in);
+                allDefinitions.put(md5Filename, pd);
+            } catch (Exception e) {
+                log.error("Could not read package description", e);
+                continue;
+            } finally {
+                try {
+                    zipFile.close();
+                } catch (IOException e) {
+                    log.warn("Unexpected error closing file " + md5File, e);
+                }
+            }
+        }
+        return allDefinitions;
+    }
+
+    protected void addDistributionPackage(String md5) {
+        File distributionFile = new File(distributionMPDir, md5);
+        if (distributionFile.exists()) {
+            try {
+                pkgAdd(distributionFile.getCanonicalPath());
+                FileUtils.deleteQuietly(distributionFile);
+            } catch (IOException e) {
+                log.warn("Could not add distribution file " + md5);
+            }
+        }
+    }
+
+    protected void deleteDistributionPackage(String md5) {
+        File distributionFile = new File(distributionMPDir, md5);
+        FileUtils.deleteQuietly(distributionFile);
+    }
+
+    public void addDistributionPackages() {
+        Map&amp;lt;String, PackageDefinition&amp;gt; distributionPackages = getDistributionDefinitions(getDistributionFilenames());
+        if (distributionPackages.isEmpty()) {
+            return;
+        }
+        List&amp;lt;LocalPackage&amp;gt; localPackages = getPkgList();
+        Map&amp;lt;String, LocalPackage&amp;gt; localPackagesById = new HashMap&amp;lt;String, LocalPackage&amp;gt;();
+        if (localPackages != null) {
+            for (LocalPackage pkg : localPackages) {
+                localPackagesById.put(pkg.getId(), pkg);
+            }
+        }
+        for (String md5 : distributionPackages.keySet()) {
+            PackageDefinition md5Pkg = distributionPackages.get(md5);
+            if (localPackagesById.containsKey(md5Pkg.getId())) {
+                // We have the same package Id in the local cache
+                LocalPackage localPackage = localPackagesById.get(md5Pkg.getId());
+                if (localPackage.getVersion().isSnapshot()) {
+                    // - For snapshots, until we have timestamp support, assume
+                    // distribution version is newer than cached version.
+                    // - This may (will) break the server if there are
+                    // dependencies/compatibility changes or it the package is
+                    // in installed state.
+                    if (localPackage.getState() != PackageState.STARTED) {
+                        pkgRemove(localPackage.getId());
+                        addDistributionPackage(md5);
+                    }
+                } else {
+                    // Package is already in cache
+                    deleteDistributionPackage(md5);
+                }
+            } else {
+                // No package with this Id is in cache
+                addDistributionPackage(md5);
+            }
+        }
+    }
+
     public List&amp;lt;LocalPackage&amp;gt; getPkgList() {
         try {
             return service.getPackages();

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Mathieu Guillaume</dc:creator>
    <dc:date>2012-05-25T22:47:34</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73218">
    <title>nuxeo-diff: NXP-9377: Refactor to use theDocumentXMLExporter servicerecently moved to nuxeo-core-io(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73218</link>
    <description>&lt;pre&gt;Message:
    NXP-9377: Refactor to use the DocumentXMLExporter service recently moved to nuxeo-core-io

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T10:32:02-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/66a1cce1460b23438c4012ded1e70c2d59763174
JIRA: https://jira.nuxeo.com/browse/NXP-9377

Files:
D nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/DocumentXMLExporter.java
D nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/impl/DocumentXMLExporterImpl.java
D nuxeo-diff-core/src/main/resources/OSGI-INF/document-xml-export-service.xml
M nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/DocumentDiffService.java
M nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/impl/DocumentDiffServiceImpl.java
M nuxeo-diff-core/src/main/resources/META-INF/MANIFEST.MF
M nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiff.java
M nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiffNotSameType.java
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayService.java
M nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayServiceDefaultDisplay.java

diff --git a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/DocumentDiffService.java b/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/DocumentDiffService.java
index 98109f3..1e23e45 100644
--- a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/DocumentDiffService.java
+++ b/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/DocumentDiffService.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -23,11 +23,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.ecm.core.api.CoreSession;
 import org.nuxeo.ecm.core.api.DocumentModel;
 import org.nuxeo.ecm.diff.model.DocumentDiff;
-import org.nuxeo.ecm.diff.xmlexport.DocumentXMLExporter;
 
 /**
  * Handles a diff between two documents.
- * 
+ *
  * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
  * &amp;lt; at &amp;gt;since 5.6
  */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,7 +35,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     /**
      * Makes a diff between leftDoc and rightDoc. Returns a DocumentDiff object
      * that wraps the differences, schema by schema and field by field.
-     * 
+     *
      * &amp;lt; at &amp;gt;param session the session
      * &amp;lt; at &amp;gt;param leftDoc the left doc
      * &amp;lt; at &amp;gt;param rightDoc the right doc
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -49,7 +48,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; DocumentDiff diff(CoreSession session, DocumentModel leftDoc,
     /**
      * Makes a diff between leftXML and rightXML. Returns a DocumentDiff object
      * that wraps the differences, schema by schema and field by field.
-     * 
+     *
      * &amp;lt; at &amp;gt;param leftXML the left XML
      * &amp;lt; at &amp;gt;param rightXML the right XML
      * &amp;lt; at &amp;gt;return the document diff
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,21 +57,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; DocumentDiff diff(CoreSession session, DocumentModel leftDoc,
     DocumentDiff diff(String leftXML, String rightXML) throws ClientException;
 
     /**
-     * Gets the document XML exporter service.
-     * 
-     * &amp;lt; at &amp;gt;return the document XML exporter
-     * &amp;lt; at &amp;gt;throws ClientException the client exception
-     */
-    DocumentXMLExporter getDocumentXMLExporter() throws ClientException;
-
-    /**
      * Configures XMLUnit.
      */
     void configureXMLUnit();
 
     /**
      * Configures the diff.
-     * 
+     *
      * &amp;lt; at &amp;gt;param diff the diff
      */
     void configureDiff(Diff diff);
diff --git a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/impl/DocumentDiffServiceImpl.java b/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/impl/DocumentDiffServiceImpl.java
index da5c1d7..bacc827 100644
--- a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/impl/DocumentDiffServiceImpl.java
+++ b/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/service/impl/DocumentDiffServiceImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,10 +29,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.ecm.core.api.ClientException;
 import org.nuxeo.ecm.core.api.CoreSession;
 import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.io.DocumentXMLExporter;
 import org.nuxeo.ecm.diff.model.DocumentDiff;
 import org.nuxeo.ecm.diff.model.impl.DocumentDiffImpl;
 import org.nuxeo.ecm.diff.service.DocumentDiffService;
-import org.nuxeo.ecm.diff.xmlexport.DocumentXMLExporter;
 import org.nuxeo.runtime.api.Framework;
 import org.xml.sax.InputSource;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -92,24 +92,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public DocumentDiff diff(String leftXML, String rightXML)
     /**
      * {&amp;lt; at &amp;gt;inheritDoc}
      */
-    public DocumentXMLExporter getDocumentXMLExporter() throws ClientException {
-
-        DocumentXMLExporter docXMLExporter;
-
-        try {
-            docXMLExporter = Framework.getService(DocumentXMLExporter.class);
-        } catch (Exception e) {
-            throw ClientException.wrap(e);
-        }
-        if (docXMLExporter == null) {
-            throw new ClientException("DocumentXMLExporter service is null.");
-        }
-        return docXMLExporter;
-    }
-
-    /**
-     * {&amp;lt; at &amp;gt;inheritDoc}
-     */
     public void configureXMLUnit() {
 
         XMLUnit.setIgnoreWhitespace(true);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -149,6 +131,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected final void exportXML(CoreSession session, DocumentModel leftDoc,
     }
 
     /**
+     * Gets the document XML exporter service.
+     *
+     * &amp;lt; at &amp;gt;return the document XML exporter
+     * &amp;lt; at &amp;gt;throws ClientException if the document XML exporter service cannot be
+     *             found
+     */
+    protected final DocumentXMLExporter getDocumentXMLExporter()
+            throws ClientException {
+
+        DocumentXMLExporter docXMLExporter;
+
+        try {
+            docXMLExporter = Framework.getService(DocumentXMLExporter.class);
+        } catch (Exception e) {
+            throw ClientException.wrap(e);
+        }
+        if (docXMLExporter == null) {
+            throw new ClientException("DocumentXMLExporter service is null.");
+        }
+        return docXMLExporter;
+    }
+
+    /**
      * Processes the XML diff using the XMLUnit Diff feature.
      *
      * &amp;lt; at &amp;gt;param leftDocXMLInputSource the left doc XML input source
diff --git a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/DocumentXMLExporter.java b/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/DocumentXMLExporter.java
deleted file mode 100644
index 5fad960..0000000
--- a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/DocumentXMLExporter.java
+++ /dev/null
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,67 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-/*
- * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the GNU Lesser General Public License
- * (LGPL) version 2.1 which accompanies this distribution, and is available at
- * http://www.gnu.org/licenses/lgpl.html
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * Contributors:
- *     ataillefer
- */
-package org.nuxeo.ecm.diff.xmlexport;
-
-import java.io.InputStream;
-import java.io.Serializable;
-
-import org.nuxeo.ecm.core.api.ClientException;
-import org.nuxeo.ecm.core.api.CoreSession;
-import org.nuxeo.ecm.core.api.DocumentModel;
-import org.xml.sax.InputSource;
-
-/**
- * Handles XML export of a document.
- * 
- * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
- */
-public interface DocumentXMLExporter extends Serializable {
-
-    /**
-     * Export document XML as an InputStream.
-     * 
-     * &amp;lt; at &amp;gt;param doc the doc
-     * &amp;lt; at &amp;gt;param session the session
-     * &amp;lt; at &amp;gt;return the input stream
-     * &amp;lt; at &amp;gt;throws ClientException the client exception
-     */
-    InputStream exportXML(DocumentModel doc, CoreSession session)
-            throws ClientException;
-
-    /**
-     * Export docupent xml as an InputSource.
-     * 
-     * &amp;lt; at &amp;gt;param doc the doc
-     * &amp;lt; at &amp;gt;param session the session
-     * &amp;lt; at &amp;gt;return the input source
-     * &amp;lt; at &amp;gt;throws ClientException the client exception
-     */
-    InputSource exportXMLAsInputSource(DocumentModel doc, CoreSession session)
-            throws ClientException;
-
-    /**
-     * Export document XML as a byte array.
-     * 
-     * &amp;lt; at &amp;gt;param doc the doc
-     * &amp;lt; at &amp;gt;param session the session
-     * &amp;lt; at &amp;gt;return the byte[]
-     * &amp;lt; at &amp;gt;throws ClientException the client exception
-     */
-    byte[] exportXMLAsByteArray(DocumentModel doc, CoreSession session)
-            throws ClientException;
-
-}
diff --git a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/impl/DocumentXMLExporterImpl.java b/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/impl/DocumentXMLExporterImpl.java
deleted file mode 100644
index 99325e4..0000000
--- a/nuxeo-diff-core/src/main/java/org/nuxeo/ecm/diff/xmlexport/impl/DocumentXMLExporterImpl.java
+++ /dev/null
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,101 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-/*
- * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the GNU Lesser General Public License
- * (LGPL) version 2.1 which accompanies this distribution, and is available at
- * http://www.gnu.org/licenses/lgpl.html
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * Contributors:
- *     ataillefer
- */
-package org.nuxeo.ecm.diff.xmlexport.impl;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-
-import org.nuxeo.ecm.core.api.ClientException;
-import org.nuxeo.ecm.core.api.CoreSession;
-import org.nuxeo.ecm.core.api.DocumentModel;
-import org.nuxeo.ecm.core.io.DocumentPipe;
-import org.nuxeo.ecm.core.io.DocumentReader;
-import org.nuxeo.ecm.core.io.DocumentWriter;
-import org.nuxeo.ecm.core.io.impl.DocumentPipeImpl;
-import org.nuxeo.ecm.core.io.impl.plugins.TypedSingleDocumentReader;
-import org.nuxeo.ecm.core.io.impl.plugins.XMLDocumentWriter;
-import org.nuxeo.ecm.diff.xmlexport.DocumentXMLExporter;
-import org.xml.sax.InputSource;
-
-/**
- * Implementation of DocumentXMLExporter.
- * 
- * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
- */
-public class DocumentXMLExporterImpl implements DocumentXMLExporter {
-
-    private static final long serialVersionUID = 4086449614391137730L;
-
-    /**
-     * {&amp;lt; at &amp;gt;inheritDoc}
-     */
-    public InputStream exportXML(DocumentModel doc, CoreSession session)
-            throws ClientException {
-
-        byte[] xmlExportByteArray = exportXMLAsByteArray(doc, session);
-        return new ByteArrayInputStream(xmlExportByteArray);
-    }
-
-    /**
-     * {&amp;lt; at &amp;gt;inheritDoc}
-     */
-    public InputSource exportXMLAsInputSource(DocumentModel doc,
-            CoreSession session) throws ClientException {
-
-        InputStream xmlExportInputStream = exportXML(doc, session);
-        return new InputSource(xmlExportInputStream);
-    }
-
-    /**
-     * Export XML as byte array.
-     * 
-     * &amp;lt; at &amp;gt;param doc the doc
-     * &amp;lt; at &amp;gt;param session the session
-     * &amp;lt; at &amp;gt;return the byte[]
-     * &amp;lt; at &amp;gt;throws ClientException the client exception
-     */
-    public final byte[] exportXMLAsByteArray(DocumentModel doc,
-            CoreSession session) throws ClientException {
-
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        DocumentWriter documentWriter = new XMLDocumentWriter(outputStream);
-        DocumentReader documentReader = new TypedSingleDocumentReader(session,
-                doc);
-
-        DocumentPipe pipe = new DocumentPipeImpl();
-        pipe.setReader(documentReader);
-        pipe.setWriter(documentWriter);
-
-        try {
-            pipe.run();
-        } catch (Exception e) {
-            throw new ClientException(
-                    "Error while trying to export the document to XML.", e);
-        } finally {
-            if (documentReader != null) {
-                documentReader.close();
-            }
-            if (documentWriter != null) {
-                documentWriter.close();
-            }
-        }
-
-        return outputStream.toByteArray();
-    }
-
-}
diff --git a/nuxeo-diff-core/src/main/resources/META-INF/MANIFEST.MF b/nuxeo-diff-core/src/main/resources/META-INF/MANIFEST.MF
index 348b63c..63086b5 100644
--- a/nuxeo-diff-core/src/main/resources/META-INF/MANIFEST.MF
+++ b/nuxeo-diff-core/src/main/resources/META-INF/MANIFEST.MF
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -7,5 +7,4 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Bundle-Vendor: Nuxeo
 Bundle-Version: 5.6
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.nuxeo.diff.core;singleton:=true
-Nuxeo-Component: OSGI-INF/document-xml-export-service.xml,
- OSGI-INF/document-diff-service.xml
+Nuxeo-Component: OSGI-INF/document-diff-service.xml
diff --git a/nuxeo-diff-core/src/main/resources/OSGI-INF/document-xml-export-service.xml b/nuxeo-diff-core/src/main/resources/OSGI-INF/document-xml-export-service.xml
deleted file mode 100644
index 750c9ca..0000000
--- a/nuxeo-diff-core/src/main/resources/OSGI-INF/document-xml-export-service.xml
+++ /dev/null
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,18 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-&amp;lt;?xml version="1.0"?&amp;gt;
-&amp;lt;component name="org.nuxeo.ecm.diff.xmlexport.DocumentXMLExporter"&amp;gt;
-
-  &amp;lt;documentation&amp;gt;
-    This service allows to export a document to XML.
-
-    &amp;lt; at &amp;gt;author
-    Antoine Taillefer
-  &amp;lt;/documentation&amp;gt;
-
-  &amp;lt;implementation
-    class="org.nuxeo.ecm.diff.xmlexport.impl.DocumentXMLExporterImpl" /&amp;gt;
-
-  &amp;lt;service&amp;gt;
-    &amp;lt;provide interface="org.nuxeo.ecm.diff.xmlexport.DocumentXMLExporter" /&amp;gt;
-  &amp;lt;/service&amp;gt;
-
-&amp;lt;/component&amp;gt;
diff --git a/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiff.java b/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiff.java
index df279c6..1982005 100644
--- a/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiff.java
+++ b/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiff.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,6 +29,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.ecm.core.api.CoreSession;
 import org.nuxeo.ecm.core.api.DocumentModel;
 import org.nuxeo.ecm.core.api.PathRef;
+import org.nuxeo.ecm.core.io.DocumentXMLExporter;
 import org.nuxeo.ecm.core.test.CoreFeature;
 import org.nuxeo.ecm.core.test.annotations.Granularity;
 import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -40,7 +41,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.ecm.diff.model.impl.ListPropertyDiff;
 import org.nuxeo.ecm.diff.model.impl.SimplePropertyDiff;
 import org.nuxeo.ecm.diff.test.DocumentDiffRepositoryInit;
-import org.nuxeo.ecm.diff.xmlexport.DocumentXMLExporter;
 import org.nuxeo.runtime.test.runner.Deploy;
 import org.nuxeo.runtime.test.runner.Features;
 import org.nuxeo.runtime.test.runner.FeaturesRunner;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,7 +58,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 &amp;lt; at &amp;gt;RunWith(FeaturesRunner.class)
 &amp;lt; at &amp;gt;Features(CoreFeature.class)
 &amp;lt; at &amp;gt;RepositoryConfig(repositoryName = "default", init = DocumentDiffRepositoryInit.class, user = "Administrator", cleanup = Granularity.METHOD)
-&amp;lt; at &amp;gt;Deploy({ "org.nuxeo.diff.core", "org.nuxeo.diff.test" })
+&amp;lt; at &amp;gt;Deploy({ "org.nuxeo.ecm.core.io:OSGI-INF/document-xml-exporter-service.xml",
+        "org.nuxeo.diff.core", "org.nuxeo.diff.test" })
 public class TestDocumentDiff extends DiffTestCase {
 
     &amp;lt; at &amp;gt;Inject
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -67,6 +68,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt; at &amp;gt;Inject
     protected DocumentDiffService docDiffService;
 
+    &amp;lt; at &amp;gt;Inject
+    protected DocumentXMLExporter docXMLExporter;
+
     /**
      * Tests doc diff.
      *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -566,7 +570,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testInverseDocDiff() throws ClientException {
     protected final void createXMLExportTempFile(DocumentModel doc)
             throws ClientException {
 
-        DocumentXMLExporter docXMLExporter = docDiffService.getDocumentXMLExporter();
         byte[] xmlExportByteArray = docXMLExporter.exportXMLAsByteArray(doc,
                 session);
 
diff --git a/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiffNotSameType.java b/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiffNotSameType.java
index 50bbf5a..11e4f5c 100644
--- a/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiffNotSameType.java
+++ b/nuxeo-diff-core/src/test/java/org/nuxeo/ecm/diff/service/TestDocumentDiffNotSameType.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -51,7 +51,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 &amp;lt; at &amp;gt;RunWith(FeaturesRunner.class)
 &amp;lt; at &amp;gt;Features(CoreFeature.class)
 &amp;lt; at &amp;gt;RepositoryConfig(repositoryName = "default", init = DocumentDiffNotSameTypeRepositoryInit.class, user = "Administrator", cleanup = Granularity.METHOD)
-&amp;lt; at &amp;gt;Deploy({ "org.nuxeo.diff.core", "org.nuxeo.diff.test" })
+&amp;lt; at &amp;gt;Deploy({ "org.nuxeo.ecm.core.io:OSGI-INF/document-xml-exporter-service.xml",
+        "org.nuxeo.diff.core", "org.nuxeo.diff.test" })
 public class TestDocumentDiffNotSameType extends DiffTestCase {
 
     &amp;lt; at &amp;gt;Inject
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayService.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayService.java
index dd98fd5..5e01f21 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayService.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayService.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -62,6 +62,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 &amp;lt; at &amp;gt;Features(CoreFeature.class)
 &amp;lt; at &amp;gt;RepositoryConfig(repositoryName = "default", init = DocumentDiffRepositoryInit.class, user = "Administrator", cleanup = Granularity.METHOD)
 &amp;lt; at &amp;gt;Deploy({
+        "org.nuxeo.ecm.core.io:OSGI-INF/document-xml-exporter-service.xml",
         "org.nuxeo.diff.core",
         "org.nuxeo.diff.test",
         "org.nuxeo.ecm.platform.forms.layout.core:OSGI-INF/layouts-core-framework.xml",
diff --git a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayServiceDefaultDisplay.java b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayServiceDefaultDisplay.java
index 3d0bd1b..b9cf661 100644
--- a/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayServiceDefaultDisplay.java
+++ b/nuxeo-diff-jsf/src/test/java/org/nuxeo/ecm/diff/service/TestDiffDisplayServiceDefaultDisplay.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -51,6 +51,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 &amp;lt; at &amp;gt;RunWith(FeaturesRunner.class)
 &amp;lt; at &amp;gt;Features(CoreFeature.class)
 &amp;lt; at &amp;gt;Deploy({
+        "org.nuxeo.ecm.core.io:OSGI-INF/document-xml-exporter-service.xml",
         "org.nuxeo.diff.core",
         "org.nuxeo.ecm.platform.forms.layout.core:OSGI-INF/layouts-core-framework.xml",
         "org.nuxeo.diff.jsf:OSGI-INF/diff-display-service.xml",

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-25T17:40:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73217">
    <title>nuxeo-diff: NXP-9371: Remove forgotten debug code(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73217</link>
    <description>&lt;pre&gt;Message:
    NXP-9371: Remove forgotten debug code

Repository: nuxeo-diff
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T10:39:23-07:00
URL: https://github.com/nuxeo/nuxeo-diff/commit/666359f04464dcf1b89e5828b4d49dec7428ca85
JIRA: https://jira.nuxeo.com/browse/NXP-9371

Files:
M nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/widgets/list_diff_widget_template.xhtml

diff --git a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/widgets/list_diff_widget_template.xhtml b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/widgets/list_diff_widget_template.xhtml
index 9070410..60649f2 100644
--- a/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/widgets/list_diff_widget_template.xhtml
+++ b/nuxeo-diff-jsf/src/main/resources/web/nuxeo.war/widgets/list_diff_widget_template.xhtml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -21,7 +21,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 &amp;lt;/c:if&amp;gt;
 &amp;lt;c:if test="#{nxl:isLikeViewMode(widget.mode)}"&amp;gt;
 
-  &amp;lt; at &amp;gt;#{widgetProperty_hideSubLabels}&amp;lt; at &amp;gt;
   &amp;lt;c:set var="displaySubLabels" value="#{not widgetProperty_hideSubLabels}" /&amp;gt;
 
   &amp;lt;table class="diffDisplayTable"&amp;gt;

1_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-25T17:40:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73216">
    <title>nuxeo-core: NXP-9373: Add the DocumentXMLExporterservice tonuxeo-core-io (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73216</link>
    <description>&lt;pre&gt;Message:
    NXP-9373: Add the DocumentXMLExporter service to nuxeo-core-io

Repository: nuxeo-core
Branch: master
Author: Antoine Taillefer &amp;lt;ataillefer&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T10:19:52-07:00
URL: https://github.com/nuxeo/nuxeo-core/commit/a50c4d63bf12341b6d49367f4919c125c502305b
JIRA: https://jira.nuxeo.com/browse/NXP-9373

Files:
A nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/DocumentXMLExporter.java
A nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/impl/DocumentXMLExporterImpl.java
A nuxeo-core-io/src/main/resources/OSGI-INF/document-xml-exporter-service.xml
M nuxeo-core-io/src/main/resources/META-INF/MANIFEST.MF

diff --git a/nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/DocumentXMLExporter.java b/nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/DocumentXMLExporter.java
new file mode 100644
index 0000000..99cccb5
--- /dev/null
+++ b/nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/DocumentXMLExporter.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,70 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Antoine Taillefer
+ */
+package org.nuxeo.ecm.core.io;
+
+import java.io.InputStream;
+import java.io.Serializable;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.xml.sax.InputSource;
+
+/**
+ * Handles the XML export of a document.
+ *
+ * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
+ * &amp;lt; at &amp;gt;since 5.6
+ */
+public interface DocumentXMLExporter extends Serializable {
+
+    /**
+     * Exports a document to XML as an {&amp;lt; at &amp;gt;link InputStream}.
+     *
+     * &amp;lt; at &amp;gt;param doc the document
+     * &amp;lt; at &amp;gt;param session the core session
+     * &amp;lt; at &amp;gt;return the input stream
+     * &amp;lt; at &amp;gt;throws ClientException if an error occurs while exporting the document
+     *             to XML
+     */
+    InputStream exportXML(DocumentModel doc, CoreSession session)
+            throws ClientException;
+
+    /**
+     * Exports a document to XML as an {&amp;lt; at &amp;gt;link InputSource}.
+     *
+     * &amp;lt; at &amp;gt;param doc the document
+     * &amp;lt; at &amp;gt;param session the core session
+     * &amp;lt; at &amp;gt;return the input source
+     * &amp;lt; at &amp;gt;throws ClientException if an error occurs while exporting the document
+     *             to XML
+     */
+    InputSource exportXMLAsInputSource(DocumentModel doc, CoreSession session)
+            throws ClientException;
+
+    /**
+     * Exports a document to XML as a byte array.
+     *
+     * &amp;lt; at &amp;gt;param doc the document
+     * &amp;lt; at &amp;gt;param session the core session
+     * &amp;lt; at &amp;gt;return the byte array
+     * &amp;lt; at &amp;gt;throws ClientException if an error occurs while exporting the document
+     *             to XML
+     */
+    byte[] exportXMLAsByteArray(DocumentModel doc, CoreSession session)
+            throws ClientException;
+}
diff --git a/nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/impl/DocumentXMLExporterImpl.java b/nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/impl/DocumentXMLExporterImpl.java
new file mode 100644
index 0000000..7b61022
--- /dev/null
+++ b/nuxeo-core-io/src/main/java/org/nuxeo/ecm/core/io/impl/DocumentXMLExporterImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,95 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Antoine Taillefer
+ */
+package org.nuxeo.ecm.core.io.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.io.DocumentPipe;
+import org.nuxeo.ecm.core.io.DocumentReader;
+import org.nuxeo.ecm.core.io.DocumentWriter;
+import org.nuxeo.ecm.core.io.DocumentXMLExporter;
+import org.nuxeo.ecm.core.io.impl.plugins.TypedSingleDocumentReader;
+import org.nuxeo.ecm.core.io.impl.plugins.XMLDocumentWriter;
+import org.xml.sax.InputSource;
+
+/**
+ * Default implementation of a {&amp;lt; at &amp;gt;link DocumentXMLExporter}.
+ *
+ * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:ataillefer&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Antoine Taillefer&amp;lt;/a&amp;gt;
+ * &amp;lt; at &amp;gt;since 5.6
+ */
+public class DocumentXMLExporterImpl implements DocumentXMLExporter {
+
+    private static final long serialVersionUID = 4086449614391137730L;
+
+    /**
+     * {&amp;lt; at &amp;gt;inheritDoc}
+     */
+    public InputStream exportXML(DocumentModel doc, CoreSession session)
+            throws ClientException {
+
+        byte[] xmlExportByteArray = exportXMLAsByteArray(doc, session);
+        return new ByteArrayInputStream(xmlExportByteArray);
+    }
+
+    /**
+     * {&amp;lt; at &amp;gt;inheritDoc}
+     */
+    public InputSource exportXMLAsInputSource(DocumentModel doc,
+            CoreSession session) throws ClientException {
+
+        InputStream xmlExportInputStream = exportXML(doc, session);
+        return new InputSource(xmlExportInputStream);
+    }
+
+    /**
+     * {&amp;lt; at &amp;gt;inheritDoc}
+     */
+    public final byte[] exportXMLAsByteArray(DocumentModel doc,
+            CoreSession session) throws ClientException {
+
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        DocumentWriter documentWriter = new XMLDocumentWriter(outputStream);
+        DocumentReader documentReader = new TypedSingleDocumentReader(session,
+                doc);
+
+        DocumentPipe pipe = new DocumentPipeImpl();
+        pipe.setReader(documentReader);
+        pipe.setWriter(documentWriter);
+
+        try {
+            pipe.run();
+        } catch (Exception e) {
+            throw new ClientException(
+                    "Error while trying to export the document to XML.", e);
+        } finally {
+            if (documentReader != null) {
+                documentReader.close();
+            }
+            if (documentWriter != null) {
+                documentWriter.close();
+            }
+        }
+
+        return outputStream.toByteArray();
+    }
+}
diff --git a/nuxeo-core-io/src/main/resources/META-INF/MANIFEST.MF b/nuxeo-core-io/src/main/resources/META-INF/MANIFEST.MF
index f91c232..5311d60 100644
--- a/nuxeo-core-io/src/main/resources/META-INF/MANIFEST.MF
+++ b/nuxeo-core-io/src/main/resources/META-INF/MANIFEST.MF
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,3 +28,4 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Import-Package: javax.security.auth.login,
  org.nuxeo.runtime.api,
  org.nuxeo.runtime.services.streaming
 Bundle-SymbolicName: org.nuxeo.ecm.core.io
+Nuxeo-Component: OSGI-INF/document-xml-exporter-service.xml
diff --git a/nuxeo-core-io/src/main/resources/OSGI-INF/document-xml-exporter-service.xml b/nuxeo-core-io/src/main/resources/OSGI-INF/document-xml-exporter-service.xml
new file mode 100644
index 0000000..81d6bdd
--- /dev/null
+++ b/nuxeo-core-io/src/main/resources/OSGI-INF/document-xml-exporter-service.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+&amp;lt;?xml version="1.0"?&amp;gt;
+&amp;lt;component name="org.nuxeo.ecm.core.io.DocumentXMLExporter"&amp;gt;
+
+  &amp;lt;documentation&amp;gt;
+    This service allows to export a document to XML.
+
+    &amp;lt; at &amp;gt;author
+    Antoine Taillefer
+  &amp;lt;/documentation&amp;gt;
+
+  &amp;lt;implementation class="org.nuxeo.ecm.core.io.impl.DocumentXMLExporterImpl" /&amp;gt;
+
+  &amp;lt;service&amp;gt;
+    &amp;lt;provide interface="org.nuxeo.ecm.core.io.DocumentXMLExporter" /&amp;gt;
+  &amp;lt;/service&amp;gt;
+
+&amp;lt;/component&amp;gt;

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Antoine Taillefer</dc:creator>
    <dc:date>2012-05-25T17:20:02</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73215">
    <title>nuxeo-platform-document-routing: NXP-9291: add resumecapability(branch&lt; at &gt;feature-NXP-9289-new-content-routing)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73215</link>
    <description>&lt;pre&gt;Message:
    NXP-9291: add resume capability

Repository: nuxeo-platform-document-routing
Branch: feature-NXP-9289-new-content-routing
Author: Florent Guillaume &amp;lt;fg&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T10:08:26-07:00
URL: https://github.com/nuxeo/nuxeo-platform-document-routing/commit/90a35774c5b202811ce928baab2ca382af8826af
JIRA: https://jira.nuxeo.com/browse/NXP-9291

Files:
M nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRouteElement.java
M nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRoutingService.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/api/DocumentRoutingEngineService.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/AbstractRunner.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRouteElementImpl.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingEngineServiceImpl.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingServiceImpl.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/ElementRunner.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNode.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNodeImpl.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphRunner.java
M nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/StepElementRunner.java
M nuxeo-platform-document-routing-core/src/test/java/org/nuxeo/ecm/platform/routing/test/GraphRouteTest.java

diff --git a/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRouteElement.java b/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRouteElement.java
index 522dc74..4dd501c 100644
--- a/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRouteElement.java
+++ b/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRouteElement.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -17,6 +17,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 package org.nuxeo.ecm.platform.routing.api;
 
 import java.io.Serializable;
+import java.util.Map;
 
 import org.nuxeo.ecm.core.api.ClientException;
 import org.nuxeo.ecm.core.api.CoreSession;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -118,11 +119,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * this is a containter it will run its children.
      *
      * &amp;lt; at &amp;gt;param session
-     * &amp;lt; at &amp;gt;return true is the element is not done
      */
     void run(CoreSession session);
 
     /**
+     * Resumes execution on a route node.
+     *
+     * &amp;lt; at &amp;gt;param session the session
+     * &amp;lt; at &amp;gt;param nodeId the node id to resume on
+     * &amp;lt; at &amp;gt;param data the data coming from UI form
+     * &amp;lt; at &amp;gt;since 5.6
+     */
+    void resume(CoreSession session, String nodeId, Map&amp;lt;String, Object&amp;gt; data);
+
+    /**
      * Set this element to the validate state and put it in read only mode.
      *
      * &amp;lt; at &amp;gt;param session
diff --git a/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRoutingService.java b/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRoutingService.java
index 5fa7f2a..f6b8b92 100644
--- a/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRoutingService.java
+++ b/nuxeo-platform-document-routing-api/src/main/java/org/nuxeo/ecm/platform/routing/api/DocumentRoutingService.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -18,6 +18,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 package org.nuxeo.ecm.platform.routing.api;
 
 import java.util.List;
+import java.util.Map;
 
 import org.nuxeo.ecm.core.api.ClientException;
 import org.nuxeo.ecm.core.api.CoreSession;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -68,6 +69,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; DocumentRoute createNewInstance(DocumentRoute model, String documentId,
             CoreSession session);
 
     /**
+     * Resumes a route instance.
+     * &amp;lt;p&amp;gt;
+     * Called by the UI action corresponding to a task button.
+     *
+     * &amp;lt; at &amp;gt;param routeRef the reference to the route instance document
+     * &amp;lt; at &amp;gt;param session the session
+     * &amp;lt; at &amp;gt;param nodeId the node id to resume on
+     * &amp;lt; at &amp;gt;param data the data coming from UI form
+     * &amp;lt; at &amp;gt;since 5.6
+     */
+    void resumeInstance(DocumentRef routeRef, CoreSession session,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data);
+
+    /**
      * Save a route instance as a new model of route.
      *
      * The place in which the new instance is persisted and its name depends on
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/api/DocumentRoutingEngineService.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/api/DocumentRoutingEngineService.java
index c135a3d..41127dd 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/api/DocumentRoutingEngineService.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/api/DocumentRoutingEngineService.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /*
- * (C) Copyright 2009 Nuxeo SA (http://nuxeo.com/) and contributors.
+ * (C) Copyright 2009-2012 Nuxeo SA (http://nuxeo.com/) and contributors.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the GNU Lesser General Public License
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,10 +12,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     arussel
+ *     Alexandre Russel
+ *     Florent Guillaume
  */
 package org.nuxeo.ecm.platform.routing.core.api;
 
+import java.util.Map;
+
 import org.nuxeo.ecm.core.api.CoreSession;
 import org.nuxeo.ecm.platform.routing.api.DocumentRoute;
 import org.nuxeo.ecm.platform.routing.api.DocumentRoutingService;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -24,18 +27,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * The DocumentRoutingEngineService is responsible for managing the lifecycle of
  * the DocumentRoute. This is an internal service, you should use method on the
  * {&amp;lt; at &amp;gt;link DocumentRoutingService} to start a route.
- *
- * &amp;lt; at &amp;gt;author arussel
- *
  */
 public interface DocumentRoutingEngineService {
 
     /**
-     * Start or resume a the route.
+     * Starts a route.
      *
-     * &amp;lt; at &amp;gt;param routeInstance
-     * &amp;lt; at &amp;gt;param session
+     * &amp;lt; at &amp;gt;param routeInstance the route instance
+     * &amp;lt; at &amp;gt;param session the session
      */
     void start(DocumentRoute routeInstance, CoreSession session);
 
+    /**
+     * Resumes a route.
+     *
+     * &amp;lt; at &amp;gt;param routeInstance the route instance
+     * &amp;lt; at &amp;gt;param session the session
+     * &amp;lt; at &amp;gt;param nodeId the node id to resume on
+     * &amp;lt; at &amp;gt;param data the data coming from UI form
+     * &amp;lt; at &amp;gt;since 5.6
+     */
+    void resume(DocumentRoute routeInstance, CoreSession session,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data);
+
 }
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/AbstractRunner.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/AbstractRunner.java
index 79868fb..f87480b 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/AbstractRunner.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/AbstractRunner.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /*
- * (C) Copyright 2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ * (C) Copyright 2010-2012 Nuxeo SA (http://nuxeo.com/) and contributors.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the GNU Lesser General Public License
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,12 +12,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     Nuxeo - initial API and implementation
+ *     Alexandre Russel
+ *     Florent Guillaume
  */
 package org.nuxeo.ecm.platform.routing.core.impl;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.nuxeo.ecm.core.api.ClientException;
 import org.nuxeo.ecm.core.api.ClientRuntimeException;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -26,10 +28,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.nuxeo.ecm.core.api.DocumentModelList;
 import org.nuxeo.ecm.platform.routing.api.DocumentRouteElement;
 
-/**
- * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:arussel&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Alexandre Russel&amp;lt;/a&amp;gt;
- *
- */
 public abstract class AbstractRunner implements ElementRunner {
 
     protected List&amp;lt;DocumentRouteElement&amp;gt; getChildrenElement(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -47,6 +45,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
     &amp;lt; at &amp;gt;Override
+    public void resume(CoreSession session, DocumentRouteElement element,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data) {
+        throw new UnsupportedOperationException();
+    }
+
+    &amp;lt; at &amp;gt;Override
     public void undo(CoreSession session, DocumentRouteElement element) {
         throw new UnsupportedOperationException();
     }
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRouteElementImpl.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRouteElementImpl.java
index 854f480..967b364 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRouteElementImpl.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRouteElementImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -18,6 +18,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.nuxeo.ecm.core.api.ClientException;
 import org.nuxeo.ecm.core.api.ClientRuntimeException;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,6 +78,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void run(CoreSession session) {
     }
 
     &amp;lt; at &amp;gt;Override
+    public void resume(CoreSession session, String nodeId,
+            Map&amp;lt;String, Object&amp;gt; data) {
+        runner.resume(session, this, nodeId, data);
+    }
+
+    &amp;lt; at &amp;gt;Override
     public DocumentRoute getDocumentRoute(CoreSession session) {
         DocumentModel parent = document;
         while (true) {
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingEngineServiceImpl.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingEngineServiceImpl.java
index 2f4912b..a0fd78f 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingEngineServiceImpl.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingEngineServiceImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /*
- * (C) Copyright 2009 Nuxeo SA (http://nuxeo.com/) and contributors.
+ * (C) Copyright 2009-2012 Nuxeo SA (http://nuxeo.com/) and contributors.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the GNU Lesser General Public License
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,19 +12,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     arussel
+ *     Alexandre Russel
+ *     Florent Guillaume
  */
 package org.nuxeo.ecm.platform.routing.core.impl;
 
+import java.util.Map;
+
 import org.nuxeo.ecm.core.api.CoreSession;
 import org.nuxeo.ecm.platform.routing.api.DocumentRoute;
 import org.nuxeo.ecm.platform.routing.core.api.DocumentRoutingEngineService;
 import org.nuxeo.runtime.model.DefaultComponent;
 
-/**
- * &amp;lt; at &amp;gt;author arussel
- *
- */
 public class DocumentRoutingEngineServiceImpl extends DefaultComponent
         implements DocumentRoutingEngineService {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,4 +31,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     public void start(DocumentRoute routeInstance, CoreSession session) {
         routeInstance.run(session);
     }
+
+    &amp;lt; at &amp;gt;Override
+    public void resume(DocumentRoute routeInstance, CoreSession session,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data) {
+        routeInstance.resume(session, nodeId, data);
+    }
+
 }
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingServiceImpl.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingServiceImpl.java
index 89686ae..eafe1ef 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingServiceImpl.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/DocumentRoutingServiceImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -138,6 +138,41 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public DocumentRoute createNewInstance(DocumentRoute model,
     }
 
     &amp;lt; at &amp;gt;Override
+    public void resumeInstance(DocumentRef routeRef, CoreSession session,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data) {
+        try {
+            new ResumeRouteInstanceRunner(routeRef, session, nodeId, data).runUnrestricted();
+        } catch (ClientException e) {
+            throw new ClientRuntimeException(e);
+        }
+    }
+
+    public static class ResumeRouteInstanceRunner extends UnrestrictedSessionRunner {
+
+        protected DocumentRef routeRef;
+
+        protected String nodeId;
+
+        protected Map&amp;lt;String, Object&amp;gt; data;
+
+        public ResumeRouteInstanceRunner(DocumentRef routeRef,
+                CoreSession session, String nodeId, Map&amp;lt;String, Object&amp;gt; data) {
+            super(session);
+            this.routeRef = routeRef;
+            this.nodeId = nodeId;
+            this.data = data;
+        }
+
+        &amp;lt; at &amp;gt;Override
+        public void run() throws ClientException {
+            DocumentRoutingEngineService engineService = Framework.getLocalService(DocumentRoutingEngineService.class);
+            DocumentModel routeDoc = session.getDocument(routeRef);
+            DocumentRoute routeInstance = routeDoc.getAdapter(DocumentRoute.class);
+            engineService.resume(routeInstance, session, nodeId, data);
+        }
+    }
+
+    &amp;lt; at &amp;gt;Override
     public List&amp;lt;DocumentRoute&amp;gt; getAvailableDocumentRouteModel(
             CoreSession session) {
         DocumentModelList list = null;
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/ElementRunner.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/ElementRunner.java
index 07cc3ea..03116fc 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/ElementRunner.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/ElementRunner.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,5 +1,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /*
- * (C) Copyright 2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ * (C) Copyright 2010-2012 Nuxeo SA (http://nuxeo.com/) and contributors.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the GNU Lesser General Public License
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,21 +12,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Lesser General Public License for more details.
  *
  * Contributors:
- *     Nuxeo - initial API and implementation
+ *     Alexandre Russel
+ *     Florent Guillaume
  */
 package org.nuxeo.ecm.platform.routing.core.impl;
 
+import java.util.Map;
+
 import org.nuxeo.ecm.core.api.CoreSession;
 import org.nuxeo.ecm.platform.routing.api.DocumentRoute;
 import org.nuxeo.ecm.platform.routing.api.DocumentRouteElement;
 
 /**
  * Runner responsible to run or undo an element of a route.
- *
- * &amp;lt; at &amp;gt;author &amp;lt;a href="mailto:arussel&amp;lt; at &amp;gt;nuxeo.com"&amp;gt;Alexandre Russel&amp;lt;/a&amp;gt;
- *
  */
 public interface ElementRunner {
+
     /**
      * Run this element. If an exception is thrown while doing, it cancels the
      * route.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,6 +35,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     void run(CoreSession session, DocumentRouteElement element);
 
     /**
+     * Resumes this graph route on a given node.
+     *
+     * &amp;lt; at &amp;gt;since 5.6
+     */
+    void resume(CoreSession session, DocumentRouteElement element,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data);
+
+    /**
      * Run the undo chain on this element. If this element is not a step, then
      * throw an exception.
      */
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNode.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNode.java
index dd6b8d7..e6641b1 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNode.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNode.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -17,6 +17,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 package org.nuxeo.ecm.platform.routing.core.impl;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.nuxeo.ecm.core.api.ClientException;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -219,6 +220,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public String toString() {
 
     /**
      * Gets the canceled count for this node.
+     *
      * &amp;lt; at &amp;gt;return
      */
     long getCanceledCount();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -291,4 +293,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void executeTransitionChain(Transition transition)
      */
     List&amp;lt;Transition&amp;gt; evaluateTransitions() throws DocumentRouteException;
 
+    /**
+     * Sets the graph and node variables.
+     *
+     * &amp;lt; at &amp;gt;param map the map of variables
+     */
+    void setAllVariables(Map&amp;lt;String, Object&amp;gt; map);
+
 }
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNodeImpl.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNodeImpl.java
index 9f59fd7..2c6db87 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNodeImpl.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphNodeImpl.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -235,15 +235,48 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected void setVariables(Map&amp;lt;String, Serializable&amp;gt; map) {
         }
     }
 
-    protected OperationContext getContext(
-            Map&amp;lt;String, Serializable&amp;gt; graphVariables,
-            Map&amp;lt;String, Serializable&amp;gt; nodeVariables) {
+    &amp;lt; at &amp;gt;Override
+    public void setAllVariables(Map&amp;lt;String, Object&amp;gt; map) {
+
+        // get variables from node and graph
+        Map&amp;lt;String, Serializable&amp;gt; graphVariables = graph.getVariables();
+        Map&amp;lt;String, Serializable&amp;gt; nodeVariables = getVariables();
+
+        // set variables back into node and graph
+        boolean changedNodeVariables = false;
+        boolean changedGraphVariables = false;
+        for (Entry&amp;lt;String, Object&amp;gt; es : map.entrySet()) {
+            String key = es.getKey();
+            Serializable value = (Serializable) es.getValue();
+            if (nodeVariables.containsKey(key)) {
+                Serializable oldValue = nodeVariables.get(key);
+                if (!ObjectUtils.equals(value, oldValue)) {
+                    changedNodeVariables = true;
+                    nodeVariables.put(key, value);
+                }
+            } else if (graphVariables.containsKey(key)) {
+                Serializable oldValue = graphVariables.get(key);
+                if (!ObjectUtils.equals(value, oldValue)) {
+                    changedGraphVariables = true;
+                    graphVariables.put(key, value);
+                }
+            }
+        }
+        if (changedNodeVariables) {
+            setVariables(nodeVariables);
+        }
+        if (changedGraphVariables) {
+            graph.setVariables(graphVariables);
+        }
+    }
+
+    protected OperationContext getContext() {
         OperationContext context = new OperationContext(getSession());
         context.setCommit(false); // no session save at end
         // context.put(DocumentRoutingConstants.OPERATION_STEP_DOCUMENT_KEY,
         // element);
-        context.putAll(graphVariables);
-        context.putAll(nodeVariables);
+        context.putAll(graph.getVariables());
+        context.putAll(getVariables());
         // workflow context
         // context.put("workflowId", graph.get);
         context.put("initiator", "");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -280,10 +313,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void executeChain(String chainId, String transitionId)
             return;
         }
 
-        // get variables from node and graph
-        Map&amp;lt;String, Serializable&amp;gt; graphVariables = graph.getVariables();
-        Map&amp;lt;String, Serializable&amp;gt; nodeVariables = getVariables();
-        OperationContext context = getContext(graphVariables, nodeVariables);
+        // get base context
+        OperationContext context = getContext();
         if (transitionId != null) {
             context.put("transition", transitionId);
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -302,32 +333,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void executeChain(String chainId, String transitionId)
                     e);
         }
 
-        // set variables back into node and graph
-        boolean changedNodeVariables = false;
-        boolean changedGraphVariables = false;
-        for (Entry&amp;lt;String, Object&amp;gt; es : context.entrySet()) {
-            String key = es.getKey();
-            Serializable value = (Serializable) es.getValue();
-            if (nodeVariables.containsKey(key)) {
-                Serializable oldValue = nodeVariables.get(key);
-                if (!ObjectUtils.equals(value, oldValue)) {
-                    changedNodeVariables = true;
-                    nodeVariables.put(key, value);
-                }
-            } else if (graphVariables.containsKey(key)) {
-                Serializable oldValue = graphVariables.get(key);
-                if (!ObjectUtils.equals(value, oldValue)) {
-                    changedGraphVariables = true;
-                    graphVariables.put(key, value);
-                }
-            }
-        }
-        if (changedNodeVariables) {
-            setVariables(nodeVariables);
-        }
-        if (changedGraphVariables) {
-            graph.setVariables(graphVariables);
-        }
+        setAllVariables(context);
     }
 
     &amp;lt; at &amp;gt;Override
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -361,8 +367,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void initAddInputTransition(Transition transition) {
     public List&amp;lt;Transition&amp;gt; evaluateTransitions() throws DocumentRouteException {
         try {
             List&amp;lt;Transition&amp;gt; trueTrans = new ArrayList&amp;lt;Transition&amp;gt;();
-            OperationContext context = getContext(graph.getVariables(),
-                    getVariables());
+            OperationContext context = getContext();
             for (Transition t : getOutputTransitions()) {
                 context.put("transition", t.id);
                 Expression expr = Scripting.newExpression(t.condition);
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphRunner.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphRunner.java
index 4d14de3..63ee334 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphRunner.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/GraphRunner.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,6 +19,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.logging.Log;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -48,31 +49,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt; at &amp;gt;Override
     public void run(CoreSession session, DocumentRouteElement element) {
         try {
-            startGraph(session, element);
+            GraphRoute graph = (GraphRoute) element;
+            element.setRunning(session);
+            boolean done = runGraph(graph, graph.getStartNode());
+            if (done) {
+                element.setDone(session);
+            }
+            session.save();
         } catch (ClientException e) {
             throw new ClientRuntimeException(e);
         }
     }
 
-    protected void startGraph(CoreSession session, DocumentRouteElement element)
-            throws ClientException {
-        element.setRunning(session);
-        GraphRoute graph = (GraphRoute) element;
-        boolean done = runGraph(graph, graph.getStartNode());
-        if (done) {
-            element.setDone(session);
-        }
-        session.save();
-    }
-
-    public void resumeGraph(CoreSession session, GraphRoute graph,
-            GraphNode node, Object data) throws ClientException {
-        // TODO data
-        boolean done = runGraph(graph, node);
-        if (done) {
-            ((DocumentRouteElement) graph).setDone(session);
+    &amp;lt; at &amp;gt;Override
+    public void resume(CoreSession session, DocumentRouteElement element,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data) {
+        try {
+            GraphRoute graph = (GraphRoute) element;
+            GraphNode node = graph.getNode(nodeId);
+            if (node.getState() != State.SUSPENDED) {
+                throw new DocumentRouteException(
+                        "Cannot resume on non-suspended node: " + node);
+            }
+            node.setAllVariables(data);
+            boolean done = runGraph(graph, node);
+            if (done) {
+                element.setDone(session);
+            }
+            session.save();
+        } catch (ClientException e) {
+            throw new ClientRuntimeException(e);
         }
-        session.save();
     }
 
     /**
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -124,8 +131,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean runGraph(GraphRoute graph, GraphNode initialNode)
                 }
                 break;
             case SUSPENDED:
-                // TODO set the variables from the task form (this node is the
-                // one through which the workflow was resumed),
+                if (node != initialNode) {
+                    throw new DocumentRouteException(
+                            "Executing unexpected SUSPENDED state");
+                }
+                // resuming, variables have been set by resumeGraph
                 jump = State.RUNNING_OUTPUT;
                 break;
             case RUNNING_OUTPUT:
diff --git a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/StepElementRunner.java b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/StepElementRunner.java
index 84b7f6d..a731c7b 100644
--- a/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/StepElementRunner.java
+++ b/nuxeo-platform-document-routing-core/src/main/java/org/nuxeo/ecm/platform/routing/core/impl/StepElementRunner.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,6 +16,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 package org.nuxeo.ecm.platform.routing.core.impl;
 
+import java.util.Map;
+
 import org.nuxeo.ecm.automation.AutomationService;
 import org.nuxeo.ecm.automation.InvalidChainException;
 import org.nuxeo.ecm.automation.OperationContext;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -65,6 +67,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void run(CoreSession session, DocumentRouteElement element) {
         }
     }
 
+    &amp;lt; at &amp;gt;Override
+    public void resume(CoreSession session, DocumentRouteElement element,
+            String nodeId, Map&amp;lt;String, Object&amp;gt; data) {
+        throw new UnsupportedOperationException();
+    }
+
     public AutomationService getAutomationService() {
         try {
             return Framework.getService(AutomationService.class);
diff --git a/nuxeo-platform-document-routing-core/src/test/java/org/nuxeo/ecm/platform/routing/test/GraphRouteTest.java b/nuxeo-platform-document-routing-core/src/test/java/org/nuxeo/ecm/platform/routing/test/GraphRouteTest.java
index d519f67..e76554b 100644
--- a/nuxeo-platform-document-routing-core/src/test/java/org/nuxeo/ecm/platform/routing/test/GraphRouteTest.java
+++ b/nuxeo-platform-document-routing-core/src/test/java/org/nuxeo/ecm/platform/routing/test/GraphRouteTest.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -17,6 +17,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 package org.nuxeo.ecm.platform.routing.test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -267,6 +268,38 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public void testSimpleTransition() throws Exception {
 
     &amp;lt; at &amp;gt;SuppressWarnings("unchecked")
     &amp;lt; at &amp;gt;Test
+    public void testResume() throws Exception {
+        assertEquals("file", doc.getTitle());
+        DocumentModel node1 = createNode(routeDoc, "node1");
+        node1.setPropertyValue(GraphNode.PROP_START, Boolean.TRUE);
+        setTransitions(node1,
+                transition("trans12", "node2", "true", "testchain_title1"));
+        node1 = session.saveDocument(node1);
+
+        DocumentModel node2 = createNode(routeDoc, "node2");
+        node2.setPropertyValue(GraphNode.PROP_HAS_TASK, Boolean.TRUE);
+        setTransitions(node2, transition("trans23", "node3", "true"));
+        node2 = session.saveDocument(node2);
+
+        DocumentModel node3 = createNode(routeDoc, "node3");
+        node3.setPropertyValue(GraphNode.PROP_STOP, Boolean.TRUE);
+        node3 = session.saveDocument(node3);
+
+        DocumentRoute route = instantiateAndRun();
+
+        assertFalse(route.isDone());
+
+        // now resume, as if the task was actually executed
+        Map&amp;lt;String, Object&amp;gt; data = new HashMap&amp;lt;String, Object&amp;gt;();
+        routing.resumeInstance(route.getDocument().getRef(), session, "node2",
+                data);
+
+        route.getDocument().refresh();
+        assertTrue(route.isDone());
+    }
+
+    &amp;lt; at &amp;gt;SuppressWarnings("unchecked")
+    &amp;lt; at &amp;gt;Test
     public void testForkMergeAll() throws Exception {
         DocumentModel node1 = createNode(routeDoc, "node1");
         node1.setPropertyValue(GraphNode.PROP_START, Boolean.TRUE);

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Florent Guillaume</dc:creator>
    <dc:date>2012-05-25T17:08:33</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73214">
    <title>nuxeo-connect: useorg.nuxeo.build:nuxeo-distribution-tools:1.11.1(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73214</link>
    <description>&lt;pre&gt;Message:
    use org.nuxeo.build:nuxeo-distribution-tools:1.11.1

Repository: nuxeo-connect
Branch: master
Author: Julien Carsique &amp;lt;jcarsique&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T09:36:19-07:00
URL: https://github.com/nuxeo/nuxeo-connect/commit/d2fa27fd9cb0510bf3dd64c162b3897ca14a278d

Files:
M pom.xml

diff --git a/pom.xml b/pom.xml
index cd67bca..4cd623b 100644
--- a/pom.xml
+++ b/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -269,7 +269,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         &amp;lt;plugin&amp;gt;
           &amp;lt;groupId&amp;gt;org.nuxeo.build&amp;lt;/groupId&amp;gt;
           &amp;lt;artifactId&amp;gt;nuxeo-distribution-tools&amp;lt;/artifactId&amp;gt;
-          &amp;lt;version&amp;gt;1.11&amp;lt;/version&amp;gt;
+          &amp;lt;version&amp;gt;1.11.1&amp;lt;/version&amp;gt;
           &amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;
         &amp;lt;/plugin&amp;gt;
         &amp;lt;!-- Cannot upgrade after 2.2-beta-1 because of MASSEMBLY-285 --&amp;gt;

rtifac_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Julien Carsique</dc:creator>
    <dc:date>2012-05-25T17:07:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73213">
    <title>nuxeo-social-collaboration: NXP-7732: fixwall_template to correctlyuse nuxeoTargetContextPath(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73213</link>
    <description>&lt;pre&gt;Message:
    NXP-7732: fix wall_template to correctly use nuxeoTargetContextPath

Repository: nuxeo-social-collaboration
Branch: master
Author: Thomas Roger &amp;lt;troger&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Pusher: troger &amp;lt;throger&amp;lt; at &amp;gt;gmail.com&amp;gt;
Date: 2012-05-25T09:41:21-07:00
URL: https://github.com/nuxeo/nuxeo-social-collaboration/commit/77a55a77f2912fc144d62dcf0bb73e6eca0fdfd9
JIRA: https://jira.nuxeo.com/browse/NXP-7732

Files:
M nuxeo-wall/src/main/resources/web/nuxeo.war/incl/wall_template.xhtml

diff --git a/nuxeo-wall/src/main/resources/web/nuxeo.war/incl/wall_template.xhtml b/nuxeo-wall/src/main/resources/web/nuxeo.war/incl/wall_template.xhtml
index b67f52c..9d2eff1 100644
--- a/nuxeo-wall/src/main/resources/web/nuxeo.war/incl/wall_template.xhtml
+++ b/nuxeo-wall/src/main/resources/web/nuxeo.war/incl/wall_template.xhtml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -13,7 +13,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
    -
   &amp;lt;/c:if&amp;gt;
 
-  &amp;lt;nxu:set var="docId" value="#{nxu:test(!empty document, document.id, '')}"&amp;gt;
+  &amp;lt;nxu:set var="docPath" value="#{nxu:test(!empty document, document.pathAsString, '')}"&amp;gt;
 
   &amp;lt;div class="gadget-wall threeQuarterWidth"&amp;gt;&amp;lt;/div&amp;gt;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -25,8 +25,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         { specUrl: '#{gadgetsBaseURL}/site/gadgets/wall/wall.xml',
           title: '',
           userPrefs: {
-            docId: {
-              value: '#{docId}'
+            nuxeoTargetContextPath: {
+              value: '#{docPath}'
             },
             activityStreamName: {
               value: '#{activityStreamName}'

Pgo_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Thomas Roger</dc:creator>
    <dc:date>2012-05-25T16:41:29</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73212">
    <title>nuxeo-social-collaboration: NXP-7732: onlyuse'nuxeoTargetContextPath' preference to define the wallcontext:that's more consistent with other gadgets (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73212</link>
    <description>&lt;pre&gt;Message:
    NXP-7732: only use 'nuxeoTargetContextPath' preference to define the wall context: that's more consistent with other gadgets

Repository: nuxeo-social-collaboration
Branch: master
Author: Thomas Roger &amp;lt;troger&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Pusher: troger &amp;lt;throger&amp;lt; at &amp;gt;gmail.com&amp;gt;
Date: 2012-05-25T09:34:44-07:00
URL: https://github.com/nuxeo/nuxeo-social-collaboration/commit/fcfdc627a1ff7d03485ee10f2ca941d40669f6dd
JIRA: https://jira.nuxeo.com/browse/NXP-7732

Files:
M nuxeo-wall/src/main/java/org/nuxeo/ecm/wall/operations/GetWallActivityStream.java
M nuxeo-wall/src/main/resources/gadget/wall/wall.xml
M nuxeo-wall/src/main/resources/web/nuxeo.war/scripts/opensocial/gadgets/wall.js

diff --git a/nuxeo-wall/src/main/java/org/nuxeo/ecm/wall/operations/GetWallActivityStream.java b/nuxeo-wall/src/main/java/org/nuxeo/ecm/wall/operations/GetWallActivityStream.java
index 8b68285..97dbeea 100644
--- a/nuxeo-wall/src/main/java/org/nuxeo/ecm/wall/operations/GetWallActivityStream.java
+++ b/nuxeo-wall/src/main/java/org/nuxeo/ecm/wall/operations/GetWallActivityStream.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -79,10 +79,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt; at &amp;gt;Param(name = "activityStreamName", required = false)
     protected String activityStreamName;
 
-    &amp;lt; at &amp;gt;Param(name = "document", required = false)
-    protected DocumentModel doc;
-
-    &amp;lt; at &amp;gt;Param(name = "contextPath", required = false)
+    &amp;lt; at &amp;gt;Param(name = "contextPath", required = true)
     protected String contextPath;
 
     &amp;lt; at &amp;gt;Param(name = "language", required = false)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -105,8 +102,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public Blob run() throws Exception {
             targetLimit = limit.longValue();
         }
 
-        if (doc == null &amp;amp;&amp;amp; !StringUtils.isBlank(contextPath)) {
-            doc = session.getDocument(new PathRef(contextPath));
+        DocumentModel doc = session.getDocument(new PathRef(contextPath));
+        if (StringUtils.isBlank(activityStreamName)) {
             // assume we are on a Social workspace
             activityStreamName = "socialWorkspaceWallActivityStream";
         }
diff --git a/nuxeo-wall/src/main/resources/gadget/wall/wall.xml b/nuxeo-wall/src/main/resources/gadget/wall/wall.xml
index 3c9b6f5..4c03031 100644
--- a/nuxeo-wall/src/main/resources/gadget/wall/wall.xml
+++ b/nuxeo-wall/src/main/resources/gadget/wall/wall.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,6 +8,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;#include "default-oauth-prefs.ftl"/&amp;gt;
   &amp;lt;/ModulePrefs&amp;gt;
   &amp;lt;#include "context-prefs.ftl"/&amp;gt;
+  &amp;lt;UserPref name="activityStreamName" datatype="hidden" default_value="" /&amp;gt;
   &amp;lt;Content type="html"&amp;gt;
 
 &amp;lt;![CDATA[
diff --git a/nuxeo-wall/src/main/resources/web/nuxeo.war/scripts/opensocial/gadgets/wall.js b/nuxeo-wall/src/main/resources/web/nuxeo.war/scripts/opensocial/gadgets/wall.js
index cea4faa..53ce51e 100644
--- a/nuxeo-wall/src/main/resources/web/nuxeo.war/scripts/opensocial/gadgets/wall.js
+++ b/nuxeo-wall/src/main/resources/web/nuxeo.war/scripts/opensocial/gadgets/wall.js
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -136,32 +136,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
   var prefs = new gadgets.Prefs();
 
-  var docId = prefs.getString("docId");
   var activityStreamName = prefs.getString("activityStreamName");
   var documentContextPath = gadgets.util.unescapeString(prefs.getString("nuxeoTargetContextPath"));
 
-  var wallOperationParams, miniMessageOperationParams;
-  if (docId !== 'undefined' &amp;amp;&amp;amp; docId.length &amp;gt; 0) {
-    wallOperationParams = {
-      language: prefs.getLang(),
-      document: docId,
-      activityStreamName: activityStreamName
-    };
-    miniMessageOperationParams = {
-      language: prefs.getLang(),
-      document: docId
-    };
-  } else {
-    wallOperationParams = {
-      language: prefs.getLang(),
-      contextPath: documentContextPath,
-      activityStreamName: activityStreamName
-    }
-    miniMessageOperationParams = {
-      language: prefs.getLang(),
-      contextPath: documentContextPath
-    };
-  }
+  var wallOperationParams = {
+    language: prefs.getLang(),
+    contextPath: documentContextPath,
+    activityStreamName: activityStreamName
+  };
+  var  miniMessageOperationParams = {
+    language: prefs.getLang(),
+    contextPath: documentContextPath
+  };
 
   var currentActivities = [];
   var waitingActivities = [];

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Thomas Roger</dc:creator>
    <dc:date>2012-05-25T16:34:55</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73211">
    <title>nuxeo: useorg.nuxeo.build:nuxeo-distribution-tools:1.11.1(branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73211</link>
    <description>&lt;pre&gt;Message:
    use org.nuxeo.build:nuxeo-distribution-tools:1.11.1

Repository: nuxeo
Branch: master
Author: Julien Carsique &amp;lt;jcarsique&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T09:32:32-07:00
URL: https://github.com/nuxeo/nuxeo/commit/e75f8c631fdabfb183db325badaafc08126ffd3a

Files:
M pom.xml

diff --git a/pom.xml b/pom.xml
index c5cc996..a196111 100644
--- a/pom.xml
+++ b/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -111,7 +111,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;nuxeo.features.version&amp;gt;5.6-SNAPSHOT&amp;lt;/nuxeo.features.version&amp;gt;
 
     &amp;lt;nuxeo.connect.client.version&amp;gt;1.4-SNAPSHOT&amp;lt;/nuxeo.connect.client.version&amp;gt;
-    &amp;lt;nuxeo.distribution.tools.version&amp;gt;1.11.1-SNAPSHOT&amp;lt;/nuxeo.distribution.tools.version&amp;gt;
+    &amp;lt;nuxeo.distribution.tools.version&amp;gt;1.11.1&amp;lt;/nuxeo.distribution.tools.version&amp;gt;
     &amp;lt;nuxeo.ftest.version&amp;gt;1.7.1-SNAPSHOT&amp;lt;/nuxeo.ftest.version&amp;gt;
 
     &amp;lt;tomcat.version&amp;gt;6.0.35&amp;lt;/tomcat.version&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3915,13 +3915,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 &amp;lt;banLatest&amp;gt;true&amp;lt;/banLatest&amp;gt;
                 &amp;lt;banRelease&amp;gt;true&amp;lt;/banRelease&amp;gt;
                 &amp;lt;banSnapshots&amp;gt;true&amp;lt;/banSnapshots&amp;gt;
-                &amp;lt;unCheckedPluginList&amp;gt;org.nuxeo.build:nuxeo-distribution-tools&amp;lt;/unCheckedPluginList&amp;gt;
+                &amp;lt;!-- &amp;lt;unCheckedPluginList&amp;gt;org.nuxeo.build:nuxeo-distribution-tools&amp;lt;/unCheckedPluginList&amp;gt; --&amp;gt;
               &amp;lt;/requirePluginVersions&amp;gt;
               &amp;lt;requireReleaseDeps&amp;gt;
                 &amp;lt;message&amp;gt;No Snapshots Allowed!&amp;lt;/message&amp;gt;
                 &amp;lt;onlyWhenRelease&amp;gt;true&amp;lt;/onlyWhenRelease&amp;gt;
                 &amp;lt;excludes&amp;gt;
-                  &amp;lt;exclude&amp;gt;org.nuxeo.build:nuxeo-distribution-tools&amp;lt;/exclude&amp;gt;
+                  &amp;lt;!-- &amp;lt;exclude&amp;gt;org.nuxeo.build:nuxeo-distribution-tools&amp;lt;/exclude&amp;gt; --&amp;gt;
                   &amp;lt;exclude&amp;gt;org.nuxeo:nuxeo-ftest:*:zip&amp;lt;/exclude&amp;gt;
                   &amp;lt;exclude&amp;gt;org.nuxeo.connect:nuxeo-connect-client&amp;lt;/exclude&amp;gt;
                 &amp;lt;/excludes&amp;gt;

Jl
cXVpcmVSZW_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Julien Carsique</dc:creator>
    <dc:date>2012-05-25T16:32:51</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73210">
    <title>nuxeo-distribution: NXP-9268 - no more racecondition on packagedownload (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73210</link>
    <description>&lt;pre&gt;Message:
    NXP-9268 - no more race condition on package download

Repository: nuxeo-distribution
Branch: master
Author: Julien Carsique &amp;lt;jcarsique&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T08:56:49-07:00
URL: https://github.com/nuxeo/nuxeo-distribution/commit/77f57a71fb0699c4e1caaf06224261ce694d965c
JIRA: https://jira.nuxeo.com/browse/NXP-9268

Files:
M nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java

diff --git a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
index 0374ec0..af09a6b 100644
--- a/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
+++ b/nuxeo-launcher/src/main/java/org/nuxeo/launcher/connect/ConnectBroker.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -156,12 +156,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean matchesPlatform(String requestPkgStr,
             List&amp;lt;DownloadablePackage&amp;gt; allPackages,
             Map&amp;lt;String, DownloadablePackage&amp;gt; allPackagesByID,
             Map&amp;lt;String, List&amp;lt;DownloadablePackage&amp;gt;&amp;gt; allPackagesByName)
-                    throws PackageException {
+            throws PackageException {
         // Try ID match first
         if (allPackagesByID.containsKey(requestPkgStr)) {
             return Arrays.asList(
                     allPackagesByID.get(requestPkgStr).getTargetPlatforms()).contains(
-                            targetPlatform);
+                    targetPlatform);
         }
         // Fallback on name match
         List&amp;lt;DownloadablePackage&amp;gt; allPackagesForName = allPackagesByName.get(requestPkgStr);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -421,20 +421,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public LocalPackage pkgAdd(String packageFileName) {
                 }
                 List&amp;lt;String&amp;gt; downloadList = new ArrayList&amp;lt;String&amp;gt;();
                 downloadList.add(pkgId);
-                log.info("Downloading " + packageFileName);
                 if (!downloadPackages(downloadList)) {
                     throw new PackageException("Failed to download package "
                             + pkgId);
                 } else {
-                    // TODO: fix race condition
-                    try {
-                        Thread.sleep(1000);
-                    } catch (InterruptedException e) {
-                        // Ignore
-                    }
                     LocalPackage pkg = service.getPackage(pkgId);
                     if (pkg == null) {
-                        log.info("NULL");
+                        throw new PackageException(
+                                "Failed to find downloaded package in cache "
+                                        + pkgId);
                     }
                     return pkg;
                 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -645,10 +640,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean executePending(File commandsFile, boolean doExecute,
 
     &amp;lt; at &amp;gt;SuppressWarnings("unused")
     protected boolean downloadPackages(List&amp;lt;String&amp;gt; packagesToDownload) {
-        if (packagesToDownload == null) {
+        if (packagesToDownload == null || packagesToDownload.isEmpty()) {
             return true;
         }
         // Queue downloads
+        log.info("Downloading " + packagesToDownload + "...");
         for (String pkg : packagesToDownload) {
             try {
                 getPackageManager().download(pkg);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -678,6 +674,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; protected boolean downloadPackages(List&amp;lt;String&amp;gt; packagesToDownload) {
                         cmdInfo.exitCode = 1;
                         downloadOk = false;
                     } else {
+                        log.debug("Completed " + pkg);
                         cmdInfo.exitCode = 0;
                     }
                 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -758,6 +755,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean pkgRequest(List&amp;lt;String&amp;gt; pkgsToAdd,
                     if (!matchesPlatform(requestPackage, allPackages,
                             allPackagesByID, allPackagesByName)) {
                         requestPlatform = null;
+                        log.warn(String.format(
+                                "Relax restriction to target platform %s because of package %s",
+                                targetPlatform, requestPackage));
                         break;
                     }
                 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -768,7 +768,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean pkgRequest(List&amp;lt;String&amp;gt; pkgsToAdd,
 
             DependencyResolution resolution = getPackageManager().resolveDependencies(
                     solverInstall, solverRemove, solverUpgrade, requestPlatform);
-
             log.info(resolution);
             if (resolution.isFailed()) {
                 return false;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -778,13 +777,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public boolean pkgRequest(List&amp;lt;String&amp;gt; pkgsToAdd,
                 log.error("Aborting packages change request");
                 return false;
             }
-            // TODO: fix race condition
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-                // Ignore
-            }
-
             // Uninstall packages
             List&amp;lt;String&amp;gt; packageIds = resolution.getRemovePackageIds();
             for (String pkgId : packageIds) {

_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Julien Carsique</dc:creator>
    <dc:date>2012-05-25T16:05:21</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73209">
    <title>nuxeo-distribution: add debug script for theLauncher (branch&lt; at &gt;master)</title>
    <link>http://comments.gmane.org/gmane.comp.cms.nuxeo.scm/73209</link>
    <description>&lt;pre&gt;Message:
    add debug script for the Launcher

Repository: nuxeo-distribution
Branch: master
Author: Julien Carsique &amp;lt;jcarsique&amp;lt; at &amp;gt;nuxeo.com&amp;gt;
Date: 2012-05-25T07:52:35-07:00
URL: https://github.com/nuxeo/nuxeo-distribution/commit/340ff9e9688bdcc482ed854f588807d1a90670e7

Files:
A nuxeo-launcher/testDebug.sh
M nuxeo-distribution-resources/src/main/resources/bin/nuxeoctl

diff --git a/nuxeo-distribution-resources/src/main/resources/bin/nuxeoctl b/nuxeo-distribution-resources/src/main/resources/bin/nuxeoctl
index 2026baf..3dd669d 100755
--- a/nuxeo-distribution-resources/src/main/resources/bin/nuxeoctl
+++ b/nuxeo-distribution-resources/src/main/resources/bin/nuxeoctl
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,6 +1,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #!/bin/bash
 ##
-## (C) Copyright 2010-2011 Nuxeo SAS (http://nuxeo.com/) and contributors.
+## (C) Copyright 2010-2012 Nuxeo SA (http://nuxeo.com/) and contributors.
 ##
 ## All rights reserved. This program and the accompanying materials
 ## are made available under the terms of the GNU Lesser General Public License
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -15,6 +15,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 ## Contributors:
 ##     Julien Carsique
 ##     Florent Guillaume
+##     Mathieu Guillaume
 ##
 ## Shell script calling a multi-OS Nuxeo Java launcher.
 ## Using explicitely bash to avoid dash which is not POSIX.
diff --git a/nuxeo-launcher/testDebug.sh b/nuxeo-launcher/testDebug.sh
new file mode 100755
index 0000000..21ecd38
--- /dev/null
+++ b/nuxeo-launcher/testDebug.sh
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+#!/bin/bash
+##
+## (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors.
+##
+## All rights reserved. This program and the accompanying materials
+## are made available under the terms of the GNU Lesser General Public License
+## (LGPL) version 2.1 which accompanies this distribution, and is available at
+## http://www.gnu.org/licenses/lgpl.html
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## Contributors:
+##     Julien Carsique
+##
+## Script for Launcher debugging purpose: calls nuxeoctl with LAUNCHER_DEBUG option
+## For debugging Nuxeo (not the Nuxeo Launcher), use nuxeoctl's "-d" option
+##
+
+: ${PWD:=$(cd "$(dirname "$0")"/..; pwd -P)}
+export LAUNCHER_DEBUG="-Xdebug -Xrunjdwp:transport=dt_socket,address=8788,server=y,suspend=y"
+./test.sh $&amp;lt; at &amp;gt;

yMjIG_______________________________________________
ECM-checkins mailing list
ECM-checkins-FQDHc1wsLCVb90+sfpvX0g&amp;lt; at &amp;gt;public.gmane.org
http://lists.nuxeo.com/mailman/listinfo/ecm-checkins
&lt;/pre&gt;</description>
    <dc:creator>Julien Carsique</dc:creator>
    <dc:date>2012-05-25T16:05:21</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.cms.nuxeo.scm">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.cms.nuxeo.scm</link>
  </textinput>
</rdf:RDF>

