package org.molgenis.ui.security; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.molgenis.security.core.MolgenisPermissionService; import org.molgenis.security.core.Permission; import org.molgenis.ui.MolgenisUiMenu; import org.molgenis.ui.MolgenisUiMenuItem; import org.molgenis.ui.MolgenisUiMenuItemType; import java.util.List; public class MolgenisUiMenuPermissionDecorator implements MolgenisUiMenu { private final MolgenisUiMenu molgenisUiMenu; private final MolgenisPermissionService molgenisPermissionService; public MolgenisUiMenuPermissionDecorator(MolgenisUiMenu molgenisUiMenu, MolgenisPermissionService molgenisPermissionService) { if (molgenisUiMenu == null) throw new IllegalArgumentException("menu is null"); if (molgenisPermissionService == null) throw new IllegalArgumentException("molgenisPermissionService is null"); this.molgenisUiMenu = molgenisUiMenu; this.molgenisPermissionService = molgenisPermissionService; } @Override public String getId() { return molgenisUiMenu.getId(); } @Override public String getName() { return molgenisUiMenu.getName(); } @Override public String getUrl() { return molgenisUiMenu.getUrl(); } @Override public MolgenisUiMenuItemType getType() { return molgenisUiMenu.getType(); } @Override public MolgenisUiMenu getParentMenu() { return molgenisUiMenu.getParentMenu(); } @Override public boolean isAuthorized() { throw new UnsupportedOperationException(); } @Override public List<MolgenisUiMenuItem> getItems() { return Lists.newArrayList(Iterables.filter(Iterables .transform(molgenisUiMenu.getItems(), new Function<MolgenisUiMenuItem, MolgenisUiMenuItem>() { @Override public MolgenisUiMenuItem apply(MolgenisUiMenuItem molgenisUiMenuItem) { switch (molgenisUiMenuItem.getType()) { case MENU: return new MolgenisUiMenuPermissionDecorator((MolgenisUiMenu) molgenisUiMenuItem, molgenisPermissionService); case PLUGIN: return molgenisUiMenuItem; default: throw new RuntimeException( "Unknown MolgenisUiMenuItem [" + molgenisUiMenuItem.getType() + "]"); } } }), new Predicate<MolgenisUiMenuItem>() { @Override public boolean apply(MolgenisUiMenuItem molgenisUiMenuItem) { return hasPermission(molgenisUiMenuItem); } })); } @Override public boolean containsItem(final String itemId) { return Iterables.any(molgenisUiMenu.getItems(), new Predicate<MolgenisUiMenuItem>() { @Override public boolean apply(MolgenisUiMenuItem molgenisUiMenuItem) { return molgenisUiMenuItem.getId().equals(itemId) && hasPermission(molgenisUiMenuItem); } }); } @Override public MolgenisUiMenuItem getActiveItem() { return Iterables.find(molgenisUiMenu.getItems(), new Predicate<MolgenisUiMenuItem>() { @Override public boolean apply(MolgenisUiMenuItem molgenisUiMenuItem) { return molgenisUiMenuItem.getType() != MolgenisUiMenuItemType.MENU && hasPermission(molgenisUiMenuItem); } }, null); } @Override public List<MolgenisUiMenu> getBreadcrumb() { return molgenisUiMenu.getBreadcrumb(); } private boolean hasPermission(MolgenisUiMenuItem molgenisUiMenuItem) { boolean hasPermission; switch (molgenisUiMenuItem.getType()) { case MENU: hasPermission = !((MolgenisUiMenu) molgenisUiMenuItem).getItems().isEmpty(); break; case PLUGIN: String menuItemId = molgenisUiMenuItem.getId(); hasPermission = molgenisPermissionService.hasPermissionOnPlugin(menuItemId, Permission.READ); break; default: throw new RuntimeException("Unknown MolgenisUiMenuItem [" + molgenisUiMenuItem.getType() + "]"); } return hasPermission; } }