1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.jetspeed.om.folder.impl;
18
19 import java.util.AbstractList;
20 import java.util.List;
21
22 import org.apache.jetspeed.page.impl.DatabasePageManagerUtils;
23
24 /***
25 * FolderOrderList
26 *
27 * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
28 * @version $Id$
29 */
30 class FolderOrderList extends AbstractList
31 {
32 private FolderImpl folder;
33
34 private List removedFolderOrders;
35
36 FolderOrderList(FolderImpl folder)
37 {
38 super();
39 this.folder = folder;
40 }
41
42 /***
43 * wrapNameStringForAdd
44 *
45 * Wraps and validates folder order name string
46 * to be added to this list.
47 *
48 * @param name folder order name string to add
49 * @return list element to add
50 */
51 private FolderOrder wrapNameStringForAdd(String name)
52 {
53
54 if (name == null)
55 {
56 throw new NullPointerException("Unable to add null to list.");
57 }
58
59 FolderOrder folderOrder = new FolderOrder();
60 folderOrder.setName(name);
61
62 if (folder.accessFolderOrders().contains(folderOrder))
63 {
64 throw new IllegalArgumentException("Unable to add duplicate entry to list: " + folderOrder.getName());
65 }
66
67
68 if (removedFolderOrders != null)
69 {
70 int removedIndex = removedFolderOrders.indexOf(folderOrder);
71 if (removedIndex >= 0)
72 {
73 folderOrder = (FolderOrder)removedFolderOrders.remove(removedIndex);
74 }
75 }
76 return folderOrder;
77 }
78
79 /***
80 * getRemovedFolderOrders
81 *
82 * @return removed folder orders tracking collection
83 */
84 private List getRemovedFolderOrders()
85 {
86 if (removedFolderOrders == null)
87 {
88 removedFolderOrders = DatabasePageManagerUtils.createList();
89 }
90 return removedFolderOrders;
91 }
92
93
94
95
96 public void add(int index, Object element)
97 {
98
99
100 if ((index < 0) || (index > folder.accessFolderOrders().size()))
101 {
102 throw new IndexOutOfBoundsException("Unable to add to list at index: " + index);
103 }
104
105 FolderOrder folderOrder = wrapNameStringForAdd((String)element);
106
107 folder.accessFolderOrders().add(index, folderOrder);
108
109 if (index > 0)
110 {
111 folderOrder.setSortOrder(((FolderOrder)folder.accessFolderOrders().get(index-1)).getSortOrder() + 1);
112 }
113 else
114 {
115 folderOrder.setSortOrder(0);
116 }
117
118 for (int i = index, limit = folder.accessFolderOrders().size() - 1; (i < limit); i++)
119 {
120 FolderOrder nextFolderOrder = (FolderOrder)folder.accessFolderOrders().get(i + 1);
121 if (nextFolderOrder.getSortOrder() <= folderOrder.getSortOrder())
122 {
123
124 nextFolderOrder.setSortOrder(folderOrder.getSortOrder() + 1);
125 folderOrder = nextFolderOrder;
126 }
127 else
128 {
129
130 break;
131 }
132 }
133
134 folder.clearDocumentOrderComparator();
135 }
136
137
138
139
140 public Object get(int index)
141 {
142
143
144 return ((FolderOrder)folder.accessFolderOrders().get(index)).getName();
145 }
146
147
148
149
150 public Object remove(int index)
151 {
152
153 FolderOrder removed = (FolderOrder)folder.accessFolderOrders().remove(index);
154 if (removed != null)
155 {
156
157 getRemovedFolderOrders().add(removed);
158
159 folder.clearDocumentOrderComparator();
160 }
161 return removed;
162 }
163
164
165
166
167 public Object set(int index, Object element)
168 {
169
170
171 FolderOrder newFolderOrder = wrapNameStringForAdd((String)element);
172
173 FolderOrder folderOrder = (FolderOrder)folder.accessFolderOrders().set(index, newFolderOrder);
174
175 newFolderOrder.setSortOrder(folderOrder.getSortOrder());
176
177 getRemovedFolderOrders().add(folderOrder);
178
179 folder.clearDocumentOrderComparator();
180
181 return folderOrder.getName();
182 }
183
184
185
186
187 public int size()
188 {
189
190 return folder.accessFolderOrders().size();
191 }
192 }