ModeShape
  1. ModeShape
  2. MODE-1401

Checking in versionable node should make subgraph read-only

    Details

    • Similar Issues:
      Show 10 results 

      Description

      When checking in a versionable node, that node and its subgraph should be read-only. In particular, Section 15.2.2 of the JCR 2.0 specification has the relevant bits:

      When a versionable node is checked in, it and its subgraph become read-only. The effect of read-only status on a node depends on the on-parent-version (OPV) status of each of its child items.

      When a node N becomes read-only:

      • No property of N can be added, removed or have its value changed unless it has an on-parent-version setting of IGNORE.
      • No child node of N can be added or removed unless it has an on-parent-version setting of IGNORE.
      • Every existing child node of N becomes read-only unless it has an on- parent-version setting of IGNORE or has an on-parent-version setting of VERSION and is itself versionable.

      Apparently we restrict the adding/modification/removal of properties (tho we should verify that with additional tests), but we do not restrict the adding or removal of nodes. Additionally, even when the OPV setting of a child node definition is VERSION, the expected behavior differs depending upon whether the actual child node is versionable.

      Consider these node types:

      [A] > mix:versionable
        - name (string) copy
        + b (B) multiple version
      
      [B]
        - name (string) copy
      

      and this code:

      Node root = session.getRootNode();
      Node a    = root.addNode("node", "A");
      a.setProperty("name", "aaa");
      session.save();
      versionManager.checkin(a.getPath());
      // The next call is correctly prevented ...
      // a.setProperty("name", "aaa");
      
      // But the next call should result in an exception, but doesn't
      Node b = a.addNode("b", "B");
      session.save();
      
      // This shouldn't be possible either ...
      b.remove();
      
      session.save();
      

      The a.setProperty("name", "aaa") statement (commented out) is not possible without an exception:

      javax.jcr.version.VersionException: '/node' (or its nearest versionable ancestor) is checked in, preventing this action
                at org.modeshape.jcr.JcrNode.doRemove(JcrNode.java:118)
                at org.modeshape.jcr.AbstractJcrNode.removeShare(AbstractJcrNode.java:2415)
                at org.modeshape.jcr.AbstractJcrNode.remove(AbstractJcrNode.java:2458)
                at au.com.infomedix.documentstore.cnd.TestLoadCND.main(TestLoadCND.java:88)
      

      However, the a.addNode("b", "B") should not be possible either without an exception. And once there is a child named 'b', whether its properties can be changed depends on whether 'b' is versionable. Currently, setting a property on 'b' when 'a' is checked out is not currently possible, even when 'b' is versionable.

      See the forum post for more context and detail.

        Activity

        Hide
        Randall Hauch
        added a comment -

        Added two pull requests to fix the behavior.

        • 303 corrects the behavior and adds the new unit tests in the 'master' (2.x) branch
        • 304 corrects the behavior and adds the new unit tests in the '3.x' branch.
        Show
        Randall Hauch
        added a comment - Added two pull requests to fix the behavior. 303 corrects the behavior and adds the new unit tests in the 'master' (2.x) branch 304 corrects the behavior and adds the new unit tests in the '3.x' branch.
        Hide
        Randall Hauch
        added a comment -

        Merged both pull-requests into their respective branches.

        Show
        Randall Hauch
        added a comment - Merged both pull-requests into their respective branches.

          People

          • Assignee:
            Randall Hauch
            Reporter:
            Randall Hauch
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: