package net.techreadiness.ui.tags.navigation; import java.util.Iterator; import java.util.Set; import javax.servlet.http.HttpServletRequest; import net.techreadiness.navigation.Group; import net.techreadiness.navigation.SubTab; import net.techreadiness.navigation.Tab; import net.techreadiness.service.ServiceContext; import net.techreadiness.service.UserService; import net.techreadiness.ui.BaseAction; import net.techreadiness.ui.tags.BaseTag; import net.techreadiness.ui.util.ContextUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Iterators; import com.google.common.collect.Sets; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.inject.Container; public class NavigationBarTag extends BaseTag { private Tab selectedMainTab; private SubTab selectedSubTab; private Set<Tab> tabs; @Override public String execute() throws Exception { ActionContext actionContext = ActionContext.getContext(); Container strutsContainer = actionContext.getContainer(); tabs = Sets.newTreeSet(); UserService userService = ContextUtils.getRequiredBeanOfType(UserService.class); Set<String> names = strutsContainer.getInstanceNames(Tab.class); for (String name : names) { Tab tab = strutsContainer.getInstance(Tab.class, name).clone(); // only display a tab if it has children if (tab.isDisplayIfEmpty() || !tab.isEmpty()) { tabs.add(tab); } } Iterator<Tab> tabIterator = tabs.iterator(); for (Tab tab : tabs) { for (Group group : tab.getGroups()) { tabIterator = Iterators.concat(tabIterator, group.getChildren().iterator()); } } HttpServletRequest request = (HttpServletRequest) getPageContext().getRequest(); String servletPath = request.getServletPath(); int bestMatch = -1; boolean exact = false; while (tabIterator.hasNext()) { Tab tab = tabIterator.next(); if (ArrayUtils.isEmpty(tab.getPermissionCodes()) || userService.hasPermission( (ServiceContext) actionContext.getSession().get(BaseAction.SERVICE_CONTEXT), tab.getPermissionCodes())) { String tabPath = tab.getNamespace() + tab.getDefaultAction(); int diff = StringUtils.indexOfDifference(tabPath, servletPath); if (diff > bestMatch && !exact) { bestMatch = diff; selectTab(tab); } else if (diff == -1) { selectTab(tab); exact = true; } } else { tabIterator.remove(); } } return "/navigation/bar.jsp"; } private void selectTab(Tab tab) { if (tab instanceof SubTab) { SubTab subTab = (SubTab) tab; selectedSubTab = subTab; selectedMainTab = subTab.getGroup().getParent(); } else { selectedMainTab = tab; } } public Tab getSelectedMainTab() { return selectedMainTab; } public void setSelectedMainTab(Tab selectedMainTab) { this.selectedMainTab = selectedMainTab; } public SubTab getSelectedSubTab() { return selectedSubTab; } public void setSelectedSubTab(SubTab selectedSubTab) { this.selectedSubTab = selectedSubTab; } public Set<Tab> getMainTabs() { return tabs; } }