package net.pechorina.kontempl.data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class PageTree extends GenericTree<Page> {
static final Logger logger = LoggerFactory.getLogger(PageTree.class);
public void updateItemsCounters(Map<Long, Integer> pageItems) {
this.getChildren().stream().filter(GenericTreeNode::hasChildren).forEach(rootPage -> {
int itemsInSubcategories = getItemsInSubcategories(rootPage);
rootPage.setItems(itemsInSubcategories);
});
}
public int getItemsInSubcategories(GenericTreeNode<Page> page) {
int items = 0;
for (GenericTreeNode<Page> p : page.getChildren() ) {
if (p.hasChildren()) {
int n = getItemsInSubcategories(p);
p.setItems(n);
items += n;
}
else {
items += p.getItems();
}
}
return items;
}
public GenericTreeNode<Page> findPageNode(String name) {
GenericTreeNode<Page> n = new GenericTreeNode<>();
List<GenericTreeNode<Page>> children = this.listAllChildren();
// logger.debug("Found " + children.size() + " children. Treesize: " + this.getNumberOfNodes());
for (GenericTreeNode<Page> node : children) {
// logger.debug("Category:" + node.getData().getCid() + " / " + node.getData().getName());
if (node.getData().getName().equalsIgnoreCase(name)) {
n = node;
// logger.debug("Node found");
break;
}
}
return n;
}
public GenericTreeNode<Page> findPageNode(Integer id) {
GenericTreeNode<Page> n = new GenericTreeNode<>();
List<GenericTreeNode<Page>> children = this.listAllChildren();
// logger.debug("Found " + children.size() + " children. Treesize: " + this.getNumberOfNodes());
for (GenericTreeNode<Page> node : children) {
if (node.getData().getId().equals(id)) {
n = node;
break;
}
}
return n;
}
public List<Page> traceCategoryParents(String name) {
GenericTreeNode<Page> n = findPageNode(name);
List<Page> l = new ArrayList<>();
if (n != null) {
List<GenericTreeNode<Page>> pageNodes = n.traceParents();
for (int i = (pageNodes.size() - 1); i >= 0; i--) {
GenericTreeNode<Page> pn = pageNodes.get(i);
l.add(pn.getData());
}
}
return l;
}
public boolean isTheSameBranch(Integer pageId, Integer targetPageId) {
// logger.debug("catCid:" + catCid + " targetCid: " + targetCid);
if (pageId.equals(targetPageId)) {
return true;
}
GenericTreeNode<Page> n = findPageNode(pageId);
if (n != null) {
List<GenericTreeNode<Page>> pageNodes = n.traceParents();
for (int i = (pageNodes.size() - 1); i >= 0; i--) {
GenericTreeNode<Page> pn = pageNodes.get(i);
if (pn.getData().getId().equals(targetPageId) ) {
return true;
}
}
}
return false;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("PageTree []");
String padding = "---- ";
if (this.hasChildren()) {
List<GenericTreeNode<Page>> children = this.getChildren();
for(GenericTreeNode<Page> n: children) {
builder.append(padding);
builder.append(n.getData().getId());
builder.append("/");
builder.append(n.getData().getName());
if (n.getParent() != null) {
builder.append(" [parent:").append(n.getParent().getData().getId()).append("]");
}
builder.append("\n");
auxPrintBranch(n, builder, padding);
}
}
return builder.toString();
}
private void auxPrintBranch(GenericTreeNode<Page> parent, StringBuilder builder, String margin) {
String padding = " ";
if (parent.hasChildren()) {
for(GenericTreeNode<Page> n: parent.getChildren()) {
builder.append(margin);
builder.append(padding);
builder.append(n.getData().getId());
builder.append("/");
builder.append(n.getData().getName());
if (n.getParent() != null) {
builder.append(" [parent:").append(n.getParent().getData().getId()).append("]");
}
builder.append("\n");
auxPrintBranch(n, builder, margin + padding);
}
}
}
}