package org.molgenis.ui.menu; import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.molgenis.ui.MolgenisUiMenu; import org.molgenis.ui.MolgenisUiMenuItem; import java.util.*; public class MenuItemToMolgenisUiMenuAdapter extends MenuItemToMolgenisUiMenuItemAdapter implements MolgenisUiMenu { private final MenuItem menu; private final MenuItem rootMenu; public MenuItemToMolgenisUiMenuAdapter(MenuItem menu, MenuItem rootMenu) { super(menu); if (menu == null) throw new IllegalArgumentException("menu is null"); if (rootMenu == null) throw new IllegalArgumentException("rootMenu is null"); this.menu = menu; this.rootMenu = rootMenu; } @Override public List<MolgenisUiMenuItem> getItems() { List<MenuItem> items = menu.getItems(); return items != null ? Lists .newArrayList(Iterables.transform(items, new Function<MenuItem, MolgenisUiMenuItem>() { @Override public MolgenisUiMenuItem apply(MenuItem menuItem) { if (menuItem.getType() == MenuItemType.PLUGIN) return new MenuItemToMolgenisUiMenuItemAdapter(menuItem); else return new MenuItemToMolgenisUiMenuAdapter(menuItem, rootMenu); } })) : Collections.<MolgenisUiMenuItem>emptyList(); } @Override public boolean containsItem(String itemId) { List<MenuItem> items = menu.getItems(); if (items != null) { for (MenuItem submenuItem : items) { if (submenuItem.getId().equals(itemId)) return true; } } return false; } @Override public MolgenisUiMenuItem getActiveItem() { List<MenuItem> items = menu.getItems(); if (items != null) { for (MenuItem submenuItem : items) { return new MenuItemToMolgenisUiMenuItemAdapter(submenuItem); } } return null; } @Override public List<MolgenisUiMenu> getBreadcrumb() { if (menu.equals(rootMenu)) return Collections.<MolgenisUiMenu>singletonList(this); Map<String, MenuItem> menuParentMap = new HashMap<String, MenuItem>(); createMenuParentMapRec(rootMenu, null, menu, menuParentMap); List<MolgenisUiMenu> breadcrumb = new ArrayList<MolgenisUiMenu>(); MenuItem currentMenu = menu; while (currentMenu != null) { breadcrumb.add(new MenuItemToMolgenisUiMenuAdapter(currentMenu, rootMenu)); currentMenu = menuParentMap.get(currentMenu.getId()); } return Lists.reverse(breadcrumb); } private void createMenuParentMapRec(MenuItem menu, MenuItem parentMenu, MenuItem stopMenu, Map<String, MenuItem> breadcrumbMap) { breadcrumbMap.put(menu.getId(), parentMenu); if (menu.getId().equals(stopMenu.getId())) return; for (MenuItem menuItem : menu.getItems()) { if (menuItem.getType() == MenuItemType.MENU) { createMenuParentMapRec(menuItem, menu, stopMenu, breadcrumbMap); } } } }