package br.com.citframework.menu;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import javax.servlet.ServletContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import br.com.citframework.util.Constantes;
public class MenuConfig {
private static final Logger LOGGER = Logger.getLogger(MenuConfig.class);
private static MenuConfig singleton;
private Document doc = null;
private Collection<MenuItem> menuItens;
public static MenuConfig getInstance(final ServletContext servletContext) throws Exception {
if (singleton == null) {
LOGGER.info("ServletContext: " + servletContext);
InputStream menuFile = servletContext.getResourceAsStream(Constantes.getValue("MENU_FILE_CFG"));
if (menuFile == null) {
menuFile = servletContext.getResourceAsStream("/WEB-INF/menu-config.xml");
}
LOGGER.info("MENU_FILE_CFG: " + menuFile);
singleton = new MenuConfig(menuFile);
}
return singleton;
}
public MenuConfig(final InputStream ioos) {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
final DocumentBuilder builder = factory.newDocumentBuilder();
if (ioos == null) {
throw new Exception("ARQUIVO: " + Constantes.getValue("MENU_FILE_CFG") + " NAO ENCONTRADO!!!!!!!!!");
}
doc = builder.parse(ioos);
this.load();
} catch (final Exception e) {
e.printStackTrace();
doc = null;
}
}
public void load() {
if (doc == null) {
return;
}
String description = "", path = "";
menuItens = new ArrayList<>();
MenuItem m;
final Node noRoot = doc.getChildNodes().item(0);
for (int j = 0; j < noRoot.getChildNodes().getLength(); j++) {
final Node noMenu = noRoot.getChildNodes().item(j);
if (noMenu.getNodeName().equals("#text")) {
continue;
}
final NamedNodeMap map = noMenu.getAttributes();
description = map.getNamedItem("description").getNodeValue();
path = map.getNamedItem("path").getNodeValue();
m = new MenuItem();
m.setDescription(description);
m.setPath(path);
m.setRootLevel(true);
m = this.getSubTree(m, noMenu);
menuItens.add(m);
}
}
public MenuItem getSubTree(MenuItem m, final Node noMenu) {
if (noMenu == null) {
return m;
}
String description = "", path = "";
MenuItem menuTemp;
for (int i = 0; i < noMenu.getChildNodes().getLength(); i++) {
final Node noMenuItem = noMenu.getChildNodes().item(i);
if (noMenuItem.getNodeName().equals("#text")) {
continue;
}
if (noMenuItem.getNodeName().equalsIgnoreCase("menu-itens")) {
m = this.getSubTree(m, noMenuItem);
} else if (noMenuItem.getNodeName().equalsIgnoreCase("item-menu")) {
final NamedNodeMap map = noMenuItem.getAttributes();
description = map.getNamedItem("description").getNodeValue();
path = map.getNamedItem("path").getNodeValue();
menuTemp = new MenuItem();
menuTemp.setDescription(description);
menuTemp.setPath(path);
if (m.getMenuItens() == null) {
m.setMenuItens(new ArrayList<MenuItem>());
}
m.getMenuItens().add(menuTemp);
menuTemp = this.getSubTree(menuTemp, noMenuItem);
}
}
return m;
}
public Collection<MenuItem> getMenuItens() {
return menuItens;
}
public void setMenuItens(final Collection<MenuItem> menuItens) {
this.menuItens = menuItens;
}
}