/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.server.webapp.pages;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.CssReferenceHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.util.string.StringValue;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import de.agilecoders.wicket.core.Bootstrap;
import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.BootstrapBaseBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.DropDownButton;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.MenuBookmarkablePageLink;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.MenuDivider;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.MenuHeader;
import de.agilecoders.wicket.core.markup.html.bootstrap.html.ChromeFrameMetaTag;
import de.agilecoders.wicket.core.markup.html.bootstrap.html.HtmlTag;
import de.agilecoders.wicket.core.markup.html.bootstrap.html.OptimizedMobileViewportMetaTag;
import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar.ComponentPosition;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar.Position;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarButton;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarComponents;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarDropDownButton;
import de.agilecoders.wicket.core.settings.IBootstrapSettings;
import de.agilecoders.wicket.core.settings.ITheme;
import de.agilecoders.wicket.less.LessResourceReference;
import eu.esdihumboldt.hale.server.security.UserConstants;
import eu.esdihumboldt.hale.server.webapp.BaseWebApplication;
import eu.esdihumboldt.hale.server.webapp.components.SimpleBreadcrumbPanel;
import eu.esdihumboldt.hale.server.webapp.components.bootstrap.NavbarExternalLink;
import eu.esdihumboldt.hale.server.webapp.util.PageDescription;
import eu.esdihumboldt.hale.server.webapp.util.UserUtil;
/**
* The base page for all web applications. It contains definitions for all
* pages' header and footer.
*
* @author Michel Kraemer
* @author Simon Templer
*/
public abstract class BasePage extends WebPage {
private static final long serialVersionUID = 8363436886319254849L;
private Navbar navbar;
/**
* Default constructor
*/
public BasePage() {
super();
init();
}
/**
* @see WebPage#WebPage(PageParameters)
*/
public BasePage(PageParameters parameters) {
super(parameters);
init();
}
/**
* Add the page controls
*/
protected final void init() {
// check if logged in
SecurityContext securityContext = SecurityContextHolder.getContext();
if (securityContext != null) {
Authentication authentication = securityContext.getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
boolean user = false;
for (GrantedAuthority authority : authentication.getAuthorities()) {
if (authority.getAuthority().equals(UserConstants.ROLE_USER)
|| authority.getAuthority().equals(UserConstants.ROLE_ADMIN)) {
user = true;
break;
}
}
// logged in
if (user) {
addControls(true);
return;
}
}
}
// not logged in or login forbidden
addControls(false);
}
/**
* sets the theme for the current user.
*
* @param pageParameters current page parameters
*/
private void configureTheme(PageParameters pageParameters) {
StringValue theme = pageParameters.get("theme");
if (!theme.isEmpty()) {
IBootstrapSettings settings = Bootstrap.getSettings(getApplication());
settings.getActiveThemeProvider().setActiveTheme(theme.toString(""));
}
}
@Override
protected void onConfigure() {
super.onConfigure();
configureTheme(getPageParameters());
}
/**
* @see org.apache.wicket.Component#renderHead(IHeaderResponse)
*/
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
Bootstrap.renderHead(response);
// add base css to page
response.render(CssReferenceHeaderItem.forReference(new CssResourceReference(
BasePage.class, BasePage.class.getSimpleName() + ".css")));
response.render(CssHeaderItem.forReference(new LessResourceReference(BasePage.class,
BasePage.class.getSimpleName() + ".less")));
}
/**
* Add page controls
*
* @param loggedIn if a user is logged in
*/
protected void addControls(boolean loggedIn) {
add(new HtmlTag("html"));
add(new OptimizedMobileViewportMetaTag("viewport"));
add(new ChromeFrameMetaTag("chrome-frame"));
// enable theme switching
add(new BootstrapBaseBehavior());
// set link to home page
WebApplication app = (WebApplication) this.getApplication();
// set application title & determine if login page is enabled
String applicationTitle = BaseWebApplication.DEFAULT_TITLE;
boolean loginEnabled = false;
if (app instanceof BaseWebApplication) {
BaseWebApplication bwa = (BaseWebApplication) app;
applicationTitle = bwa.getMainTitle();
loginEnabled = bwa.getLoginPageClass() != null;
}
String pageTitle = applicationTitle.replace("-", "»");
// Label applicatonTitleLabel = new Label("base-application-title", applicationTitle);
// applicatonTitleLabel.setEscapeModelStrings(false);
// add(applicatonTitleLabel);
// get specific page title
PageDescription anno = getClass().getAnnotation(PageDescription.class);
if (anno != null && anno.title() != null) {
pageTitle = pageTitle + " » " + anno.title();
}
Label pageTitleLabel = new Label("base-page-title", pageTitle);
pageTitleLabel.setEscapeModelStrings(false);
add(pageTitleLabel);
// create navigation bar
this.navbar = new Navbar("navbar");
add(navbar);
navbar.setPosition(Position.TOP);
// navbar.setBrandImage(new PackageResourceReference(BasePage.class, "graphics/logo.png"),
// Model.<String> of());
navbar.brandName(Model.of(applicationTitle));
navbar.setInverted(true);
if (loginEnabled) {
if (!loggedIn) {
// login link
NavbarButton<Void> loginButton = new NavbarButton<>(
((BaseWebApplication) app).getLoginPageClass(), Model.of("Login"));
navbar.addComponents(NavbarComponents.transform(ComponentPosition.RIGHT,
loginButton));
}
else {
// logout link
String logoutUrl = ((WebApplication) getApplication()).getServletContext()
.getContextPath() + "/j_spring_security_logout";
NavbarExternalLink logoutLink = new NavbarExternalLink(logoutUrl, "Logout");
logoutLink.setIconType(IconType.off);
logoutLink.setInverted(true);
// user settings
NavbarButton<Void> userButton = new NavbarButton<Void>(UserSettingsPage.class,
Model.of(UserUtil.getUserName(null)));
if (UserUtil.isAdmin()) {
userButton.setIconType(IconType.star);
}
else {
userButton.setIconType(IconType.user);
}
/*
* XXX instead of getting the user name each time from DB, store
* it somewhere?
*/
navbar.addComponents(NavbarComponents.transform(ComponentPosition.RIGHT,
userButton, logoutLink));
}
}
// Theme selector drop-down
// DropDownButton dropdown = createThemeDropdownButton();
// dropdown.add(new DropDownAutoOpen());
//
// navbar.addComponents(NavbarComponents.transform(ComponentPosition.RIGHT, dropdown));
// breadcrumbs
if (Boolean.parseBoolean(System.getProperty("hale.webapp.breadcrumbs", "false"))) {
add(new SimpleBreadcrumbPanel("breadcrumb", this.getClass(), "Home", "/"));
}
else {
add(new WebMarkupContainer("breadcrumb"));
}
// about
add(new BookmarkablePageLink<>("about", AboutPage.class));
// contact
add(new BookmarkablePageLink<>("contact", ContactPage.class));
if (app instanceof BaseWebApplication) {
BaseWebApplication bwa = (BaseWebApplication) app;
bwa.addNavBarExtras(navbar, loggedIn);
}
}
/**
* @return the navbar
*/
public Navbar getNavbar() {
return navbar;
}
/**
* Create a dropdown button for selecting the theme.
*
* @return the drop down button to add to a navbar
*/
protected DropDownButton createThemeDropdownButton() {
return new NavbarDropDownButton(Model.of("Themes")) {
private static final long serialVersionUID = -7119419621661580297L;
@Override
public boolean isActive(Component item) {
return false;
}
@Override
protected List<AbstractLink> newSubMenuButtons(final String buttonMarkupId) {
final List<AbstractLink> subMenu = new ArrayList<AbstractLink>();
subMenu.add(new MenuHeader(Model.of("all available themes:")));
subMenu.add(new MenuDivider());
final IBootstrapSettings settings = Bootstrap.getSettings(getApplication());
final List<ITheme> themes = settings.getThemeProvider().available();
for (final ITheme theme : themes) {
PageParameters params = new PageParameters();
params.set("theme", theme.name());
subMenu.add(new MenuBookmarkablePageLink<Page>(getPageClass(), params, Model
.of(theme.name())));
}
return subMenu;
}
}.setIconType(IconType.book);
}
}