You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2022/12/06 18:00:16 UTC

svn commit: r1905804 - in /jackrabbit/branches/2.20: ./ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java

Author: reschke
Date: Tue Dec  6 18:00:16 2022
New Revision: 1905804

URL: http://svn.apache.org/viewvc?rev=1905804&view=rev
Log:
JCR-4854: factor out ChildNodeEnriesImpl.LinkedList for better encapsulation (merged rr1904350 and r1904397 into 2.20)

Added:
    jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java
      - copied, changed from r1904350, jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java
Modified:
    jackrabbit/branches/2.20/   (props changed)
    jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java

Propchange: jackrabbit/branches/2.20/
------------------------------------------------------------------------------
  Merged /jackrabbit/trunk:r1904350,1904397

Modified: jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java?rev=1905804&r1=1905803&r2=1905804&view=diff
==============================================================================
--- jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java (original)
+++ jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java Tue Dec  6 18:00:16 2022
@@ -16,11 +16,8 @@
  */
 package org.apache.jackrabbit.jcr2spi.hierarchy;
 
-import java.lang.ref.Reference;
-import java.lang.ref.SoftReference;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -30,7 +27,6 @@ import java.util.NoSuchElementException;
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.RepositoryException;
 
-import org.apache.commons.collections.list.AbstractLinkedList;
 import org.apache.jackrabbit.jcr2spi.state.Status;
 import org.apache.jackrabbit.spi.ChildInfo;
 import org.apache.jackrabbit.spi.Name;
@@ -50,11 +46,6 @@ final class ChildNodeEntriesImpl impleme
     private boolean complete = false;
 
     /**
-     * Linked list of {@link NodeEntry} instances.
-     */
-    private final LinkedEntries entries = new LinkedEntries();
-
-    /**
      * Map used for lookup by name.
      */
     private final NameMap entriesByName = new NameMap();
@@ -62,6 +53,11 @@ final class ChildNodeEntriesImpl impleme
     private final NodeEntry parent;
     private final EntryFactory factory;
 
+    /**
+     * Linked list of {@link NodeEntry} instances.
+     */
+    private final LinkedEntries entries;
+
      /**
       * Create a new <code>ChildNodeEntries</code> collection from the given
       * <code>childNodeInfos</code> instead of retrieving them from the
@@ -78,6 +74,7 @@ final class ChildNodeEntriesImpl impleme
      ChildNodeEntriesImpl(NodeEntry parent, EntryFactory factory, Iterator<ChildInfo> childNodeInfos) {
          this.parent = parent;
          this.factory = factory;
+         this.entries = new LinkedEntries(factory, parent);
 
          if (childNodeInfos != null) {
              while (childNodeInfos.hasNext()) {
@@ -475,248 +472,6 @@ final class ChildNodeEntriesImpl impleme
     }
 
     //-------------------------------------------------< AbstractLinkedList >---
-    /**
-     * An implementation of a linked list which provides access to the internal
-     * LinkNode which links the entries of the list.
-     */
-    private final class LinkedEntries extends AbstractLinkedList {
-
-        LinkedEntries() {
-            super();
-            init();
-        }
-
-        /**
-         * Returns the matching <code>LinkNode</code> from a list or a single
-         * <code>LinkNode</code>. This method will return <code>null</code>
-         * if none of the entries matches either due to missing entry for given
-         * state name or due to missing availability of the <code>NodeEntry</code>.
-         *
-         * @param nodeEntry the <code>NodeEntry</code> that is compared to the
-         * resolution of any <code>NodeEntry</code> that matches by name.
-         * @return the matching <code>LinkNode</code> or <code>null</code>
-         */
-        private LinkedEntries.LinkNode getLinkNode(NodeEntry nodeEntry) {
-            for (Iterator<LinkedEntries.LinkNode> it = linkNodeIterator(); it.hasNext();) {
-                LinkedEntries.LinkNode ln = it.next();
-                if (ln.getNodeEntry() == nodeEntry) {
-                    return ln;
-                }
-            }
-            // not found
-            return null;
-        }
-
-        private LinkedEntries.LinkNode getHeader() {
-            return (LinkedEntries.LinkNode) header;
-        }
-
-        /**
-         * Adds a child node entry at the end of this list.
-         *
-         * @param cne the child node entry to add.
-         * @param index
-         * @return the LinkNode which refers to the added <code>NodeEntry</code>.
-         */
-        LinkedEntries.LinkNode add(NodeEntry cne, int index) {
-            LinkedEntries.LinkNode ln = new LinkedEntries.LinkNode(cne, index);
-            addNode(ln, header);
-            return ln;
-        }
-
-        /**
-         * Adds the given child node entry to this list after the specified
-         * <code>entry</code> or at the beginning if <code>entry</code> is
-         * <code>null</code>.
-         *
-         * @param cne the child node entry to add.
-         * @param index
-         * @param insertAfter after which to insert the new entry
-         * @return the LinkNode which refers to the added <code>NodeEntry</code>.
-         */
-        LinkedEntries.LinkNode addAfter(NodeEntry cne, int index, LinkedEntries.LinkNode insertAfter) {
-            LinkedEntries.LinkNode newNode;
-            if (insertAfter == null) {
-                // insert at the beginning
-                newNode = new LinkedEntries.LinkNode(cne, index);
-                addNode(newNode, header);
-            } else if (insertAfter.getNextLinkNode() == null) {
-                newNode = add(cne, index);
-            } else {
-                newNode = new LinkedEntries.LinkNode(cne, index);
-                addNode(newNode, insertAfter.getNextLinkNode());
-            }
-            return newNode;
-        }
-
-        /**
-         * Remove the LinkEntry the contains the given NodeEntry as value.
-         *
-         * @param cne NodeEntry to be removed.
-         * @return LinkedEntries.LinkNode that has been removed.
-         */
-        LinkedEntries.LinkNode removeNodeEntry(NodeEntry cne) {
-            LinkedEntries.LinkNode ln = getLinkNode(cne);
-            if (ln != null) {
-                ln.remove();
-            }
-            return ln;
-        }
-
-        /**
-         * Reorders an existing <code>LinkNode</code> before another existing
-         * <code>LinkNode</code>. If <code>before</code> is <code>null</code>
-         * the <code>insert</code> node is moved to the end of the list.
-         *
-         * @param insert the node to reorder.
-         * @param before the node where to reorder node <code>insert</code>.
-         */
-        void reorderNode(LinkedEntries.LinkNode insert, LinkedEntries.LinkNode before) {
-            removeNode(insert);
-            if (before == null) {
-                addNode(insert, header);
-            } else {
-                addNode(insert, before);
-            }
-        }
-
-        /**
-         * Create a new <code>LinkNode</code> for a given {@link NodeEntry}
-         * <code>value</code>.
-         *
-         * @param value a child node entry.
-         * @return a wrapping {@link LinkedEntries.LinkNode}.
-         * @see AbstractLinkedList#createNode(Object)
-         */
-        @Override
-        protected Node createNode(Object value) {
-            return new LinkedEntries.LinkNode(value, Path.INDEX_DEFAULT);
-        }
-
-        /**
-         * @return a new <code>LinkNode</code>.
-         * @see AbstractLinkedList#createHeaderNode()
-         */
-        @Override
-        protected Node createHeaderNode() {
-            return new LinkedEntries.LinkNode();
-        }
-
-        /**
-         * @return iterator over all LinkNode entries in this list.
-         */
-        private Iterator<LinkedEntries.LinkNode> linkNodeIterator() {
-            return new LinkNodeIterator();
-        }
-
-        //----------------------------------------------------------------------
-        /**
-         * Extends the <code>AbstractLinkedList.Node</code>.
-         */
-        private final class LinkNode extends Node {
-
-            private final Name qName;
-
-            protected LinkNode() {
-                super();
-                qName = null;
-            }
-
-            protected LinkNode(Object value, int index) {
-                // add soft reference from linkNode to the NodeEntry (value)
-                // unless the entry is a SNSibling. TODO: review again.
-                super(index > Path.INDEX_DEFAULT ? value : new SoftReference<Object>(value));
-                qName = ((NodeEntry) value).getName();
-            }
-
-            @Override
-            protected void setValue(Object value) {
-                throw new UnsupportedOperationException("Not implemented");
-            }
-
-            @Override
-            protected Object getValue() {
-                Object val = super.getValue();
-                NodeEntry ne;
-                if (val == null) {
-                    ne = null;
-                } else if (val instanceof Reference) {
-                    ne = (NodeEntry) ((Reference) val).get();
-                } else {
-                    ne = (NodeEntry) val;
-                }
-                // if the nodeEntry has been g-collected in the mean time
-                // create a new NodeEntry in order to avoid returning null.
-                if (ne == null && this != header) {
-                    ne = factory.createNodeEntry(parent, qName, null);
-                    super.setValue(new SoftReference<NodeEntry>(ne));
-                }
-                return ne;
-            }
-
-            /**
-             * @return the wrapped <code>NodeEntry</code>.
-             */
-            public NodeEntry getNodeEntry() {
-                return (NodeEntry) getValue();
-            }
-
-            /**
-             * Removes this <code>LinkNode</code> from the linked list.
-             */
-            public void remove() {
-                removeNode(this);
-            }
-
-            /**
-             * @return the next LinkNode.
-             */
-            public LinkedEntries.LinkNode getNextLinkNode() {
-                return (LinkedEntries.LinkNode) super.getNextNode();
-            }
-
-            /**
-             * @return the next LinkNode.
-             */
-            public LinkedEntries.LinkNode getPreviousLinkNode() {
-                return (LinkedEntries.LinkNode) super.getPreviousNode();
-            }
-        }
-
-        //----------------------------------------------------------------------
-        private class LinkNodeIterator implements Iterator<LinkedEntries.LinkNode> {
-
-            private LinkedEntries.LinkNode next = ((LinkedEntries.LinkNode) header).getNextLinkNode();
-            private final int expectedModCount = modCount;
-
-            public boolean hasNext() {
-                checkModCount();
-                return next != header;
-            }
-
-            public LinkedEntries.LinkNode next() {
-                checkModCount();
-                if (!hasNext()) {
-                    throw new NoSuchElementException();
-                }
-                LinkedEntries.LinkNode n = next;
-                next = next.getNextLinkNode();
-                return n;
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException("remove");
-            }
-
-            private void checkModCount() {
-                if (expectedModCount != modCount) {
-                    throw new ConcurrentModificationException();
-                }
-            }
-        }
-    }
-
-
 
     //--------------------------------------------------------------------------
     /**

Copied: jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java (from r1904350, jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java)
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java?p2=jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java&p1=jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java&r1=1904350&r2=1905804&rev=1905804&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java (original)
+++ jackrabbit/branches/2.20/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/LinkedEntries.java Tue Dec  6 18:00:16 2022
@@ -30,7 +30,7 @@ import org.apache.jackrabbit.spi.Path;
  * An implementation of a linked list which provides access to the internal
  * LinkNode which links the entries of the list.
  */
-public class LinkedEntries extends AbstractLinkedList {
+class LinkedEntries extends AbstractLinkedList {
 
     private final EntryFactory factory;
     private final NodeEntry parent;