@SuppressWarnings("unchecked") @Override protected ContainerTableItems createContainerTableSource(CollectionContainer container) { return new ContainerGroupTableItems(container); } }
@Override public int getGroupItemsCount(GroupInfo groupId) { if (containsGroup(groupId)) { List<K> itemIds; if ((itemIds = groupItems.get(groupId)) == null) { int count = 0; List<GroupInfo> children = getChildrenInternal(groupId); for (GroupInfo child : children) { count += getGroupItemsCount(child); } return count; } else { return itemIds.size(); } } return 0; }
@Override public void sort(Object[] propertyId, boolean[] ascending) { sortProperties = propertyId; sortAscending = ascending; if (hasGroups()) { Sort sort = createSort(propertyId, ascending); doGroupSort(sort); } else { super.sort(propertyId, ascending); } }
@Override public Collection<K> getGroupItemIds(GroupInfo groupId) { if (containsGroup(groupId)) { List<K> itemIds; if ((itemIds = groupItems.get(groupId)) == null) { itemIds = new ArrayList<>(); List<GroupInfo> children = getChildrenInternal(groupId); for (GroupInfo child : children) { itemIds.addAll(getGroupItemIds(child)); } } return ImmutableList.copyOf(itemIds); } return Collections.emptyList(); }
@Override public void groupBy(Object[] properties) { if (isGrouping) { return; } isGrouping = true; try { if (properties != null) { groupProperties = properties; if (!ArrayUtils.isEmpty(groupProperties)) { doGroup(); } else { roots = null; parents = null; children = null; groupItems = null; itemGroups = null; } } } finally { isGrouping = false; if (sortProperties != null && sortProperties.length > 0) { if (hasGroups()) { doGroupSort(createSort(sortProperties, sortAscending)); } else { super.sort(sortProperties, sortAscending); } } } }
@Override public List<E> getChildItems(GroupInfo groupId) { if (groupItems == null) { return Collections.emptyList(); } if (containsGroup(groupId)) { List<E> entities = new ArrayList<>(); // if current group contains other groups if (hasChildren(groupId)) { List<GroupInfo> children = getChildrenInternal(groupId); for (GroupInfo childGroup : children) { entities.addAll(getChildItems(childGroup)); } } for (K id : groupItems.getOrDefault(groupId, Collections.emptyList())) { E item = container.getItem(id); entities.add(item); } return entities; } return Collections.emptyList(); }
protected GroupInfo<MetaPropertyPath> groupItems(int propertyIndex, GroupInfo parent, List<GroupInfo> children, E item, LinkedMap<MetaPropertyPath, Object> groupValues) { MetaPropertyPath property = (MetaPropertyPath) groupProperties[propertyIndex++]; Object itemValue = getValueByProperty(item, property); groupValues.put(property, itemValue); GroupInfo<MetaPropertyPath> groupInfo = new GroupInfo<>(groupValues); itemGroups.put(item.getId(), groupInfo); if (!parents.containsKey(groupInfo)) { parents.put(groupInfo, parent); } if (!children.contains(groupInfo)) { children.add(groupInfo); } List<GroupInfo> groupChildren = this.children.computeIfAbsent(groupInfo, k -> new ArrayList<>()); if (propertyIndex < groupProperties.length) { groupInfo = groupItems(propertyIndex, groupInfo, groupChildren, item, groupValues); } return groupInfo; }
@Override public boolean hasChildren(GroupInfo groupId) { boolean groupExists = containsGroup(groupId); List<GroupInfo> groupChildren = this.children.get(groupId); return groupExists && CollectionUtils.isNotEmpty(groupChildren); }
@Override public Object getGroupProperty(GroupInfo groupId) { if (containsGroup(groupId)) { return groupId.getProperty(); } return null; }
@Override public Object getGroupPropertyValue(GroupInfo groupId) { if (containsGroup(groupId)) { return groupId.getValue(); } return null; }
@Override public List<E> getOwnChildItems(GroupInfo groupId) { if (groupItems == null) { return Collections.emptyList(); } List<K> idsList = groupItems.get(groupId); if (containsGroup(groupId) && CollectionUtils.isNotEmpty(idsList)) { return idsList.stream() .map(id -> container.getItem(id)) .collect(Collectors.toList()); } return Collections.emptyList(); }