Package org.projectforge.web.wicket

Source Code of org.projectforge.web.wicket.AbstractSecuredPage

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////

package org.projectforge.web.wicket;

import javax.servlet.http.HttpServletRequest;

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.Link;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.projectforge.web.core.MenuBarPanel;
import org.projectforge.web.core.NavTopPanel;
import org.projectforge.web.dialog.ModalDialog;
import org.projectforge.web.fibu.ISelectCallerPage;
import org.projectforge.web.wicket.components.ContentMenuEntryPanel;

/** All pages with required login should be derived from this page. */
public abstract class AbstractSecuredPage extends AbstractSecuredBasePage
{
  private static final long serialVersionUID = -8721451198050398835L;

  protected MenuBarPanel contentMenuBarPanel;

  /**
   * If set then return after save, update or cancel to this page. If not given then return to given list page.
   */
  protected WebPage returnToPage;

  private final RepeatingView modalDialogs;

  @SuppressWarnings("serial")
  public AbstractSecuredPage(final PageParameters parameters)
  {
    super(parameters);
    modalDialogs = new RepeatingView("modalDialogs");
    body.add(modalDialogs);
    final NavTopPanel topMenuPanel = new NavTopPanel("topMenu", userXmlPreferencesCache, accessChecker);
    body.add(topMenuPanel);
    topMenuPanel.init(this);
    contentMenuBarPanel = new MenuBarPanel("menuBar");
    final Model<String> alertMessageModel = new Model<String>() {
      @Override
      public String getObject()
      {
        if (WicketApplication.getAlertMessage() == null) {
          return "neverDisplayed";
        }
        return WicketApplication.getAlertMessage();
      }
    };
    final WebMarkupContainer alertMessageContainer = new WebMarkupContainer("alertMessageContainer") {
      @Override
      public boolean isVisible()
      {
        return (WicketApplication.getAlertMessage() != null);
      }
    };
    body.add(alertMessageContainer);
    final Label alertMessageLabel = new Label("alertMessage", alertMessageModel);
    alertMessageContainer.add(alertMessageLabel.setRenderBodyOnly(true));
  }

  /**
   * @see org.apache.wicket.Component#onInitialize()
   */
  @Override
  protected void onInitialize()
  {
    super.onInitialize();
    final WebMarkupContainer breadcrumbContainer = new WebMarkupContainer("breadcrumb");
    body.add(breadcrumbContainer);
    breadcrumbContainer.add(contentMenuBarPanel);
    if (isBreadCrumbVisible() == true) {
      final RepeatingView breadcrumbItems = new RepeatingView("li");
      breadcrumbContainer.add(breadcrumbItems);
      final WebPage returnTo = this.getReturnToPage();
      if (returnTo != null && returnTo instanceof AbstractSecuredPage) {
        addBreadCrumbs(breadcrumbItems, (AbstractSecuredPage) returnTo);
      } else {
        breadcrumbItems.setVisible(false);
      }
      breadcrumbContainer.add(new Label("active", getTitle()));
    } else {
      breadcrumbContainer.setVisible(false);
    }
  }

  @SuppressWarnings("serial")
  private void addBreadCrumbs(final RepeatingView breadcrumbItems, final AbstractSecuredPage page)
  {
    final WebPage returnTo = page.getReturnToPage();
    if (returnTo != null && returnTo instanceof AbstractSecuredPage) {
      addBreadCrumbs(breadcrumbItems, (AbstractSecuredPage) returnTo);
    }
    final WebMarkupContainer li = new WebMarkupContainer(breadcrumbItems.newChildId());
    breadcrumbItems.add(li);
    final Link<Void> pageLink = new Link<Void>("link") {

      @Override
      public void onClick()
      {
        setResponsePage(page);
      }
    };
    li.add(pageLink);
    pageLink.add(new Label("label", page.getTitle()));
  }

  /**
   * If set then return after save, update or cancel to this page. If not given then return to given list page. As an alternative you can
   * set the returnToPage as a page parameter (if supported by the derived page).
   * @param returnToPage
   */
  public AbstractSecuredPage setReturnToPage(final WebPage returnToPage)
  {
    this.returnToPage = returnToPage;
    return this;
  }

  /**
   * @return the returnToPage
   */
  public WebPage getReturnToPage()
  {
    return returnToPage;
  }

  public void addContentMenuEntry(final ContentMenuEntryPanel panel)
  {
    this.contentMenuBarPanel.addMenuEntry(panel);
  }

  public String getNewContentMenuChildId()
  {
    return this.contentMenuBarPanel.newChildId();
  }

  /**
   * @return This page as link with the page parameters of this page.
   */
  public String getPageAsLink()
  {
    return getPageAsLink(getPageParameters());
  }

  /**
   * @param parameters
   * @return This page as link with the given page parameters.
   */
  public String getPageAsLink(final PageParameters parameters)
  {
    String relativeUrl = (String) urlFor(this.getClass(), parameters);
    final HttpServletRequest req = (HttpServletRequest) (this.getRequest()).getContainerRequest();
    String requestUrl = req.getRequestURL().toString();
    final int pos = requestUrl != null ? requestUrl.indexOf("/wa/") : -1;
    if (pos > 0) {
      // Ignore any sub pathes such as /wa/wicket/page:
      requestUrl = requestUrl.substring(0, pos) + "/wa/";
      if (relativeUrl.indexOf("../") >= 0) {
        // Therefore ignore relative pathes ../:
        relativeUrl = relativeUrl.replace("../", "");
      }
    }
    return WicketUtils.toAbsolutePath(requestUrl, relativeUrl);
  }

  /**
   * Evaluates the page parameters and sets the properties, if parameters are given.
   * @param parameters
   * @see WicketUtils#evaluatePageParameters(Object, PageParameters, String, String[])
   */
  protected void evaluateInitialPageParameters(final PageParameters parameters)
  {
    if (getBookmarkableInitialProperties() != null) {
      WicketUtils.evaluatePageParameters(getICallerPageForInitialParameters(), getDataObjectForInitialParameters(),
          getFilterObjectForInitialParameters(), parameters, getBookmarkableInitialProperties());
    }
  }

  /**
   * Adds additional page parameter. Used by NavTopPanel to show direct page links including the page parameters returned by
   * {@link #getBookmarkableInitialProperties()}.
   * @see org.projectforge.web.wicket.AbstractUnsecurePage#getBookmarkableInitialParameters()
   */
  public PageParameters getBookmarkableInitialParameters()
  {
    final PageParameters pageParameters = new PageParameters();
    WicketUtils.putPageParameters(getICallerPageForInitialParameters(), getDataObjectForInitialParameters(),
        getFilterObjectForInitialParameters(), pageParameters, getBookmarkableInitialProperties());
    return pageParameters;
  }

  /**
   * The title of the page link shown with initial parameters (overridden by e. g. AbstractEditPage).
   * @return
   */
  public String getTitleKey4BookmarkableInitialParameters()
  {
    return "bookmark.directPageExtendedLink";
  }

  /**
   * Properties which should be evaluated for new entries. These properties, if given in PageParameters, will be set as initial values. All
   * this properties will be set via {@link ISelectCallerPage#select(String, Object)}.
   */
  protected String[] getBookmarkableInitialProperties()
  {
    return null;
  }

  /**
   * Overwritten by e. g. {@link AbstractEditPage}.
   * @return this at default (works if the page holds the data directly).
   */
  protected Object getDataObjectForInitialParameters()
  {
    return this;
  }

  /**
   * Overwritten by e. g. {@link AbstractListPage}.
   * @return this at default (works if the page holds the data directly).
   */
  protected Object getFilterObjectForInitialParameters()
  {
    return null;
  }

  /**
   * @return this at default (works if the page is an instance of {@link ISelectCallerPage}.
   */
  protected ISelectCallerPage getICallerPageForInitialParameters()
  {
    if (this instanceof ISelectCallerPage) {
      return (ISelectCallerPage) this;
    } else {
      return null;
    }
  }

  public String newModalDialogId()
  {
    return modalDialogs.newChildId();
  }

  public void add(final ModalDialog modalDialog)
  {
    modalDialogs.add(modalDialog);
  }

  protected boolean isBreadCrumbVisible()
  {
    return true;
  }
}
TOP

Related Classes of org.projectforge.web.wicket.AbstractSecuredPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.