/** * Copyright 2014-2017 Dario D'Urzo * * This file is part of BootsFaces. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.bootsfaces.component.tree.model; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.bootsfaces.utils.BsfUtils; /** * Utility class that transform a Tree Model to relative JSON structure * * @author durzod * */ public class TreeModelUtils { /** * Debug method to print tree node structure * * @param rootNode * @param tab */ public static void printNodeData(Node rootNode, String tab) { tab = tab == null ? "" : tab + " "; for (Node n : rootNode.getChilds()) { printNodeData(n, tab); } } /** * Basic implementation of recursive node search by id It works only on a * DefaultNodeImpl * * @param rootNode * @param nodeId * @return Node instance or null if there is no node with specific id */ public static Node searchNodeById(Node rootNode, int nodeId) { if (rootNode.getNodeId() == nodeId) { return rootNode; } Node foundNode = null; for (Node n : rootNode.getChilds()) { foundNode = searchNodeById(n, nodeId); if (foundNode != null) { break; } } return foundNode; } /** * Render the node model as JSON * * @param rootNode * @param renderRoot * @return */ public static String renderModelAsJson(Node rootNode, boolean renderRoot) { if (renderRoot) { return renderSubnodes(rootNode == null ? new ArrayList<Node>() : new ArrayList<Node>(Arrays.asList(rootNode))); } else if (rootNode != null && rootNode.hasChild()) { return renderSubnodes(rootNode.getChilds()); } return ""; } private static String renderNode(Node node) { StringBuilder sb = new StringBuilder(); sb.append("{"); // NODE ID if (node.getNodeId() != -1) { // i have to map the generated node id to an internal value that is not related to the original structure sb.append("\"nodeInternalId\": "); sb.append(node.getNodeId()); sb.append(", "); } // TEXT if (BsfUtils.isStringValued(node.getText())) { sb.append("\"text\": \""); sb.append(node.getText()); sb.append("\", "); } // ICON if (BsfUtils.isStringValued(node.getIcon())) { sb.append("\"icon\": \""); sb.append(node.getIcon()); sb.append("\", "); } // SELECTED ICON if (BsfUtils.isStringValued(node.getSelectedIcon())) { sb.append("\"selectedIcon\": \""); sb.append(node.getSelectedIcon()); sb.append("\", "); } // COLOR if (BsfUtils.isStringValued(node.getColor())) { sb.append("\"color\": \""); sb.append(node.getColor()); sb.append("\", "); } // BACK COLOR if (BsfUtils.isStringValued(node.getBackColor())) { sb.append("\"backColor\": \""); sb.append(node.getBackColor()); sb.append("\", "); } // HREF if (BsfUtils.isStringValued(node.getHRef())) { sb.append("\"href\": \""); sb.append(node.getHRef()); sb.append("\", "); } // DATA if (BsfUtils.isStringValued(node.getData())) { sb.append("\"data\": \""); sb.append(node.getData()); sb.append("\", "); } // TAGS if (node.getTags() != null && node.getTags().size() > 0) { sb.append("\"tags\": ["); for (String tag : node.getTags()) { sb.append("\""); sb.append(tag); sb.append("\","); } sb.append("\"\"],"); } // NODES: if (node.getChilds() != null && node.getChilds().size() > 0) { sb.append("\"nodes\": "); sb.append(renderSubnodes(node.getChilds())); sb.append(","); } sb.append("\"selectable\": "); sb.append(node.isSelectable()); sb.append(", "); sb.append("\"state\": {"); sb.append("\"checked\": "); sb.append(node.isChecked()); sb.append(", "); sb.append("\"disabled\": "); sb.append(node.isDisabled()); sb.append(", "); sb.append("\"expanded\": "); sb.append(node.isExpanded()); sb.append(", "); sb.append("\"selected\": "); sb.append(node.isSelected()); sb.append(" }}"); return sb.toString(); } private static String renderSubnodes(List<Node> nodeList) { StringBuilder sb = new StringBuilder(); sb.append("["); int idx = 0; for (Node n : nodeList) { if (idx > 0) { sb.append(","); } idx++; sb.append(renderNode(n)); } sb.append("]"); return sb.toString(); } }