package br.com.citframework.security; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.StringTokenizer; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; public class AccessConfigReader { private static final Logger LOGGER = Logger.getLogger(AccessConfigReader.class); private static final String VIRGULA = ","; private static final List PUBLIC_ACCESS; static { List publicAccess = new ArrayList(1); publicAccess.add(Access.PUBLIC); PUBLIC_ACCESS = Collections.unmodifiableList(publicAccess); } public static HashMap read(InputStream xmlStream, boolean publicAccess) throws ParserConfigurationException, IOException, SAXException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); LOGGER.debug(">>>>>>Iniciando processamento do XML..."); Document document = builder.parse(xmlStream); LOGGER.debug(">>>>>>Parse ok!..."); HashMap resultMap = new HashMap(); LOGGER.debug(">>>>>>Processando mapeamentos..."); fillMap(resultMap, document, publicAccess); LOGGER.debug(">>>>>>Mapeamentos processados!..."); return resultMap; } private static void fillMap(HashMap accessMap, Document document, boolean publicAccess) { Node accessConfigNode = document.getChildNodes().item(0); for (int i = 0; i < accessConfigNode.getChildNodes().getLength(); i++) { Node accessNode = accessConfigNode.getChildNodes().item(i); if (accessNode.getNodeName().equals("#text")) continue; if (accessNode.getNodeName().equals("#comment")) continue; ArrayList transactions = new ArrayList(); for (int j = 0; j < accessNode.getChildNodes().getLength(); j++) { Node accessNodeItem = accessNode.getChildNodes().item(j); if (accessNodeItem.getNodeName().equals("#text")) continue; if (accessNodeItem.getNodeName().equals("#comment")) continue; if (accessNodeItem.getChildNodes().item(0) == null) continue; String path = accessNodeItem.getChildNodes().item(0).getNodeValue(); if (accessNodeItem.getNodeName().equalsIgnoreCase("path")) { Access access = new Access(); access.setPath(path); access.setAccessingTransactionList(transactions); accessMap.put(path, access); } else if (accessNodeItem.getNodeName().equalsIgnoreCase("accessing-transaction")) { if (publicAccess) { transactions.addAll(PUBLIC_ACCESS); } else { transactions.addAll(getAccessingTransactionList(path)); } } } } } private static ArrayList getAccessingTransactionList(String accessingTransaction) { StringTokenizer tokenizer = new StringTokenizer(StringUtils.trimToEmpty(accessingTransaction), VIRGULA); ArrayList results = new ArrayList(tokenizer.countTokens()); while (tokenizer.hasMoreTokens()) { String grupos = tokenizer.nextToken().toUpperCase(); LOGGER.debug("Grupo(s) de acesso metodo getAccessingTransactionList = " + grupos); results.add(grupos); } return results; } }