1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.jetspeed.om.registry.base;
18
19 import java.util.Iterator;
20 import java.util.SortedMap;
21 import java.util.HashMap;
22
23 import java.util.NoSuchElementException;
24 import java.lang.UnsupportedOperationException;
25 import java.lang.IllegalStateException;
26
27 import org.apache.jetspeed.om.registry.*;
28
29
30 /***
31 * CategoryIterator - iterators over category treemap/hashmap allowing dups
32 *
33 *
34 * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
35 * @version $Id: CategoryIterator.java,v 1.3 2004/02/23 03:08:26 jford Exp $
36 */
37 public class CategoryIterator implements Iterator
38 {
39 protected SortedMap map = null;
40 protected String key;
41 protected Iterator mapIterator = null;
42 protected Iterator bucketIterator = null;
43 protected boolean iteratingMaps = true;
44 protected HashMap bucket = null;
45 protected PortletEntry portlet = null;
46 protected boolean findall = false;
47 protected String category = "";
48 protected String group = "";
49
50 public String getCategory()
51 {
52 return category;
53 }
54
55 public String getGroup()
56 {
57 return group;
58 }
59
60 public CategoryIterator(SortedMap map, String key)
61 {
62 this.map = map;
63 this.key = key;
64 findall = (this.key == null || this.key.equals(""));
65 if (findall)
66 this.map = map;
67 else
68 this.map = map.tailMap(key);
69 this.mapIterator = this.map.entrySet().iterator();
70 this.bucketIterator = null;
71 this.bucket = null;
72 }
73
74 private CategoryIterator()
75 {}
76
77 public boolean hasNext()
78 {
79 if (iteratingMaps)
80 {
81 if (mapIterator.hasNext() == false)
82 return false;
83 return filter();
84 }
85
86 if (bucketIterator.hasNext())
87 return getPortletEntry();
88
89
90 if (mapIterator.hasNext())
91 {
92 return filter();
93 }
94 return false;
95 }
96
97 protected boolean filter()
98 {
99 java.util.Map.Entry entry = (java.util.Map.Entry)mapIterator.next();
100 String entryKey = (String)entry.getKey();
101 int pos = entryKey.indexOf('.');
102 this.category = "";
103 if (-1 == pos)
104 {
105 this.group = entryKey;
106 }
107 else
108 {
109 this.group = entryKey.substring(0, pos);
110 int length = entryKey.length();
111 if (length > pos + 1)
112 this.category = entryKey.substring(pos + 1, length);
113 }
114
115 if (!findall && !entryKey.startsWith(this.key))
116 return false;
117
118 bucket = (HashMap)entry.getValue();
119
120 bucketIterator = bucket.entrySet().iterator();
121 iteratingMaps = false;
122 if (bucketIterator.hasNext() == false)
123 return false;
124 return getPortletEntry();
125 }
126
127
128 protected boolean getPortletEntry()
129 {
130 java.util.Map.Entry entry = (java.util.Map.Entry)bucketIterator.next();
131 if (null == entry)
132 return false;
133
134 this.portlet = (PortletEntry)entry.getValue();
135
136 return true;
137 }
138
139 public void remove() throws IllegalStateException, UnsupportedOperationException
140 {
141 throw new UnsupportedOperationException("The remove() method is not supported");
142 }
143
144
145 public Object next() throws NoSuchElementException
146 {
147 return portlet;
148 }
149
150 }