LinkedListNode.java 3.9 KB
Newer Older
Matt Tucker's avatar
Matt Tucker committed
1 2 3 4 5
/**
 * $RCSfile$
 * $Revision$
 * $Date$
 *
6
 * Copyright (C) 2004-2008 Jive Software. All rights reserved.
Matt Tucker's avatar
Matt Tucker committed
7
 *
8 9 10 11 12 13 14 15 16 17 18
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
Matt Tucker's avatar
Matt Tucker committed
19 20 21 22 23 24 25 26
 */

package org.jivesoftware.util;

/**
 * Doubly linked node in a LinkedList. Most LinkedList implementations keep the
 * equivalent of this class private. We make it public so that references
 * to each node in the list can be maintained externally.
27
 * <p>
Matt Tucker's avatar
Matt Tucker committed
28 29 30
 * Exposing this class lets us make remove operations very fast. Remove is
 * built into this class and only requires two reference reassignments. If
 * remove existed in the main LinkedList class, a linear scan would have to
31 32
 * be performed to find the correct node to delete.</p>
 * <p>
Matt Tucker's avatar
Matt Tucker committed
33 34 35
 * The linked list implementation was specifically written for the Jive
 * cache system. While it can be used as a general purpose linked list, for
 * most applications, it is more suitable to use the linked list that is part
36
 * of the Java Collections package.</p>
Matt Tucker's avatar
Matt Tucker committed
37 38 39 40
 *
 * @author Jive Software
 * @see org.jivesoftware.util.LinkedList
 */
41
public class LinkedListNode<E> {
Matt Tucker's avatar
Matt Tucker committed
42

43 44 45
    public LinkedListNode<E> previous;
    public LinkedListNode<E> next;
    public E object;
Matt Tucker's avatar
Matt Tucker committed
46 47 48 49 50

    /**
     * This class is further customized for the CoolServlets cache system. It
     * maintains a timestamp of when a Cacheable object was first added to
     * cache. Timestamps are stored as long values and represent the number
51 52
     * of milleseconds passed since January 1, 1970 00:00:00.000 GMT.
     * <p>
Matt Tucker's avatar
Matt Tucker committed
53 54
     * The creation timestamp is used in the case that the cache has a
     * maximum lifetime set. In that case, when
55 56
     * [current time] - [creation time] &gt; [max lifetime], the object will be
     * deleted from cache.</p>
Matt Tucker's avatar
Matt Tucker committed
57 58 59
     */
    public long timestamp;

60 61 62 63
    /**
     * Constructs an self-referencing node. This node acts as a start/end
     * sentinel when traversing nodes in a LinkedList.
     */
64
    public LinkedListNode() {
65 66 67
    	previous = next = this;
    }

Matt Tucker's avatar
Matt Tucker committed
68 69 70 71 72 73 74
    /**
     * Constructs a new linked list node.
     *
     * @param object   the Object that the node represents.
     * @param next     a reference to the next LinkedListNode in the list.
     * @param previous a reference to the previous LinkedListNode in the list.
     */
75
    public LinkedListNode(E object, LinkedListNode<E> next, LinkedListNode<E> previous) {
76 77 78
    	if (next != null && previous != null) {
    		this.insert(next, previous);
    	}
Matt Tucker's avatar
Matt Tucker committed
79 80 81 82
        this.object = object;
    }

    /**
83 84
     * Removes this node from the linked list that it was a part of.
     * @return This node; next and previous references dropped
Matt Tucker's avatar
Matt Tucker committed
85
     */
86
    public LinkedListNode<E> remove() {
Matt Tucker's avatar
Matt Tucker committed
87 88
        previous.next = next;
        next.previous = previous;
89 90 91 92 93 94 95 96
        previous = next = null;
        return this;
    }
    
    /**
     * Inserts this node into the linked list that it will be a part of.
     * @return This node, updated to reflect previous/next changes
     */
97
    public LinkedListNode<E> insert(LinkedListNode<E> next, LinkedListNode<E> previous) {
98 99 100 101
        this.next = next;
        this.previous = previous;
        this.previous.next = this.next.previous = this;
        return this;
Matt Tucker's avatar
Matt Tucker committed
102 103 104 105 106 107 108 109
    }

    /**
     * Returns a String representation of the linked list node by calling the
     * toString method of the node's object.
     *
     * @return a String representation of the LinkedListNode.
     */
110 111
    @Override
	public String toString() {
Matt Tucker's avatar
Matt Tucker committed
112 113 114
        return object == null ? "null" : object.toString();
    }
}