package br.com.citframework.tld; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import br.com.citframework.dto.Usuario; import br.com.citframework.menu.IRenderMenu; import br.com.citframework.menu.MenuConfig; import br.com.citframework.menu.MenuItem; import br.com.citframework.security.Access; import br.com.citframework.security.AccessConfig; import br.com.citframework.util.Constantes; public class Menu extends BodyTagSupport { private static final Logger LOGGER = Logger.getLogger(Menu.class); private static final String FORWARD_SLASH = "/"; private static final long serialVersionUID = -3103179786470352866L; @Override public int doStartTag() throws JspException { MenuConfig menuConfig = null; try { menuConfig = MenuConfig.getInstance(pageContext.getServletContext()); } catch (final Exception e) { LOGGER.error(e.getMessage(), e); throw new JspException(e); } if (menuConfig == null) { throw new JspException("MenuConfig Esta Nulo !!!!!!!!!! Verificar!!!!!!!!!"); } final Collection<MenuItem> colMenus = menuConfig.getMenuItens(); final Usuario usuario = (Usuario) pageContext.getSession().getAttribute(Constantes.getValue("USUARIO_SESSAO")); LOGGER.debug("Usuario visualizando o menu\r\n" + usuario); if (colMenus != null) { LOGGER.debug("Quantidade de itens na raiz do menu antes da filtragem: " + colMenus.size()); } if (colMenus != null) { LOGGER.debug("Quantidade de itens na raiz do menu depois da filtragem: " + colMenus.size()); } if (colMenus != null) { try { String str = StringUtils.EMPTY; try { final String classeMenu = Constantes.getValue("CLASSE_MENU"); if (classeMenu == null) { LOGGER.debug("CLASSE_MENU: NAO DEFINIDO NO ARQUIVO DE CONSTANTES.PROPERTIES!"); LOGGER.debug("CLASSE_MENU: NAO DEFINIDO NO ARQUIVO DE CONSTANTES.PROPERTIES!"); } else { final Class<?> classMenu = Class.forName(classeMenu); if (classMenu == null) { LOGGER.debug("CLASSE_MENU: CLASSE INEXISTENTE!"); LOGGER.debug("CLASSE_MENU: CLASSE INEXISTENTE!"); } else { final Object objMenuObj = classMenu.newInstance(); final IRenderMenu objRenderMenu = (IRenderMenu) objMenuObj; str = objRenderMenu.render(colMenus, ((HttpServletRequest) pageContext.getRequest()).getContextPath(), (HttpServletRequest) pageContext.getRequest(), (HttpServletResponse) pageContext.getResponse()); } } } catch (final Exception e) { LOGGER.error(e.getMessage(), e); throw new JspException(e); } pageContext.getOut().print(str); } catch (final IOException e) { LOGGER.error(e.getMessage(), e); throw new JspException(e); } } return SKIP_BODY; } public List<MenuItem> filtrarMenuUsuario(final Collection<MenuItem> menuItemCollection, final Usuario usuario) { if (menuItemCollection == null || menuItemCollection.size() == 0 || usuario == null) { return new ArrayList<>(); } final List<MenuItem> itemList = new ArrayList<>(); for (final MenuItem item : menuItemCollection) { String path = item.getPath(); // if 'path' is blank, item is top level for some itens if (StringUtils.isBlank(path)) { Collection<MenuItem> menuItens = item.getMenuItens(); if (menuItens != null && menuItens.size() != 0) { menuItens = this.filtrarMenuUsuario(menuItens, usuario); if (menuItens != null && menuItens.size() != 0) { item.setMenuItens(menuItens); itemList.add(item); } } } else { path = FORWARD_SLASH + path; final Access access = AccessConfig.getAccess(path); if (access == null) { LOGGER.debug("NO mapping for path: " + path); } else { final String acessosUsuario = usuario.getAcessos(); if (access.hasAccess(acessosUsuario)) { LOGGER.debug("User '" + usuario.getIdUsuario() + "' has access to: " + path); itemList.add(item); } else { LOGGER.debug("User '" + usuario.getIdUsuario() + "' has NO access to: " + path); } } } } return itemList; } }