001: /*
002: JSPWiki - a JSP-based WikiWiki clone.
003:
004: Copyright (C) 2001-2003 Janne Jalkanen (Janne.Jalkanen@iki.fi)
005:
006: This program is free software; you can redistribute it and/or modify
007: it under the terms of the GNU Lesser General Public License as published by
008: the Free Software Foundation; either version 2.1 of the License, or
009: (at your option) any later version.
010:
011: This program is distributed in the hope that it will be useful,
012: but WITHOUT ANY WARRANTY; without even the implied warranty of
013: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: GNU Lesser General Public License for more details.
015:
016: You should have received a copy of the GNU Lesser General Public License
017: along with this program; if not, write to the Free Software
018: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020: package com.ecyrd.jspwiki.util;
021:
022: import java.util.AbstractList;
023: import java.util.ArrayList;
024:
025: /**
026: * Builds a simple, priority-based List implementation. The list
027: * will be sorted according to the priority. If two items are
028: * inserted with the same priority, their order is the insertion order - i.e. the new one
029: * is appended last in the insertion list.
030: * <p>
031: * Priority is an integer, and the list is sorted in descending order
032: * (that is, 100 is before 10 is before 0 is before -40).
033: *
034: * @author Janne Jalkanen
035: */
036: public class PriorityList extends AbstractList {
037: private ArrayList m_elements = new ArrayList();
038:
039: /**
040: * This is the default priority, which is used if no priority
041: * is defined. It's current value is zero.
042: */
043: public static final int DEFAULT_PRIORITY = 0;
044:
045: /**
046: * Adds an object to its correct place in the list, using the
047: * given priority.
048: *
049: * @param o Object to add.
050: * @param priority Priority.
051: */
052: public void add(Object o, int priority) {
053: int i = 0;
054:
055: for (; i < m_elements.size(); i++) {
056: Item item = (Item) m_elements.get(i);
057:
058: if (item.m_priority < priority) {
059: break;
060: }
061: }
062:
063: Item newItem = new Item();
064: newItem.m_priority = priority;
065: newItem.m_object = o;
066:
067: m_elements.add(i, newItem);
068: }
069:
070: /**
071: * Adds an object using the default priority to the List.
072: *
073: * @param o Object to add.
074: * @return true, as per the general Collections.add contract.
075: */
076: public boolean add(Object o) {
077: add(o, DEFAULT_PRIORITY);
078:
079: return true;
080: }
081:
082: /**
083: * Returns the object at index "index".
084: *
085: * @param index The index.
086: * @return The object at the list at the position "index".
087: */
088: public Object get(int index) {
089: return ((Item) m_elements.get(index)).m_object;
090: }
091:
092: /**
093: * Returns the current size of the list.
094: *
095: * @return size of the list.
096: */
097: public int size() {
098: return m_elements.size();
099: }
100:
101: /**
102: * Provides a holder for the priority-object 2-tuple.
103: */
104: private static class Item {
105: public int m_priority;
106: public Object m_object;
107: }
108: }
|