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

org.opencms.ui.apps.CmsAppWorkplaceUi 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, 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.ui.apps;

import org.opencms.file.CmsObject;
import org.opencms.main.CmsBroadcast;
import org.opencms.main.CmsLog;
import org.opencms.main.CmsSessionInfo;
import org.opencms.main.OpenCms;
import org.opencms.security.CmsRole;
import org.opencms.ui.A_CmsUI;
import org.opencms.ui.CmsVaadinErrorHandler;
import org.opencms.ui.CmsVaadinUtils;
import org.opencms.ui.I_CmsAppView;
import org.opencms.ui.apps.CmsAppView.CacheStatus;
import org.opencms.ui.apps.CmsWorkplaceAppManager.NavigationState;
import org.opencms.ui.components.I_CmsWindowCloseListener;
import org.opencms.ui.components.extensions.CmsHistoryExtension;
import org.opencms.ui.components.extensions.CmsPollServerExtension;
import org.opencms.ui.components.extensions.CmsWindowCloseExtension;
import org.opencms.ui.login.CmsLoginHelper;
import org.opencms.util.CmsExpiringValue;
import org.opencms.util.CmsStringUtil;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.collections.Buffer;
import org.apache.commons.logging.Log;

import com.vaadin.annotations.Theme;
import com.vaadin.navigator.NavigationStateManager;
import com.vaadin.navigator.Navigator;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.navigator.ViewDisplay;
import com.vaadin.navigator.ViewProvider;
import com.vaadin.server.Page;
import com.vaadin.server.Page.BrowserWindowResizeEvent;
import com.vaadin.server.Page.BrowserWindowResizeListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Component;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;

/**
 * The workplace ui.

*/ @Theme("opencms") public class CmsAppWorkplaceUi extends A_CmsUI implements ViewDisplay, ViewProvider, ViewChangeListener, I_CmsWindowCloseListener, BrowserWindowResizeListener { /** * View which directly changes the state to the launchpad.

*/ class LaunchpadRedirectView implements View { /** Serial version id. */ private static final long serialVersionUID = 1L; /** * @see com.vaadin.navigator.View#enter(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent) */ public void enter(ViewChangeEvent event) { A_CmsUI.get().getNavigator().navigateTo(CmsAppHierarchyConfiguration.APP_ID); } } /** The OpenCms window title prefix. */ public static final String WINDOW_TITLE_PREFIX = "OpenCms - "; /** Logger instance for this class. */ private static final Log LOG = CmsLog.getLog(CmsAppWorkplaceUi.class); /** The serial version id. */ private static final long serialVersionUID = -5606711048683809028L; /** Launch pad redirect view. */ protected View m_launchRedirect = new LaunchpadRedirectView(); /** The cached views. */ private Map m_cachedViews; /** The current view in case it implements view change listener. */ private View m_currentView; /** The history extension. */ private CmsHistoryExtension m_history; /** Cache for workplace locale. */ private CmsExpiringValue m_localeCache = new CmsExpiringValue(1000); /** The navigation state manager. */ private NavigationStateManager m_navigationStateManager; /** Currently refreshing? */ private boolean m_refreshing; /** * Constructor.

*/ public CmsAppWorkplaceUi() { m_cachedViews = new HashMap(); } /** * Gets the current UI instance.

* * @return the current UI instance */ public static CmsAppWorkplaceUi get() { return (CmsAppWorkplaceUi)A_CmsUI.get(); } /** * Returns whether the current project is the online project.

* * @return true if the current project is the online project */ public static boolean isOnlineProject() { return getCmsObject().getRequestContext().getCurrentProject().isOnlineProject(); } /** * Sets the window title adding an OpenCms prefix.

* * @param title the window title */ public static void setWindowTitle(String title) { get().getPage().setTitle(WINDOW_TITLE_PREFIX + title); } /** * @see com.vaadin.navigator.ViewChangeListener#afterViewChange(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent) */ public void afterViewChange(ViewChangeEvent event) { if ((m_currentView != null) && (m_currentView instanceof ViewChangeListener)) { ((ViewChangeListener)m_currentView).afterViewChange(event); } } /** * @see com.vaadin.navigator.ViewChangeListener#beforeViewChange(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent) */ public boolean beforeViewChange(ViewChangeEvent event) { cacheView(m_currentView); if ((m_currentView != null) && (m_currentView instanceof ViewChangeListener)) { return ((ViewChangeListener)m_currentView).beforeViewChange(event); } return true; } /** * @see com.vaadin.server.Page.BrowserWindowResizeListener#browserWindowResized(com.vaadin.server.Page.BrowserWindowResizeEvent) */ public void browserWindowResized(BrowserWindowResizeEvent event) { markAsDirtyRecursive(); if ((m_currentView != null) && (m_currentView instanceof BrowserWindowResizeListener)) { ((BrowserWindowResizeListener)m_currentView).browserWindowResized(event); } } /** * Call to add a new browser history entry.

* * @param state the current app view state */ public void changeCurrentAppState(String state) { String completeState = m_navigationStateManager.getState(); String view = getViewName(completeState); String newCompleteState = view; if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(state)) { newCompleteState += NavigationState.PARAM_SEPARATOR + state; } m_navigationStateManager.setState(newCompleteState); } /** * Checks for new broadcasts.

*/ public void checkBroadcasts() { CmsSessionInfo info = OpenCms.getSessionManager().getSessionInfo(getHttpSession()); Buffer queue = info.getBroadcastQueue(); if (!queue.isEmpty()) { StringBuffer broadcasts = new StringBuffer(); while (!queue.isEmpty()) { CmsBroadcast broadcastMessage = (CmsBroadcast)queue.remove(); String from = broadcastMessage.getUser() != null ? broadcastMessage.getUser().getName() : CmsVaadinUtils.getMessageText(org.opencms.workplace.Messages.GUI_LABEL_BROADCAST_FROM_SYSTEM_0); String date = CmsVaadinUtils.getWpMessagesForCurrentLocale().getDateTime( broadcastMessage.getSendTime()); String content = broadcastMessage.getMessage(); content = content.replaceAll("\\n", "
"); broadcasts.append("

").append(date).append("
"); broadcasts.append( CmsVaadinUtils.getMessageText( org.opencms.workplace.Messages.GUI_LABEL_BROADCASTMESSAGEFROM_0)).append(" ").append( from).append(":

"); broadcasts.append(content).append("

"); } Notification notification = new Notification( CmsVaadinUtils.getMessageText(Messages.GUI_BROADCAST_TITLE_0), broadcasts.toString(), Type.WARNING_MESSAGE, true); notification.setDelayMsec(-1); notification.show(getPage()); } } /** * @see org.opencms.ui.A_CmsUI#closeWindows() */ @Override public void closeWindows() { super.closeWindows(); if (m_currentView instanceof CmsAppView) { ((CmsAppView)m_currentView).getComponent().closePopupViews(); } } /** * @see com.vaadin.ui.UI#detach() */ @Override public void detach() { clearCachedViews(); super.detach(); } /** * Disables the global keyboard shortcuts.

*/ public void disableGlobalShortcuts() { if (m_currentView instanceof I_CmsAppView) { ((I_CmsAppView)m_currentView).disableGlobalShortcuts(); } } /** * Enables the global keyboard shortcuts.

*/ public void enableGlobalShortcuts() { if (m_currentView instanceof I_CmsAppView) { ((I_CmsAppView)m_currentView).enableGlobalShortcuts(); } } /** * Returns the state parameter of the current app.

* * @return the state parameter of the current app */ public String getAppState() { NavigationState state = new NavigationState(m_navigationStateManager.getState()); return state.getParams(); } /** * Gets the current view.

* * @return the current view */ public View getCurrentView() { return m_currentView; } /** * @see com.vaadin.ui.AbstractComponent#getLocale() */ @Override public Locale getLocale() { Locale result = m_localeCache.get(); if (result == null) { CmsObject cms = getCmsObject(); result = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms); m_localeCache.set(result); } return result; } /** * @see com.vaadin.navigator.ViewProvider#getView(java.lang.String) */ public View getView(String viewName) { if (m_cachedViews.containsKey(viewName)) { View view = m_cachedViews.get(viewName); if (view instanceof CmsAppView) { CmsAppView appView = (CmsAppView)view; if (appView.getCacheStatus() == CacheStatus.cache) { appView.setRequiresRestore(true); return appView; } else if (appView.getCacheStatus() == CacheStatus.cacheOnce) { appView.setCacheStatus(CacheStatus.noCache); appView.setRequiresRestore(true); return appView; } } } I_CmsWorkplaceAppConfiguration appConfig = OpenCms.getWorkplaceAppManager().getAppConfiguration(viewName); if (appConfig != null) { return new CmsAppView(appConfig); } else { LOG.warn("Nonexistant view '" + viewName + "' requested"); return m_launchRedirect; } } /** * @see com.vaadin.navigator.ViewProvider#getViewName(java.lang.String) */ public String getViewName(String viewAndParameters) { NavigationState state = new NavigationState(viewAndParameters); return state.getViewName(); } /** * Executes the history back function.

*/ public void historyBack() { m_history.historyBack(); } /** * Executes the history forward function.

*/ public void historyForward() { m_history.historyForward(); } /** * Called when an error occurs.

*/ public void onError() { // do nothing for now } /** * @see org.opencms.ui.components.I_CmsWindowCloseListener#onWindowClose() */ public void onWindowClose() { if ((m_currentView != null) && (m_currentView instanceof I_CmsWindowCloseListener)) { ((I_CmsWindowCloseListener)m_currentView).onWindowClose(); } cacheView(m_currentView); } /** * @see org.opencms.ui.A_CmsUI#reload() */ @Override public void reload() { if (m_currentView instanceof I_CmsAppView) { Component component = ((I_CmsAppView)m_currentView).reinitComponent(); setContent(component); ((I_CmsAppView)m_currentView).enter(getAppState()); } } /** * @see com.vaadin.ui.UI#setLastHeartbeatTimestamp(long) */ @Override public void setLastHeartbeatTimestamp(long lastHeartbeat) { super.setLastHeartbeatTimestamp(lastHeartbeat); // check for new broadcasts on every heart beat checkBroadcasts(); } /** * Navigates to the given app.

* * @param appConfig the app configuration */ public void showApp(I_CmsWorkplaceAppConfiguration appConfig) { getNavigator().navigateTo(appConfig.getId()); } /** * Navigates to the given app.

* * @param appConfig the app configuration * @param state the app state to call */ public void showApp(I_CmsWorkplaceAppConfiguration appConfig, String state) { getNavigator().navigateTo(appConfig.getId() + "/" + state); } /** * Navigates to the home screen.

*/ public void showHome() { getNavigator().navigateTo(CmsAppHierarchyConfiguration.APP_ID); } /** * @see com.vaadin.navigator.ViewDisplay#showView(com.vaadin.navigator.View) */ public void showView(View view) { closeWindows(); // remove current component form the view change listeners m_currentView = view; Component component = null; if (view instanceof I_CmsAppView) { if (((I_CmsAppView)view).requiresRestore()) { ((I_CmsAppView)view).restoreFromCache(); } component = ((I_CmsAppView)view).getComponent(); } else if (view instanceof Component) { component = (Component)view; } initializeClientPolling(component); if (component != null) { setContent(component); } } /** * @see com.vaadin.ui.UI#init(com.vaadin.server.VaadinRequest) */ @Override protected void init(VaadinRequest req) { super.init(req); if (!OpenCms.getRoleManager().hasRole(getCmsObject(), CmsRole.EDITOR)) { Notification.show( CmsVaadinUtils.getMessageText(Messages.GUI_WORKPLACE_ACCESS_DENIED_TITLE_0), CmsVaadinUtils.getMessageText(Messages.GUI_WORKPLACE_ACCESS_DENIED_MESSAGE_0), Type.ERROR_MESSAGE); return; } getSession().setErrorHandler(new CmsVaadinErrorHandler(this)); m_navigationStateManager = new Navigator.UriFragmentManager(getPage()); CmsAppNavigator navigator = new CmsAppNavigator(this, m_navigationStateManager, this); navigator.addProvider(this); setNavigator(navigator); Page.getCurrent().addBrowserWindowResizeListener(this); m_history = new CmsHistoryExtension(getCurrent()); CmsWindowCloseExtension windowClose = new CmsWindowCloseExtension(getCurrent()); windowClose.addWindowCloseListener(this); navigator.addViewChangeListener(this); navigateToFragment(); getReconnectDialogConfiguration().setDialogText( CmsVaadinUtils.getMessageText(org.opencms.ui.Messages.GUI_SYSTEM_CONNECTION_LOST_TRYING_RECONNECT_0)); getReconnectDialogConfiguration().setDialogTextGaveUp( CmsVaadinUtils.getMessageText(org.opencms.ui.Messages.GUI_SYSTEM_CONNECTION_LOST_GIVING_UP_0)); } /** * Caches the given view in case it implements the I_CmsAppView interface and is cachable.

* * @param view the view to cache */ private void cacheView(View view) { if (!m_refreshing && (view instanceof I_CmsAppView) && ((I_CmsAppView)view).isCachable()) { m_cachedViews.put(((I_CmsAppView)view).getName(), (I_CmsAppView)view); } } /** * Clears the cached views.

*/ private void clearCachedViews() { m_cachedViews.clear(); } /** * Initializes client polling to avoid session expiration.

* * @param component the view component */ @SuppressWarnings("unused") private void initializeClientPolling(Component component) { if (component instanceof AbstractComponent) { new CmsPollServerExtension((AbstractComponent)component); } } /** * Navigates to the current URI fragment.

*/ private void navigateToFragment() { String fragment = getPage().getUriFragment(); if (fragment != null) { getNavigator().navigateTo(fragment); } else { CmsObject cms = getCmsObject(); String target = CmsLoginHelper.getStartView(cms); if (target != null) { if (target.startsWith("#")) { getNavigator().navigateTo(target.substring(1)); } else { Page.getCurrent().setLocation(OpenCms.getLinkManager().substituteLink(cms, target)); } } else { showHome(); } } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy