001package org.dllearner.kb.sparql; 002 003import org.dllearner.algorithms.qtl.datastructures.impl.GenericTree; 004 005import java.util.ArrayList; 006import java.util.Deque; 007import java.util.Map; 008 009/** 010 * @author Lorenz Buehmann 011 */ 012public class CBDStructureTree extends GenericTree<String, CBDStructureTree> { 013 014 private static final String ROOT_NODE = "root"; 015 private static final String IN_NODE = "in"; 016 private static final String OUT_NODE = "out"; 017 018 public CBDStructureTree() { 019 super(ROOT_NODE); 020 } 021 022 public CBDStructureTree(String data) { 023 super(data); 024 } 025 026 public boolean isInNode() { 027 return data.equals(IN_NODE); 028 } 029 030 public boolean isOutNode() { 031 return data.equals(OUT_NODE); 032 } 033 034 public CBDStructureTree addInNode() { 035 CBDStructureTree child = new CBDStructureTree(IN_NODE); 036 addChild(child); 037 return child; 038 } 039 040 public CBDStructureTree addOutNode() { 041 CBDStructureTree child = new CBDStructureTree(OUT_NODE); 042 addChild(child); 043 return child; 044 } 045 046 public boolean hasOutChild() { 047 return children.stream().anyMatch(CBDStructureTree::isOutNode); 048 } 049 050 public boolean hasInChild() { 051 return children.stream().anyMatch(CBDStructureTree::isInNode); 052 } 053 054 public static CBDStructureTree fromTreeString(String treeString) { 055 treeString = treeString.replace(":", ""); 056 057 int i = treeString.indexOf("["); 058 String token = treeString.substring(0, i); 059 CBDStructureTree tree = new CBDStructureTree(token); 060 parseString(treeString.substring(i + 1, treeString.length() - 1), tree); 061 return tree; 062 } 063 064 private static int parseString(String input, CBDStructureTree parent) { 065 StringBuilder currentString = new StringBuilder(); 066 int index = 0; 067 CBDStructureTree child = null; 068 while(index < input.length()) { 069 char c = input.charAt(index); 070 071 if(c == ' ') { // ignore spaces 072 index++; 073 continue; 074 } 075 076 if(c == ',') { // end of menu entry, add to the list 077 if(!currentString.toString().isEmpty()) { 078 child = new CBDStructureTree(currentString.toString()); 079 if(parent != null) 080 parent.addChild(child); 081 } 082 currentString.delete(0, currentString.length()); 083 index++; 084 continue; 085 } 086 087 if(c == ']') { // end of sublist, return 088 return index + 1; 089 } 090 091 if(c == '[') { // start of sublist, recursive call 092 if(!currentString.toString().isEmpty()) { 093 child = new CBDStructureTree(currentString.toString()); 094 if(parent != null) 095 parent.addChild(child); 096 } 097 currentString.delete(0, currentString.length()); 098 099 int temp = parseString(input.substring(index + 1), child); 100 index += temp; 101 index++; 102 continue; 103 } 104 105 currentString.append(c); 106 index++; 107 } 108 return 0; 109 } 110 111 public static void main(String[] args) { 112 CBDStructureTree tree = new CBDStructureTree(); 113 tree.addInNode().addInNode(); 114 System.out.println(tree.toStringVerbose()); 115 fromTreeString("root:[in:[in:[]],out:[in:[]]]"); 116 } 117}