1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.googlesitemap.app.subapp.sitemapdetail.util;
35
36 import info.magnolia.module.googlesitemap.bean.SiteMapEntry;
37
38 import java.util.ArrayList;
39 import java.util.Collection;
40 import java.util.List;
41
42 import com.vaadin.data.Container;
43 import com.vaadin.data.util.BeanItemContainer;
44
45
46
47
48 public class SiteMapEntryContainer extends BeanItemContainer<SiteMapEntry> implements Container.Hierarchical {
49
50 private int maxLevel = Integer.MIN_VALUE;
51
52 private int minLevel = Integer.MAX_VALUE;
53
54 public SiteMapEntryContainer(List<SiteMapEntry> entries) {
55 super(SiteMapEntry.class);
56 addAll(entries);
57 calculateBoundLevels();
58 }
59
60 @Override
61 public Collection<?> getChildren(Object itemId) {
62 SiteMapEntry entry = (SiteMapEntry)itemId;
63
64 int level = entry.getLevel();
65 List<SiteMapEntry> children = new ArrayList<SiteMapEntry>();
66 int index = indexOfId(entry) + 1;
67 while (index < size()) {
68 SiteMapEntry childEntry = getIdByIndex(index);
69 if (childEntry.getLevel() != level + 1) {
70 break;
71 }
72 children.add(childEntry);
73 ++index;
74 }
75 return children;
76 }
77
78 @Override
79 public Object getParent(Object itemId) {
80 SiteMapEntry parent = null;
81 SiteMapEntry child = (SiteMapEntry)itemId;
82 int index = indexOfId(itemId);
83 while (index > 0 && parent == null) {
84 SiteMapEntry id = getIdByIndex(--index);
85 if (id.getLevel() < child.getLevel()) {
86 parent = id;
87 }
88 }
89 return parent;
90 }
91
92 @Override
93 public Collection<?> rootItemIds() {
94 List<SiteMapEntry> roots = new ArrayList<SiteMapEntry>();
95 for (SiteMapEntry entry : getItemIds()) {
96 if (entry.getLevel() == minLevel) {
97 roots.add(entry);
98 }
99 }
100 return roots;
101 }
102
103 @Override
104 public boolean areChildrenAllowed(Object itemId) {
105 return getChildren(itemId).size() > 0;
106 }
107
108 @Override
109 public boolean isRoot(Object itemId) {
110 return ((SiteMapEntry)itemId).getLevel() == minLevel;
111 }
112
113 @Override
114 public boolean hasChildren(Object itemId) {
115 return ((SiteMapEntry)itemId).getLevel() < maxLevel;
116 }
117
118 @Override
119 public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
120 throw new UnsupportedOperationException();
121 }
122
123 @Override
124 public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException {
125 throw new UnsupportedOperationException();
126 }
127
128 private void calculateBoundLevels() {
129 Collection<SiteMapEntry> ids = getItemIds();
130 for (SiteMapEntry id : ids) {
131 int level = id.getLevel();
132 maxLevel = Math.max(maxLevel, level);
133 minLevel = Math.min(minLevel, level);
134 }
135 }
136 }