All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.workplace.CmsFrameset Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 18.0
Show newest version
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software GmbH & Co. KG, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.workplace;

import org.opencms.configuration.CmsDefaultUserSettings;
import org.opencms.db.CmsUserSettings;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsResourceFilter;
import org.opencms.i18n.CmsEncoder;
import org.opencms.jsp.CmsJspActionElement;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.security.CmsOrganizationalUnit;
import org.opencms.site.CmsSite;
import org.opencms.synchronize.CmsSynchronizeSettings;
import org.opencms.util.CmsFileUtil;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;

/**
 * Provides methods for building the main framesets of the OpenCms Workplace.

* * The following files use this class: *

    *
  • /views/top.html *
  • /views/top_foot.html *
  • /views/top_head.html *
*

* * @since 6.0.0 */ public class CmsFrameset extends CmsWorkplace { /** Path to the JSP workplace frame loader file. */ public static final String JSP_WORKPLACE_URI = CmsWorkplace.JSP_WORKPLACE_URI; /** The request parameter for the selection of the frame. */ public static final String PARAM_WP_FRAME = "wpFrame"; /** The request parameter for the workplace start selection. */ public static final String PARAM_WP_START = "wpStart"; /** The request parameter for the workplace view selection. */ public static final String PARAM_WP_VIEW = "wpView"; /** The names of the supported frames. */ private static final String[] FRAMES = {"top", "head", "body", "foot"}; /** The names of the supported frames in a list. */ public static final List FRAMES_LIST = Collections.unmodifiableList(Arrays.asList(FRAMES)); /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsFrameset.class); /** Indicates if a reload of the main body frame is required. */ private boolean m_reloadRequired; /** * Public constructor.

* * @param jsp an initialized JSP action element */ public CmsFrameset(CmsJspActionElement jsp) { super(jsp); } /** * Performs additional filtering on the list of projects for the project selector.

* * @param projects the original project list * * @return the filtered project list */ public List filterProjectsForSelector(List projects) { List result = new ArrayList(); for (CmsProject project : projects) { if (!project.isHiddenFromSelector()) { result.add(project); } } return result; } /** * Returns the javascript code for the broadcast message alert in the foot of the workplace.

* * @return javascript code showing an alert box when the foot load */ public String getBroadcastMessage() { StringBuffer result = new StringBuffer(512); String message = getBroadcastMessageString(); if (CmsStringUtil.isNotEmpty(message)) { // create a javascript alert for the message result.append("\n"); } return result.toString(); } /** * Returns the remote ip address of the current user.

* * @return the remote ip address of the current user */ public String getLoginAddress() { return getCms().getRequestContext().getRemoteAddress(); } /** * Returns the last login time of the current user in localized format.

* * @return the last login time of the current user in localized format */ public String getLoginTime() { return getMessages().getDateTime(getSettings().getUser().getLastlogin()); } /** * Returns the html for the "preferences" button depending on the current users permissions and * the default workplace settings.

* * @return the html for the "preferences" button */ public String getPreferencesButton() { int buttonStyle = getSettings().getUserSettings().getWorkplaceButtonStyle(); if (!getCms().getRequestContext().getCurrentUser().isManaged()) { return button( "../commons/preferences.jsp", "body", "preferences.png", Messages.GUI_BUTTON_PREFERENCES_0, buttonStyle); } else { return button(null, null, "preferences_in.png", Messages.GUI_BUTTON_PREFERENCES_0, buttonStyle); } } /** * Returns a html select box filled with the current users accessible projects.

* * @param htmlAttributes attributes that will be inserted into the generated html * @param htmlWidth additional style attributes containing width information * @return a html select box filled with the current users accessible projects */ public String getProjectSelect(String htmlAttributes, String htmlWidth) { // get all project information List allProjects; try { String ouFqn = ""; CmsUserSettings settings = new CmsUserSettings(getCms()); if (!settings.getListAllProjects()) { ouFqn = getCms().getRequestContext().getCurrentUser().getOuFqn(); } allProjects = OpenCms.getOrgUnitManager().getAllAccessibleProjects( getCms(), ouFqn, settings.getListAllProjects()); } catch (CmsException e) { // should usually never happen if (LOG.isErrorEnabled()) { LOG.error(e.getLocalizedMessage(), e); } allProjects = Collections.emptyList(); } allProjects = filterProjectsForSelector(allProjects); boolean singleOu = true; String ouFqn = null; Iterator itProjects = allProjects.iterator(); while (itProjects.hasNext()) { CmsProject prj = itProjects.next(); if (prj.isOnlineProject()) { // skip the online project continue; } if (ouFqn == null) { // set the first ou ouFqn = prj.getOuFqn(); } if (!ouFqn.equals(prj.getOuFqn())) { // break if one different ou is found singleOu = false; break; } } List options = new ArrayList(); List values = new ArrayList(); int selectedIndex = -1; int ouDefaultProjIndex = -1; CmsOrganizationalUnit ou = null; try { ou = OpenCms.getOrgUnitManager().readOrganizationalUnit(getCms(), getCms().getRequestContext().getOuFqn()); } catch (CmsException e) { // should never happen, ignore } // now loop through all projects and fill the result vectors for (int i = 0, n = allProjects.size(); i < n; i++) { CmsProject project = allProjects.get(i); String projectId = project.getUuid().toString(); String projectName = project.getSimpleName(); if (!singleOu && !project.isOnlineProject()) { try { projectName = projectName + " - " + OpenCms.getOrgUnitManager().readOrganizationalUnit( getCms(), project.getOuFqn()).getDisplayName(getLocale()); } catch (CmsException e) { projectName = projectName + " - " + project.getOuFqn(); } } values.add(projectId); options.add(projectName); if (project.getUuid().equals(getSettings().getProject())) { // this is the user's current project selectedIndex = i; } if ((ou != null) && project.getUuid().equals(ou.getProjectId())) { ouDefaultProjIndex = i; } } if (selectedIndex == -1) { if (ouDefaultProjIndex == -1) { selectedIndex = 0; } else { selectedIndex = ouDefaultProjIndex; } } if (CmsStringUtil.isNotEmpty(htmlWidth)) { StringBuffer buf = new StringBuffer(htmlAttributes.length() + htmlWidth.length() + 2); buf.append(htmlAttributes); buf.append(" "); buf.append(htmlWidth); htmlAttributes = buf.toString(); } return buildSelect(htmlAttributes, options, values, selectedIndex); } /** * Returns the html for the "publish project" button depending on the current users permissions and the default * workplace settings.

* * @return the html for the "publish project" button */ public String getPublishButton() { String publishButton = OpenCms.getWorkplaceManager().getDefaultUserSettings().getPublishButtonAppearance(); if (CmsDefaultUserSettings.PUBLISHBUTTON_SHOW_NEVER.equals(publishButton)) { return ""; } int buttonStyle = getSettings().getUserSettings().getWorkplaceButtonStyle(); if (CmsDefaultUserSettings.PUBLISHBUTTON_SHOW_AUTO.equals(publishButton)) { if (getCms().isManagerOfProject()) { return button( "../../workplace/commons/publish_project.jsp", "body", "publish.png", Messages.GUI_BUTTON_PUBLISH_0, buttonStyle); } else { return ""; } } if (getCms().isManagerOfProject()) { return (button( "../../workplace/commons/publish_project.jsp", "body", "publish.png", Messages.GUI_BUTTON_PUBLISH_0, buttonStyle)); } else { return (button(null, null, "publish_in.png", Messages.GUI_BUTTON_PUBLISH_0, buttonStyle)); } } /** * Returns the html for the "publish queue" button.

* * @return the html for the "publish queue" button */ public String getPublishQueueButton() { int buttonStyle = getSettings().getUserSettings().getWorkplaceButtonStyle(); StringBuffer js = new StringBuffer(128); js.append("javascript:if (parent.body.admin_content && parent.body.admin_menu) {"); js.append("parent.body.location.href = '"); js.append(getJsp().link("/system/workplace/views/admin/admin-fs.jsp?root=admin&path=/publishqueue")); js.append("';"); js.append("} else {"); js.append("parent.body.explorer_body.explorer_files.location.href = '"); js.append(getJsp().link("/system/workplace/views/admin/admin-fs.jsp?root=explorer&path=/publishqueue&menu=no")); js.append("';"); js.append("};"); return button(js.toString(), null, "publish_queue.png", Messages.GUI_BUTTON_PUBLISHQUEUE_0, buttonStyle); } /** * Returns a html select box filled with the current users accessible sites.

* * @param htmlAttributes attributes that will be inserted into the generated html * @return a html select box filled with the current users accessible sites */ public String getSiteSelect(String htmlAttributes) { List options = new ArrayList(); List values = new ArrayList(); int selectedIndex = 0; List sites = OpenCms.getSiteManager().getAvailableSites(getCms(), true); Iterator i = sites.iterator(); int pos = 0; while (i.hasNext()) { CmsSite site = i.next(); values.add(site.getSiteRoot()); options.add(substituteSiteTitle(site.getTitle())); String siteRoot = CmsFileUtil.addTrailingSeparator(site.getSiteRoot()); String settingsSiteRoot = getSettings().getSite(); if (settingsSiteRoot != null) { settingsSiteRoot = CmsFileUtil.addTrailingSeparator(settingsSiteRoot); } if (siteRoot.equals(settingsSiteRoot)) { // this is the user's current site selectedIndex = pos; } pos++; } return buildSelect(htmlAttributes, options, values, selectedIndex); } /** * Returns the startup URI for display in the main body frame, this can * either be the user default view, or (if set) a specific startup resource.

* * @return the startup URI for display in the main body frame */ public String getStartupUri() { String result = getSettings().getViewStartup(); if (result == null) { // no specific startup URI is set, use view from user settings result = getSettings().getViewUri(); } else { // reset the startup URI, so that it is not displayed again on reload of the frameset getSettings().setViewStartup(null); } // add eventual request parameters to startup uri if (getJsp().getRequest().getParameterMap().size() > 0) { @SuppressWarnings("unchecked") Set> params = getJsp().getRequest().getParameterMap().entrySet(); Iterator> i = params.iterator(); while (i.hasNext()) { Entry entry = i.next(); result = CmsRequestUtil.appendParameter( result, (String)entry.getKey(), ((String[])entry.getValue())[0]); } } // append the frame name to the startup uri return CmsRequestUtil.appendParameter(result, CmsFrameset.PARAM_WP_FRAME, FRAMES[2]); } /** * Returns a html select box filled with the views accessible by the current user.

* * @param htmlAttributes attributes that will be inserted into the generated html * @return a html select box filled with the views accessible by the current user */ public String getViewSelect(String htmlAttributes) { List options = new ArrayList(); List values = new ArrayList(); int selectedIndex = 0; // loop through the vectors and fill the result vectors Iterator i = OpenCms.getWorkplaceManager().getViews().iterator(); int count = -1; String currentView = getSettings().getViewUri(); if (CmsStringUtil.isNotEmpty(currentView)) { // remove possible parameters from current view int pos = currentView.indexOf('?'); if (pos >= 0) { currentView = currentView.substring(0, pos); } } while (i.hasNext()) { CmsWorkplaceView view = i.next(); if (getCms().existsResource(view.getUri(), CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)) { count++; // ensure the current user has +v+r permissions on the view String loopLink = getJsp().link(view.getUri()); String localizedKey = resolveMacros(view.getKey()); options.add(localizedKey); values.add(loopLink); if (loopLink.equals(currentView)) { selectedIndex = count; } } } return buildSelect(htmlAttributes, options, values, selectedIndex); } /** * Returns the reload URI for the OpenCms workplace.

* * @return the reload URI for the OpenCms workplace */ public String getWorkplaceReloadUri() { return getJsp().link(CmsFrameset.JSP_WORKPLACE_URI); } /** * Returns true if a reload of the main body frame is required.

* * This value is modified with the select options (project, site or view) in the head frame of * the Workplace. If a user changes one of these select values, the head frame is posted * "against itself". The posted values will be processed by this class, causing * the internal Workplace settings to change. After these settings have been changed, * a reload of the main body frame is required in order to update it with the new values. * A JavaScript in the Workplace head frame will be executed in this case.

* * @return true if a reload of the main body frame is required */ public boolean isReloadRequired() { return m_reloadRequired; } /** * Returns true if the user has enabled synchronization.

* * @return true if the user has enabled synchronization */ public boolean isSyncEnabled() { CmsSynchronizeSettings syncSettings = getSettings().getUserSettings().getSynchronizeSettings(); return (syncSettings != null) && syncSettings.isSyncEnabled(); } /** * Indicates if the site selector should be shown in the top frame depending on the count of accessible sites.

* * @return true if site selector should be shown, otherwise false */ public boolean showSiteSelector() { if (getSettings().getUserSettings().getRestrictExplorerView()) { // restricted explorer view to site and folder, do not show site selector return false; } // count available sites int siteCount = OpenCms.getSiteManager().getAvailableSites(getCms(), true).size(); return (siteCount > 1); } /** * @see org.opencms.workplace.CmsWorkplace#initTimeWarp(org.opencms.db.CmsUserSettings, javax.servlet.http.HttpSession) */ @Override protected void initTimeWarp(CmsUserSettings settings, HttpSession session) { // overriden to avoid deletion of the configured time warp: // this is triggered by editors and in auto time warping a direct edit // must not delete a potential auto warped request time } /** * @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest) */ @Override protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { // check if a startup page has been set String frame = CmsRequestUtil.getNotEmptyDecodedParameter(request, CmsFrameset.PARAM_WP_FRAME); if ((frame == null) || (FRAMES_LIST.indexOf(frame) < 0)) { // illegal or no frame selected, assume the "top" frame frame = FRAMES[0]; } if (FRAMES[0].equals(frame)) { // top frame requested - execute special reload actions topFrameReload(settings); } // check if a startup page has been set String startup = CmsRequestUtil.getNotEmptyDecodedParameter(request, CmsFrameset.PARAM_WP_START); if (startup != null) { m_reloadRequired = true; settings.setViewStartup(startup); } // check if the user requested a view change String view = request.getParameter(CmsFrameset.PARAM_WP_VIEW); if (view != null) { m_reloadRequired = true; settings.setViewUri(view); settings.getFrameUris().put("body", view); } m_reloadRequired = initSettings(settings, request) || m_reloadRequired; } /** * Performs certain clear cache actions if the top frame is reloaded.

* * @param settings the current users workplace settings */ protected void topFrameReload(CmsWorkplaceSettings settings) { // ensure to read the settings from the database initUserSettings(getCms(), settings, true); // reset the HTML list in order to force a full reload settings.setListObject(null); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy