É uma ajuda mais na questão de lógica que qqr outra coisa.
Trenho um objeto que me forne todos os itens de uma tree, e eu posso verificar se tem filhos, se é a folha, etc, etc…
E eu preciso ler todos estes itens e montar um json com o seguinte formado:
{
text:'ItemDaTree',
checked: 'true',
children:[
{
text:'FilhoItemTree1',
leaf: 'true'
},{
text:'FilhoItemTree2',
children:[
{
text:'FilhoItemTree11',
leaf: 'true'
},{
text:'FilhoItemTree22',
children:[
{
text:'FilhoItemTree11',
leaf: 'true'
},{
text:'FilhoItemTree22',
leaf: 'true'
}
]
}
]
}
]
}
Eu tenho um código que faz uma boa parte do trabalho, mas ele não é 100% eficiente pois ele vai até apenas o 3º nível e eu quero fazer algo que faça isso de uma maneira elegante e automática onde com o uso de alguns loops e uma boa lógica ele vá expandindo os níveis até o fim e verificando as regras para montar o json: isLeaf() , hasChildrenNodes(), etc…
Aqui em cima eu representei o json com apenas 3 níves, mas ele pode ter vários, muitos mesmo!
Amanhã vou postar um código que eu tenho, pois não está aqui neste pc.
AGuradeço desde já a atenção e ajuda de todos.
Com disse ontem, vou postar o código que eu tenho, o problema está no método: getAllLevelsChildsToExtjs() e está definido o local no código…
public String genTreeChilrenToExtjs(){
StringBuilder sb = new StringBuilder();
Object[] childs;
Object roots[] = model.getRoots();
sb.append("children:[");
for (int i = 0; i < roots.length; i++) {
MondrianMember nodeMB = (MondrianMember) roots[i];
sb.append("{id: '").append(getIDNodeElementExtjs(roots[i])).append("',text:'")
.append(nodeMB.getMonMember().getName()).append("',")
.append("checked:"+getCheckedToExtjs(roots[i])+",");
if(model.hasChildren(nodeMB)){
sb.append("children:[");
childs = model.getChildren(nodeMB);
for(Object ch : childs){
sb.append(getAllLevelsChildsToExtjs(ch));
}
sb.append("]}");
}else{
sb.append("leaf: true}");
}
}
sb.append("]");
sb.deleteCharAt(sb.lastIndexOf(","));
return sb.toString();
}
public boolean getCheckedToExtjs(Object n){
Element nodeElem = renderNode(null, n, 0);
if(nodeElem.getFirstChild().getAttributes().getNamedItem("selected") != null &&
!nodeElem.getFirstChild().getAttributes().getNamedItem("selected").equals("") &&
nodeElem.getFirstChild().getAttributes().getNamedItem("selected").toString().contains("true")
){
return true;
}else{
return false;
}
}
public String getIDNodeElementExtjs(Object n){
Element nodeElem = renderNode(null, n, 0);
return nodeElem.getAttribute("id");
}
public String getAllLevelsChildsToExtjs(Object n){
StringBuilder sb = new StringBuilder();
MondrianMember node = (MondrianMember) n;
sb.append("{id:'").append(getIDNodeElementExtjs(n)).append("', text:'")
.append(node.getMonMember().getName()).append("',")
.append("checked: ").append(getCheckedToExtjs(n)+",");
if(model.hasChildren(node)){
Object childs[] = model.getChildren(node);
if(childs.length != 0){
sb.append("children:[");
for(Object ch : childs){
sb.append("{id: '").append(getIDNodeElementExtjs(ch)).append("', text:'")
.append(((MondrianMember)ch).getMonMember().getName()).append("',")
.append("checked: "+getCheckedToExtjs(ch)+",");
if(model.hasChildren(ch)){
while(model.hasChildren(ch)){
// CAGADA DETECTED !!
// e se sempre tiverem mais e mais filhos?
}
}else{
sb.append("leaf: true");
}
sb.append("}");
}
sb.append("]");
}else{
sb.append("leaf: 'true'");
}
}else{
sb.append("leaf: 'true'");
}
sb.append("},");
return sb.toString();
}