Uploaded image for project: 'Jackrabbit Oak'
  1. Jackrabbit Oak
  2. OAK-275

Introduce TreeLocation interface

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 0.5
    • core
    • None

    Description

      In order to address the issues revolving around access control (i.e OAK-212, OAK-214, OAK-218, OAK-220, OAK-226,...) I'd like to introduce a new interface TreeLocation:

      /**
       * A {@code TreeLocation} denotes a location inside a tree.
       * It can either refer to a inner node (that is a {@link org.apache.jackrabbit.oak.api.Tree})
       * or to a leaf (that is a {@link org.apache.jackrabbit.oak.api.PropertyState}).
       * {@code TreeLocation} instances provide methods for navigating trees. {@code TreeLocation}
       * instances are immutable and navigating a tree always results in new {@code TreeLocation}
       * instances. Navigation never fails. Errors are deferred until the underlying item itself is
       * accessed. That is, if a {@code TreeLocation} points to an item which does not exist or
       * is unavailable otherwise (i.e. due to access control restrictions) accessing the tree
       * will return {@code null} at this point.
       */
      public interface TreeLocation {
      
          /**
           * Navigate to the parent
           * @return  a {@code TreeLocation} for the parent of this location.
           */
          @Nonnull
          TreeLocation getParent();
      
          /**
           * Navigate to a child
           * @param name  name of the child
           * @return  a {@code TreeLocation} for a child with the given {@code name}.
           */
          @Nonnull
          TreeLocation getChild(String name);
      
          /**
           * Get the underlying {@link org.apache.jackrabbit.oak.api.Tree} for this {@code TreeLocation}.
           * @return  underlying {@code Tree} instance or {@code null} if not available.
           */
          @CheckForNull
          Tree getTree();
      
          /**
           * Get the underlying {@link org.apache.jackrabbit.oak.api.PropertyState} for this {@code TreeLocation}.
           * @return  underlying {@code PropertyState} instance or {@code null} if not available.
           */
          @CheckForNull
          PropertyState getProperty();
      }
      

      Such an interface would decouple navigation from the tree itself while at the same time unifying node and property access. This allows us to enforce access control restriction on the tree itself while still being able to access items which we are "unlinked" by access control restrictions. In addition unification of node and property access will simplify the code in many places. Finally TreeLocations might better encapsulate the resolution of a location in a tree to the actual tree. This is something which currently done in Node/PropertyDelegate.resolve but always bothered me as too ad-hoc.

      Attachments

        Activity

          People

            mduerig Michael Dürig
            mduerig Michael Dürig
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: