package org.dcache.webadmin.view.panels.navigation;
import com.google.common.collect.ImmutableList;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.List;
import org.dcache.webadmin.view.beans.WebAdminInterfaceSession;
import org.dcache.webadmin.view.pages.AuthenticatedWebPage;
import org.dcache.webadmin.view.pages.activetransfers.ActiveTransfersPage;
import org.dcache.webadmin.view.pages.alarms.AlarmsPage;
import org.dcache.webadmin.view.pages.basepage.BasePage;
import org.dcache.webadmin.view.pages.billingplots.BillingPlots;
import org.dcache.webadmin.view.pages.celladmin.CellAdmin;
import org.dcache.webadmin.view.pages.cellservices.CellServices;
import org.dcache.webadmin.view.pages.dcacheservices.DCacheServices;
import org.dcache.webadmin.view.pages.pooladmin.PoolAdmin;
import org.dcache.webadmin.view.pages.poolgroupview.PoolGroupView;
import org.dcache.webadmin.view.pages.poollist.PoolList;
import org.dcache.webadmin.view.pages.poolqueues.PoolQueuePlots;
import org.dcache.webadmin.view.pages.poolqueues.PoolQueues;
import org.dcache.webadmin.view.pages.poolselectionsetup.PoolSelectionSetup;
import org.dcache.webadmin.view.pages.spacetokens.SpaceTokens;
import org.dcache.webadmin.view.pages.tapetransferqueue.TapeTransferQueue;
import org.dcache.webadmin.view.panels.basepanel.BasePanel;
import org.dcache.webadmin.view.util.Role;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* reusable navigation-panel. Each new link needs to be added to the buildLinks
* method and a new Property in the BasicNavigationPanel.properties with the
* correct index behind it (see in the File for the previous ones as examples)
*
* @author jans
*/
public class BasicNavigationPanel extends BasePanel {
private static final long serialVersionUID = 4803403315602047391L;
private static final Logger _log = LoggerFactory.getLogger(BasicNavigationPanel.class);
private static final ImmutableList<NavLink> NAVLINKS = navListBuilder().
add(NavLink.builder().to(DCacheServices.class).withId("home")).
add(NavLink.builder().to(CellServices.class).withId("cells")).
add(NavLink.builder().to(PoolList.class).withId("pools")).
add(NavLink.builder().to(PoolQueues.class).withId("poolqueues")).
add(NavLink.builder().to(PoolQueuePlots.class).withId("poolqueueplots")).
add(NavLink.builder().to(PoolGroupView.class).withId("poolgroup")).
add(NavLink.builder().to(TapeTransferQueue.class).withId("tapetransfers")).
add(NavLink.builder().to(ActiveTransfersPage.class).withId("activetransfers")).
add(NavLink.builder().to(BillingPlots.class).withId("billing")).
add(NavLink.builder().to(PoolSelectionSetup.class).withId("poolselection")).
add(NavLink.builder().to(PoolAdmin.class).withId("pooladmin")).
add(NavLink.builder().to(CellAdmin.class).withId("celladmin")).
add(NavLink.builder().to(SpaceTokens.class).withId("space")).
add(NavLink.builder().to(AlarmsPage.class).withId("alarms")).
build();
private static String billingDisableHint;
private static String poolQueuePlotsDisableHint;
/**
* Information about each navigational link.
*/
public static class NavLink implements Serializable
{
private static final long serialVersionUID = 1L;
private String _id;
private Class<? extends BasePage> _page;
public static NavLink.Builder builder()
{
return new NavLink.Builder();
}
public String getId()
{
return _id;
}
public Class<? extends BasePage> getPage()
{
return _page;
}
public boolean isAdminPage()
{
return AuthenticatedWebPage.class.isAssignableFrom(_page);
}
public StringResourceModel getLinkText(Component component)
{
return new StringResourceModel(_id + ".text", component,
null);
}
public boolean isLinkTo(Class page)
{
return _page.equals(page);
}
public static class Builder
{
private final NavLink link = new NavLink();
public NavLink.Builder withId(String id)
{
link._id = id;
return this;
}
public NavLink.Builder to(Class<? extends BasePage> page)
{
link._page = page;
return this;
}
public NavLink build()
{
return link;
}
}
}
public static NavListBuilder navListBuilder()
{
return new NavListBuilder();
}
public static class NavListBuilder
{
private final ImmutableList.Builder<NavLink> _builder = ImmutableList.builder();
public ImmutableList<NavLink> build()
{
return _builder.build();
}
public NavListBuilder add(NavLink.Builder navLink)
{
_builder.add(navLink.build());
return this;
}
}
public BasicNavigationPanel(String id, Class currentPage)
{
super(id);
_log.debug(currentPage.getSimpleName());
add(new LinkListView("linkList", NAVLINKS, currentPage));
}
private class LinkListView extends ListView<NavLink>
{
private static final long serialVersionUID = 4665791178375173441L;
private final Class _currentPage;
public LinkListView(String id, List<NavLink> items, Class currentPage)
{
super(id, items);
_currentPage = currentPage;
}
@Override
protected void populateItem(ListItem<NavLink> item)
{
NavLink navLink = item.getModelObject();
Link link = new BookmarkablePageLink("link", navLink.getPage());
link.add(new AttributeModifier("id", "nav." + navLink.getId()));
link.add(new Label("text", navLink.getLinkText(BasicNavigationPanel.this)));
Label disabled = new Label("disabled");
disabled.setVisible(false);
if (navLink.isLinkTo(BillingPlots.class) && billingDisableHint != null) {
item.add(new AttributeModifier("title", billingDisableHint));
item.add(appendCssClass("disabled"));
disabled = new Label("disabled", navLink.getLinkText(BasicNavigationPanel.this));
link.setVisible(false);
}
if (navLink.isLinkTo(PoolQueuePlots.class) && poolQueuePlotsDisableHint != null) {
item.add(new AttributeModifier("title", poolQueuePlotsDisableHint));
item.add(appendCssClass("disabled"));
disabled = new Label("disabled", navLink.getLinkText(BasicNavigationPanel.this));
link.setVisible(false);
}
if (navLink.isAdminPage() && !WebAdminInterfaceSession.hasUserRole(Role.ADMIN)) {
item.add(new AttributeModifier("title", getStringResource("tooltip.AdminOnly")));
item.add(appendCssClass("unauthorized"));
}
if (navLink.isLinkTo(_currentPage)) {
item.add(appendCssClass("active"));
}
item.add(link);
item.add(disabled);
}
}
private static AttributeAppender appendCssClass(String value)
{
return new AttributeAppender("class", Model.of(value)).setSeparator(" ");
}
public static void removeBillingPage(String hint)
{
billingDisableHint = checkNotNull(hint);
}
public static void removePoolQueuePlotsPage(String hint)
{
poolQueuePlotsDisableHint = checkNotNull(hint);
}
}