/** * Fetch all the descendants of the given parent item from the given data * provider. * * @since 8.1 * @param parent * the parent item to fetch descendants for * @param dataProvider * the data provider to fetch from * @return the stream of all descendant items */ private Stream<T> fetchAllDescendants(T parent, HierarchicalDataProvider<T, ?> dataProvider) { List<T> children = dataProvider .fetchChildren(new HierarchicalQuery<>(null, parent)) .collect(Collectors.toList()); if (children.isEmpty()) { return Stream.empty(); } return children.stream() .flatMap(child -> Stream.concat(Stream.of(child), fetchAllDescendants(child, dataProvider))); }
@Override protected void writeData(Element body, DesignContext designContext) { getDataProvider().fetch(new HierarchicalQuery<>(null, null)) .forEach(item -> writeRow(body, item, null, designContext)); }
private void writeItems(Element design, DesignContext designContext) { getDataProvider().fetch(new HierarchicalQuery<>(null, null)) .forEach(item -> writeItem(design, designContext, item, null)); }
private HierarchicalQuery<T, F> mixInSortOrders( HierarchicalQuery<T, F> query) { if (sortOrders.isEmpty()) { return query; } Set<String> sortedPropertyNames = query.getSortOrders().stream() .map(SortOrder::getSorted).collect(Collectors.toSet()); List<QuerySortOrder> combinedSortOrders = Stream .concat(query.getSortOrders().stream(), sortOrders.stream() .filter(order -> !sortedPropertyNames .contains(order.getSorted()))) .collect(Collectors.toList()); return new HierarchicalQuery<>(query.getOffset(), query.getLimit(), combinedSortOrders, query.getInMemorySorting(), query.getFilter().orElse(null), query.getParent()); }
/** * Gets the stream of direct children for given node. * * @param parent * the parent node * @return the stream of direct children */ private Stream<T> getDirectChildren(T parent) { return doFetchDirectChildren(parent, Range.between(0, getDataProvider() .getChildCount(new HierarchicalQuery<>(filter, parent)))); }
private void writeRow(Element container, T item, T parent, DesignContext context) { Element tableRow = container.appendElement("tr"); tableRow.attr("item", serializeDeclarativeRepresentation(item)); if (parent != null) { tableRow.attr("parent", serializeDeclarativeRepresentation(parent)); } if (getSelectionModel().isSelected(item)) { tableRow.attr("selected", true); } for (Column<T, ?> column : getColumns()) { Object value = column.getValueProvider().apply(item); tableRow.appendElement("td") .append(Optional.ofNullable(value).map(Object::toString) .map(DesignFormatter::encodeForTextNode) .orElse("")); } getDataProvider().fetch(new HierarchicalQuery<>(null, item)).forEach( childItem -> writeRow(container, childItem, item, context)); }
@Override public int size(Query<T, C> t) { if (t instanceof HierarchicalQuery<?, ?>) { return dataProvider.size(new HierarchicalQuery<>( t.getOffset(), t.getLimit(), t.getSortOrders(), t.getInMemorySorting(), getFilter(t), ((HierarchicalQuery<T, C>) t).getParent())); } throw new IllegalArgumentException( "Hierarchical data provider doesn't support non-hierarchical queries"); }
@Override public Stream<T> fetch(Query<T, C> t) { if (t instanceof HierarchicalQuery<?, ?>) { return dataProvider.fetch(new HierarchicalQuery<>( t.getOffset(), t.getLimit(), t.getSortOrders(), t.getInMemorySorting(), getFilter(t), ((HierarchicalQuery<T, C>) t).getParent())); } throw new IllegalArgumentException( "Hierarchical data provider doesn't support non-hierarchical queries"); } };
private void writeItem(Element design, DesignContext designContext, T item, T parent) { Element itemElement = design.appendElement("node"); itemElement.attr("item", serializeDeclarativeRepresentation(item)); if (parent != null) { itemElement.attr("parent", serializeDeclarativeRepresentation(parent)); } if (getSelectionModel().isSelected(item)) { itemElement.attr("selected", true); } Resource icon = getItemIconGenerator().apply(item); DesignAttributeHandler.writeAttribute("icon", itemElement.attributes(), icon, null, Resource.class, designContext); String text = getItemCaptionGenerator().apply(item); itemElement.html( Optional.ofNullable(text).map(Object::toString).orElse("")); getDataProvider().fetch(new HierarchicalQuery<>(null, item)).forEach( childItem -> writeItem(design, designContext, childItem, item)); }
/** * Generic method for finding direct children of a given parent, limited by * given range. * * @param parent * the parent * @param range * the range of direct children to return * @return the requested children of the given parent */ @SuppressWarnings({ "rawtypes", "unchecked" }) private Stream<T> doFetchDirectChildren(T parent, Range range) { return getDataProvider().fetchChildren(new HierarchicalQuery( range.getStart(), range.length(), getBackEndSorting(), getInMemorySorting(), getFilter(), parent)); }
new HierarchicalQuery<>(null, item)), depth - 1);
collapseRecursively( getDataProvider().fetchChildren( new HierarchicalQuery<>(null, item)), depth - 1);
protected Stream<T> getChildren(T item) { return fetchChildren(new HierarchicalQuery<>(null, item)); }
public Collection<T> getChildren(T item) { return getDataProvider() .fetchChildren(new HierarchicalQuery<>(null, item)) .collect(Collectors.toList()); }
@Override public Stream<T> fetchChildren(HierarchicalQuery<T, F> query) { return dataProvider.fetch(new HierarchicalQuery<>( query.getOffset(), query.getLimit(), query.getSortOrders(), query.getInMemorySorting(), getFilter(query), query.getParent())); }
@Override public int getChildCount(HierarchicalQuery<T, F> query) { return dataProvider().getChildCount(new HierarchicalQuery<>( query.getOffset(), query.getLimit(), query.getSortOrders(), query.getInMemorySorting(), getFilter(query), query.getParent())); }