Les versions
Lors de la création d'une version d'un document, une copie du réseau d'items le composant est effectuée. Néanmoins, les références entre items doivent être modifiées pour pointer les versions des items liés et non pas les live documents. Une table de correspondance de liens, définie sur chaque item, est utilisée à cette fin : le flux binaire de l'item versionné conserve la référence vers le live document mais lors de la résolution du lien, la table est interrogée pour établir la correspondance avec l'item versionné.
Nuxeo voit la création d'une version d'un document comme une opération atomique : il est impossible de modifier une version après l'établissement de son identifiant et avant sa création effective et sa mise en lecture seule. Nous ne pouvons donc établir la table de correspondance avec les identifiants systèmes des versions référencées. Nous utilisons un identifiant annexe, spécifique aux versions, impliquant un cas particulier dans la résolution des références.
Réutilisation des réseaux versionnés
Si un réseau n'a pas été modifié depuis la dernière version créé, celle-ci est réutilisée lors de la création d'une nouvelle version l'impliquant (exception faite de l'item portant la version). Il s'agit d'une optimisation importante : dans un document d'une centaine d'items ou plus, les modifications d'une version sur l'autre sont généralement localisées. Sa mise en place implique par contre de répercuter le status dirty d'un item à l'ensemble des sous-réseaux l'utilisant.
Étapes de la construction d'une version
La création d'une version se décompose ainsi :
Établir la liste des items à versionner en parcourant le réseau du document
Générer un identifiant pour chaque future version, ou récupérer celui de la dernière version s'il n'y a pas eu de modification sur le live document depuis celle-ci (en prenant en compte les modifications sur la descendance)
Pour chaque item nécessitant la création d'une version :
Sauvegarder le tableau de correspondance du live document,
Établir le tableau de correspondance des liens avec les identifiants de version,
Affecter ce tableau au live document,
Créer la version,
Rétablir les propriétés du live document.