Obrigado ao Thingol, Philip e Sérgio pelas respostas.
Sérgio, não seria exatamente um algorítmo de limpeza e sim de “montagem”. Obrigado por ter indicado o Pattern, vou dar uma olhada no Gamma et al.
Não creio que terei grupos sem nodos internos. Pode acontecer de um grupo conter apenas subgrupos. Mas eu teria que especifica-los de um caso ou de outro, inclusive numa montagem errada da IDL (Interface Defition Language).
Achei interessante as soluções, só não entendi a quebra de encapsulamento e do Pattern com a forma booleana. Neste último caso, até normal porque tenho pouco (ou nenhum) conhecimento sobre o Composite. Ontem estava lendo sobre o padrão Abastract Factory, no livro do Braude, e tive a sensação de que talvez resolvesse o meu problema. Mas como sempre tenho essa mania de ver nos meus projetos a aplicação do padrão que eu esteja lendo, pode ser que eu tenha me precipitado.
Segue abaixo o algoritmo completo do método. Ele é simples, se tiver cabra na lista de grupos e esse cabra for do nível atual ou maior, significa que ele precisa ser fechado. Existem “quedas” de varios niveis, por ex, do nivel 4 para o 1, assim, teria que fechar o 3, 2 e 1. Ainda não sei se funciona, vou escrever os testes hoje, fiz só o chinês. Isso é uma refatoração de um método HORRIVEL, mas que estava funcionando. Não ignorei a sua ajuda no outro tópico, apenas não implementei com Hash ainda, por isso está com List.
public static String transform(List<Node> nodeList){
if (nodeList.isEmpty()){
// Logar lista de nodes vazia
return null;
}
String retorno = "";
List<Node> openGroupNodes = new ArrayList<Node>();
for (int i=0; i < nodeList.size(); i++){
int lastGroup = openGroupNodes.size() -1;
// Se o nível do grupo >= nivel atual, ele precisa ser fechado
while ((openGroupNodes.size() > 0) &&
(openGroupNodes.get(lastGroup).getLevel() >= nodeList.get(i).getLevel())){
GroupNode groupNode = (GroupNode) openGroupNodes.get(lastGroup);
retorno += groupNode.getCloseTag();
openGroupNodes.remove(openGroupNodes.get(lastGroup));
lastGroup--;
}
retorno += nodeList.get(i).toXML();
if (nodeList.get(i) instanceof GroupNode){
openGroupNodes.add(nodeList.get(i));
}
}
return retorno;
}
Obrigado.
Abraços!