///////////////////////////////////////////////////////////////////////////// // // 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 java.text.MessageFormat; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringEscapeUtils; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.head.StringHeaderItem; import org.apache.wicket.markup.html.TransparentWebMarkupContainer; 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.image.ContextImage; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.model.Model; import org.apache.wicket.request.http.handler.RedirectRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.template.PackageTextTemplate; import org.projectforge.AppVersion; import org.projectforge.user.PFUserContext; import org.projectforge.user.PFUserDO; import org.projectforge.web.WebConfiguration; import org.projectforge.web.core.LogoServlet; import org.projectforge.web.doc.DocumentationPage; /** * Do only derive from this page, if no login is required! * @author Kai Reinhard (k.reinhard@micromata.de) */ public abstract class AbstractUnsecureBasePage extends WebPage { private static final long serialVersionUID = 7396310612549535899L; private static PackageTextTemplate jsTemplate; protected WebMarkupContainer body, html; protected boolean alreadySubmitted = false; /** * Convenience method for creating a component which is in the mark-up file but should not be visible. * @param wicketId * @return */ public static Label createInvisibleDummyComponent(final String wicketId) { final Label dummyLabel = new Label(wicketId); dummyLabel.setVisible(false); return dummyLabel; } /** * Constructor that is invoked when page is invoked without a session. * * @param parameters Page parameters */ @SuppressWarnings("serial") public AbstractUnsecureBasePage(final PageParameters parameters) { super(parameters); html = new TransparentWebMarkupContainer("html"); add(html); add(new Label("windowTitle", new Model<String>() { @Override public String getObject() { return getWindowTitle(); } })); body = new WebMarkupContainer("body") { @Override protected void onComponentTag(final ComponentTag tag) { onBodyTag(tag); } }; add(body); final String logoServlet = LogoServlet.getBaseUrl(); if (logoServlet != null) { body.add(new ContextImage("logoLeftImage", logoServlet)); } else { body.add(new Label("logoLeftImage", "[invisible]").setVisible(false)); } final WebMarkupContainer developmentSystem = new WebMarkupContainer("developmentSystem"); developmentSystem.setOutputMarkupId(true); developmentSystem.setMarkupId("pf_develHint"); body.add(developmentSystem); if (WebConfiguration.isDevelopmentMode() == false) { developmentSystem.setVisible(false); } final PFUserDO user = PFUserContext.getUser(); AbstractLink link; if (user == null) { link = new ExternalLink("footerNewsLink", "http://www.projectforge.org/pf-en/News"); body.add(link); } else { link = DocumentationPage.addNewsLink(body, "footerNewsLink"); } link.add(new Label("version", "Version " + AppVersion.VERSION.toString() + ", " + AppVersion.RELEASE_DATE).setRenderBodyOnly(true)); link.setOutputMarkupId(true); link.setMarkupId("pf_footerNewsLink"); } @Override public void renderHead(final IHeaderResponse response) { super.renderHead(response); response.render(StringHeaderItem.forString(WicketUtils.getCssForFavicon(getUrl("/favicon.ico")))); WicketRenderHeadUtils.renderMainCSSIncludes(response); WicketRenderHeadUtils.renderMainJavaScriptIncludes(response); initializeContextMenu(response); } @Override protected void onBeforeRender() { super.onBeforeRender(); alreadySubmitted = false; } /** * Gets the version of this Application. * @see AppVersion#NUMBER */ public final String getAppVersion() { return AppVersion.NUMBER; } /** * Gets the release date of this Application. * @see AppVersion#RELEASE_DATE */ public final String getAppReleaseDate() { return AppVersion.RELEASE_DATE; } /** * Gets the release date of this Application. * @see AppVersion#RELEASE_DATE */ public final String getAppReleaseTimestamp() { return AppVersion.RELEASE_TIMESTAMP; } /** * Includes session id (encode URL) at default. * @see #getUrl(String, boolean) */ public String getUrl(final String path) { return getUrl(path, true); } /** * @see WicketUtils#getImageUrl(org.apache.wicket.Response, String) */ public String getImageUrl(final String subpath) { return WicketUtils.getImageUrl(getRequestCycle(), subpath); } /** * @see WicketUtils#getUrl(org.apache.wicket.Response, String, boolean) */ public String getUrl(final String path, final boolean encodeUrl) { return WicketUtils.getUrl(getRequestCycle(), path, encodeUrl); } /** * @param url * @see #getUrl(String) */ protected void redirectToUrl(final String url) { getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(getUrl(url))); } protected abstract String getTitle(); /** * Security. Implement this method if you are really sure that you want to implement an unsecure page (meaning this page is available * without any authorization, it's therefore public)! */ protected abstract void thisIsAnUnsecuredPage(); protected String getWindowTitle() { return AppVersion.APP_ID + " - " + getTitle(); } /** * If your page need to manipulate the body tag overwrite this method, e. g.: tag.put("onload", "..."); * @return */ protected void onBodyTag(final ComponentTag bodyTag) { } protected WicketApplicationInterface getWicketApplication() { return (WicketApplicationInterface) getApplication(); } /** * @see StringEscapeUtils#escapeHtml(String) */ protected String escapeHtml(final String str) { return StringEscapeUtils.escapeHtml(str); } public MySession getMySession() { return (MySession) getSession(); } /** * Always returns null for unsecured page, otherwise the logged-in user. * @return null * @see AbstractSecuredPage#getUser() */ protected PFUserDO getUser() { return null; } /** * Always returns null for unsecured page, otherwise the id of the logged-in user. * @return null * @see AbstractSecuredPage#getUser() */ protected Integer getUserId() { return null; } public String getLocalizedMessage(final String key, final Object... params) { if (params == null) { return getString(key); } return MessageFormat.format(getString(key), params); } private void initializeContextMenu(final IHeaderResponse response) { // context menu final Map<String, String> i18nKeyMap = new HashMap<String, String>(); i18nKeyMap.put("newTab", getString("contextMenu.newTab")); i18nKeyMap.put("cancel", getString("contextMenu.cancel")); response.render(OnDomReadyHeaderItem.forScript(getJstemplate().asString(i18nKeyMap))); } /** * @return the jstemplate */ private static PackageTextTemplate getJstemplate() { if (jsTemplate == null) { jsTemplate = new PackageTextTemplate(AbstractUnsecureBasePage.class, "ContextMenu.js.template"); } return jsTemplate; } }