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

org.opencms.gwt.CmsCoreService 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.gwt;

import org.opencms.db.CmsResourceState;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.file.CmsUser;
import org.opencms.file.CmsVfsResourceNotFoundException;
import org.opencms.file.types.CmsResourceTypeFolder;
import org.opencms.file.types.CmsResourceTypePlain;
import org.opencms.flex.CmsFlexController;
import org.opencms.gwt.shared.CmsBroadcastMessage;
import org.opencms.gwt.shared.CmsCategoryTreeEntry;
import org.opencms.gwt.shared.CmsContextMenuEntryBean;
import org.opencms.gwt.shared.CmsCoreData;
import org.opencms.gwt.shared.CmsCoreData.AdeContext;
import org.opencms.gwt.shared.CmsCoreData.UserInfo;
import org.opencms.gwt.shared.CmsLockInfo;
import org.opencms.gwt.shared.CmsResourceCategoryInfo;
import org.opencms.gwt.shared.CmsReturnLinkInfo;
import org.opencms.gwt.shared.CmsUserSettingsBean;
import org.opencms.gwt.shared.CmsValidationQuery;
import org.opencms.gwt.shared.CmsValidationResult;
import org.opencms.gwt.shared.CmsWorkplaceLinkMode;
import org.opencms.gwt.shared.rpc.I_CmsCoreService;
import org.opencms.i18n.CmsEncoder;
import org.opencms.i18n.CmsMessages;
import org.opencms.lock.CmsLock;
import org.opencms.main.CmsBroadcast;
import org.opencms.main.CmsException;
import org.opencms.main.CmsIllegalArgumentException;
import org.opencms.main.CmsLog;
import org.opencms.main.CmsSessionInfo;
import org.opencms.main.OpenCms;
import org.opencms.module.CmsModule;
import org.opencms.relations.CmsCategory;
import org.opencms.relations.CmsCategoryService;
import org.opencms.security.CmsPasswordInfo;
import org.opencms.security.CmsPermissionSet;
import org.opencms.security.CmsRole;
import org.opencms.security.CmsRoleManager;
import org.opencms.security.CmsSecurityException;
import org.opencms.site.CmsSite;
import org.opencms.ui.CmsVaadinUtils;
import org.opencms.ui.apps.CmsFileExplorerConfiguration;
import org.opencms.ui.dialogs.CmsEmbeddedDialogsUI;
import org.opencms.util.CmsFileUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.CmsWorkplace;
import org.opencms.workplace.CmsWorkplaceLoginHandler;
import org.opencms.workplace.CmsWorkplaceManager;
import org.opencms.workplace.explorer.CmsExplorerContextMenu;
import org.opencms.workplace.explorer.CmsExplorerContextMenuItem;
import org.opencms.workplace.explorer.CmsExplorerTypeSettings;
import org.opencms.workplace.explorer.CmsResourceUtil;
import org.opencms.workplace.explorer.menu.A_CmsMenuItemRule;
import org.opencms.workplace.explorer.menu.CmsMenuItemVisibilityMode;
import org.opencms.workplace.explorer.menu.CmsMenuRule;
import org.opencms.workplace.explorer.menu.I_CmsMenuItemRule;
import org.opencms.xml.containerpage.CmsADESessionCache;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

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

/**
 * Provides general core services.

* * @since 8.0.0 * * @see org.opencms.gwt.CmsCoreService * @see org.opencms.gwt.shared.rpc.I_CmsCoreService * @see org.opencms.gwt.shared.rpc.I_CmsCoreServiceAsync */ public class CmsCoreService extends CmsGwtService implements I_CmsCoreService { /** The editor back-link URI. */ private static final String EDITOR_BACKLINK_URI = "/system/modules/org.opencms.gwt/editor-backlink.html"; /** The xml-content editor URI. */ private static final String EDITOR_URI = "/system/workplace/editors/editor.jsp"; /** The log instance for this class. */ private static final Log LOG = CmsLog.getLog(CmsCoreService.class); /** Serialization uid. */ private static final long serialVersionUID = 5915848952948986278L; /** * Builds the tree structure for the given categories.

* * @param cms the current cms context * @param categories the categories * * @return the tree root element */ public static List buildCategoryTree(CmsObject cms, List categories) { List result = new ArrayList(); for (CmsCategory category : categories) { CmsCategoryTreeEntry current = new CmsCategoryTreeEntry(category); current.setSitePath(cms.getRequestContext().removeSiteRoot(category.getRootPath())); String parentPath = CmsResource.getParentFolder(current.getPath()); CmsCategoryTreeEntry parent = null; parent = findCategory(result, parentPath); if (parent != null) { parent.addChild(current); } else { result.add(current); } } return result; } /** * Helper method for getting the category beans for the given site path.

* * @param cms the CMS context to use * @param sitePath the site path * @return the list of category beans * * @throws CmsException if something goes wrong */ public static List getCategoriesForSitePathStatic(CmsObject cms, String sitePath) throws CmsException { return getCategoriesForSitePathStatic(cms, sitePath, null); } /** * Helper method for getting the category beans for the given site path.

* * @param cms the CMS context to use * @param sitePath the site path * @param localCategoryRepositoryPath the categories for this repository are added separately * @return the list of category beans * * @throws CmsException if something goes wrong */ public static List getCategoriesForSitePathStatic( CmsObject cms, String sitePath, String localCategoryRepositoryPath) throws CmsException { List result; CmsCategoryService catService = CmsCategoryService.getInstance(); List categories; // get the categories if (null == localCategoryRepositoryPath) { categories = catService.readCategories(cms, "", true, sitePath); result = buildCategoryTree(cms, categories); } else { List repositories = catService.getCategoryRepositories(cms, sitePath); repositories.remove(localCategoryRepositoryPath); categories = catService.readCategoriesForRepositories(cms, "", true, repositories); result = buildCategoryTree(cms, categories); categories = catService.readCategoriesForRepositories( cms, "", true, Collections.singletonList(localCategoryRepositoryPath)); List localCategories = buildCategoryTree(cms, categories); result.addAll(localCategories); } return result; } /** * Returns the context menu entries for the given URI.

* * @param cms the cms context * @param structureId the currently requested structure id * @param context the ade context (sitemap or containerpage) * * @return the context menu entries */ public static List getContextMenuEntries( CmsObject cms, CmsUUID structureId, AdeContext context) { List result = Collections. emptyList(); try { if (context != null) { cms.getRequestContext().setAttribute(I_CmsMenuItemRule.ATTR_CONTEXT_INFO, context.toString()); } CmsResourceUtil[] resUtil = new CmsResourceUtil[1]; resUtil[0] = new CmsResourceUtil(cms, cms.readResource(structureId, CmsResourceFilter.ALL)); CmsResource resource = resUtil[0].getResource(); if (hasViewPermissions(cms, resource)) { String fallbackType = resource.isFolder() ? CmsResourceTypeFolder.getStaticTypeName() : CmsResourceTypePlain.getStaticTypeName(); String[] lookupTypes = {resUtil[0].getResourceTypeName(), fallbackType}; for (String currentType : lookupTypes) { // the explorer type settings CmsExplorerTypeSettings settings = OpenCms.getWorkplaceManager().getExplorerTypeSetting( currentType); // only if the user has access to this resource type if ((settings != null)) { // get the context menu configuration for the given selection mode CmsExplorerContextMenu contextMenu = settings.getContextMenu(); // transform the context menu into beans List allEntries = transformToMenuEntries( cms, contextMenu.getAllEntries(), resUtil); // filter the result result = filterEntries(allEntries); if (!result.isEmpty()) { break; } } } } } catch (CmsException e) { // ignore, the user probably has not enough permissions to read the resource LOG.debug(e.getLocalizedMessage(), e); } return result; } /** * Returns the file explorer link prefix. Append resource site path for complete link.

* * @param cms the cms context * @param siteRoot the site root * * @return the file explorer link prefix */ public static String getFileExplorerLink(CmsObject cms, String siteRoot) { return CmsVaadinUtils.getWorkplaceLink() + "#!" + CmsFileExplorerConfiguration.APP_ID + "/" + cms.getRequestContext().getCurrentProject().getUuid() + "!!" + siteRoot + "!!"; } /** * Returns the workplace link.

* * @param cms the cms context * @param structureId the structure id of the current resource * * @return the workplace link */ public static String getVaadinWorkplaceLink(CmsObject cms, CmsUUID structureId) { String resourceRootFolder = null; if (structureId != null) { try { resourceRootFolder = CmsResource.getFolderPath(cms.readResource(structureId).getRootPath()); } catch (CmsException e) { LOG.debug("Error reading resource for workplace link.", e); } } if (resourceRootFolder == null) { resourceRootFolder = cms.getRequestContext().getSiteRoot(); } return getVaadinWorkplaceLink(cms, resourceRootFolder); } /** * Returns the workplace link.

* * @param cms the cms context * @param resourceRootFolder the resource folder root path * * @return the workplace link */ public static String getVaadinWorkplaceLink(CmsObject cms, String resourceRootFolder) { CmsSite site = OpenCms.getSiteManager().getSiteForRootPath(resourceRootFolder); String siteRoot = site != null ? site.getSiteRoot() : OpenCms.getSiteManager().startsWithShared(resourceRootFolder) ? OpenCms.getSiteManager().getSharedFolder() : ""; String link = getFileExplorerLink(cms, siteRoot) + cms.getRequestContext().removeSiteRoot(resourceRootFolder); return link; } /** * Internal helper method for getting a validation service.

* * @param name the class name of the validation service * * @return the validation service * * @throws CmsException if something goes wrong */ public static I_CmsValidationService getValidationService(String name) throws CmsException { try { Class cls = Class.forName(name, false, I_CmsValidationService.class.getClassLoader()); if (!I_CmsValidationService.class.isAssignableFrom(cls)) { throw new CmsIllegalArgumentException( Messages.get().container(Messages.ERR_VALIDATOR_INCORRECT_TYPE_1, name)); } return (I_CmsValidationService)cls.newInstance(); } catch (ClassNotFoundException e) { throw new CmsException(Messages.get().container(Messages.ERR_VALIDATOR_INSTANTIATION_FAILED_1, name), e); } catch (InstantiationException e) { throw new CmsException(Messages.get().container(Messages.ERR_VALIDATOR_INSTANTIATION_FAILED_1, name), e); } catch (IllegalAccessException e) { throw new CmsException(Messages.get().container(Messages.ERR_VALIDATOR_INSTANTIATION_FAILED_1, name), e); } } /** * Instantiates a class given its name using its default constructor.

* * Also checks whether the class with the given name is the subclass of another class/interface.

* * * @param the type of the interface/class passed as a parameter * * @param anInterface the interface or class against which the class should be checked * @param className the name of the class * @return a new instance of the class * * @throws CmsException if the instantiation fails */ public static T instantiate(Class anInterface, String className) throws CmsException { try { Class cls = Class.forName(className, false, anInterface.getClassLoader()); if (!anInterface.isAssignableFrom(cls)) { // class was found, but does not implement the interface throw new CmsIllegalArgumentException( Messages.get().container( Messages.ERR_INSTANTIATION_INCORRECT_TYPE_2, className, anInterface.getName())); } // we use another variable so we don't have to put the @SuppressWarnings on the method itself @SuppressWarnings("unchecked") Class typedClass = (Class)cls; return typedClass.newInstance(); } catch (ClassNotFoundException e) { throw new CmsException(Messages.get().container(Messages.ERR_INSTANTIATION_FAILED_1, className), e); } catch (InstantiationException e) { throw new CmsException(Messages.get().container(Messages.ERR_INSTANTIATION_FAILED_1, className), e); } catch (IllegalAccessException e) { throw new CmsException(Messages.get().container(Messages.ERR_INSTANTIATION_FAILED_1, className), e); } } /** * Implementation method for getting the link for a given return code.

* * @param cms the CMS context * @param returnCode the return code * @return the link for the return code * * @throws CmsException if something goes wrong */ public static CmsReturnLinkInfo internalGetLinkForReturnCode(CmsObject cms, String returnCode) throws CmsException { if (CmsUUID.isValidUUID(returnCode)) { try { CmsResource pageRes = cms.readResource(new CmsUUID(returnCode), CmsResourceFilter.IGNORE_EXPIRATION); return new CmsReturnLinkInfo( OpenCms.getLinkManager().substituteLink(cms, pageRes), CmsReturnLinkInfo.Status.ok); } catch (CmsVfsResourceNotFoundException e) { LOG.debug(e.getLocalizedMessage(), e); return new CmsReturnLinkInfo(null, CmsReturnLinkInfo.Status.notfound); } } else { int colonIndex = returnCode.indexOf(':'); if (colonIndex >= 0) { String before = returnCode.substring(0, colonIndex); String after = returnCode.substring(colonIndex + 1); if (CmsUUID.isValidUUID(before) && CmsUUID.isValidUUID(after)) { try { CmsUUID pageId = new CmsUUID(before); CmsUUID detailId = new CmsUUID(after); CmsResource pageRes = cms.readResource(pageId); CmsResource folder = pageRes.isFolder() ? pageRes : cms.readParentFolder(pageRes.getStructureId()); String pageLink = OpenCms.getLinkManager().substituteLink(cms, folder); CmsResource detailRes = cms.readResource(detailId); String detailName = cms.getDetailName( detailRes, cms.getRequestContext().getLocale(), OpenCms.getLocaleManager().getDefaultLocales()); String link = CmsFileUtil.removeTrailingSeparator(pageLink) + "/" + detailName; return new CmsReturnLinkInfo(link, CmsReturnLinkInfo.Status.ok); } catch (CmsVfsResourceNotFoundException e) { LOG.debug(e.getLocalizedMessage(), e); return new CmsReturnLinkInfo(null, CmsReturnLinkInfo.Status.notfound); } } } throw new IllegalArgumentException("return code has wrong format"); } } /** * Fetches the core data.

* * @param request the current request * * @return the core data */ public static CmsCoreData prefetch(HttpServletRequest request) { CmsCoreService srv = new CmsCoreService(); srv.setCms(CmsFlexController.getCmsObject(request)); srv.setRequest(request); CmsCoreData result = null; try { result = srv.prefetch(); } finally { srv.clearThreadStorage(); } return result; } /** * Filters the collection of menu entry beans.

* *

    *
  • removes unnecessary separators
  • *
  • filters sub menus also
  • *
  • adds visible entries to the result
  • *
* * @see org.opencms.gwt.shared.CmsContextMenuEntryBean * * @param allEntries the entries to filter * * @return the filtered list of menu entries */ private static List filterEntries(List allEntries) { // the resulting list List result = new ArrayList(); CmsContextMenuEntryBean lastBean = null; // iterate over the list of collected menu entries to do the filtering for (CmsContextMenuEntryBean entry : allEntries) { if (entry.isVisible()) { // only if the entry is enabled if (entry.isSeparator()) { if (!result.isEmpty()) { // the entry is a separator and it isn't the first entry in the menu if ((lastBean != null) && !lastBean.isSeparator()) { // and there are no two separators behind each other // add the separator result.add(entry); } } } else if ((entry.getSubMenu() != null) && !entry.getSubMenu().isEmpty()) { // the entry has a sub menu, so filter the entries of the sub menu entry.setSubMenu(filterEntries(entry.getSubMenu())); // add the entry with sub menu result.add(entry); } else { // it's a common entry, so add it result.add(entry); } // store the last entry to check the separator lastBean = entry; } } // after the filtering is finished, remove the last separator if it is existent if (result.size() > 1) { if (result.get(result.size() - 1).isSeparator()) { result.remove(result.size() - 1); } } return result; } /** * FInds a category in the given tree.

* * @param tree the the tree to search in * @param path the path to search for * * @return the category with the given path or null if not found */ private static CmsCategoryTreeEntry findCategory(List tree, String path) { if (path == null) { return null; } // we assume that the category to find is descendant of tree List children = tree; boolean found = true; while (found) { if (children == null) { return null; } // since the categories are sorted it is faster to go backwards found = false; for (int i = children.size() - 1; i >= 0; i--) { CmsCategoryTreeEntry child = children.get(i); if (path.equals(child.getPath())) { return child; } if (path.startsWith(child.getPath())) { children = child.getChildren(); found = true; break; } } } return null; } /** * Collects the matching rules of all sub items of a parent context menu entry.

* * @param cms the cms context * @param item the context menu item to check the sub items for * @param itemRules the collected rules for the sub items * @param resourceUtil the resources to be checked against the rules */ private static void getSubItemRules( CmsObject cms, CmsExplorerContextMenuItem item, List itemRules, CmsResourceUtil[] resourceUtil) { for (CmsExplorerContextMenuItem subItem : item.getSubItems()) { if (subItem.isParentItem()) { // this is a parent item, recurse into sub items getSubItemRules(cms, subItem, itemRules, resourceUtil); } else if (CmsExplorerContextMenuItem.TYPE_ENTRY.equals(subItem.getType())) { // this is a standard entry, get the matching rule to add to the list String subItemRuleName = subItem.getRule(); CmsMenuRule subItemRule = OpenCms.getWorkplaceManager().getMenuRule(subItemRuleName); if (subItemRule != null) { I_CmsMenuItemRule rule = subItemRule.getMatchingRule(cms, resourceUtil); if (rule != null) { itemRules.add(rule); } } } } } /** * Checks if the current user has view permissions on the given resource.

* * @param cms the current cms context * @param resource the resource to check * * @return true if the current user has view permissions on the given resource */ private static boolean hasViewPermissions(CmsObject cms, CmsResource resource) { try { return cms.hasPermissions(resource, CmsPermissionSet.ACCESS_VIEW, false, CmsResourceFilter.ALL); } catch (CmsException e) { LOG.debug(e.getLocalizedMessage(), e); return false; } } /** * Returns a list of menu entry beans.

* * Takes the given List of explorer context menu items and converts them to context menu entry beans.

* * @see org.opencms.gwt.shared.CmsContextMenuEntryBean * @see org.opencms.workplace.explorer.CmsExplorerContextMenuItem * * @param cms the cms context * @param items the menu items * @param resUtil a resource utility array * * @return a list of menu entries */ private static List transformToMenuEntries( CmsObject cms, List items, CmsResourceUtil[] resUtil) { // the resulting list List result = new ArrayList(); // get the workplace manager CmsWorkplaceManager wpManager = OpenCms.getWorkplaceManager(); // get the workplace message bundle CmsMessages messages = wpManager.getMessages(wpManager.getWorkplaceLocale(cms)); for (CmsExplorerContextMenuItem item : items) { CmsContextMenuEntryBean bean = new CmsContextMenuEntryBean(); if (!CmsExplorerContextMenuItem.TYPE_SEPARATOR.equals(item.getType())) { // this item is no separator (common entry or sub menu entry) // set the label to the bean if (item.getKey() != null) { bean.setLabel(messages.key(item.getKey())); } // get the mode and set the bean CmsMenuItemVisibilityMode mode = CmsMenuItemVisibilityMode.VISIBILITY_INVISIBLE; String itemRuleName = item.getRule(); if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(itemRuleName)) { CmsMenuRule rule = wpManager.getMenuRule(itemRuleName); if (rule != null) { // get the first matching rule to apply for visibility I_CmsMenuItemRule itemRule = rule.getMatchingRule(cms, resUtil); if (itemRule != null) { if (item.isParentItem()) { // get the rules for the sub items List itemRules = new ArrayList( item.getSubItems().size()); getSubItemRules(cms, item, itemRules, resUtil); I_CmsMenuItemRule[] itemRulesArray = new I_CmsMenuItemRule[itemRules.size()]; // determine the visibility for the parent item mode = itemRule.getVisibility(cms, resUtil, itemRules.toArray(itemRulesArray)); } else { if (itemRule instanceof A_CmsMenuItemRule) { mode = ((A_CmsMenuItemRule)itemRule).getVisibility(cms, resUtil, item); } else { mode = itemRule.getVisibility(cms, resUtil); } } } } } // set the visibility to the bean bean.setVisible(!mode.isInVisible()); // set the activate info to the bean if (item.isParentItem()) { // parent entries that have visible sub entries are always active bean.setActive(true); } else { // common entries can be activated or de-activated bean.setActive(mode.isActive()); if (CmsStringUtil.isNotEmpty(mode.getMessageKey())) { bean.setReason(messages.key(CmsEncoder.escapeXml(mode.getMessageKey()))); } } // get the JSP-URI and set it to the bean String jspPath = item.getUri(); if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(jspPath)) { if (item.getUri().startsWith("/")) { jspPath = OpenCms.getLinkManager().substituteLink(cms, item.getUri()); } else { jspPath = OpenCms.getLinkManager().substituteLink( cms, CmsWorkplace.PATH_WORKPLACE + item.getUri()); } } bean.setJspPath(jspPath); String params = item.getParams(); if (params != null) { params = CmsVfsService.prepareFileNameForEditor(cms, resUtil[0].getResource(), params); bean.setParams(CmsStringUtil.splitAsMap(params, "|", "=")); } // get the name of the item and set it to the bean bean.setName(item.getName()); } if (item.isParentItem()) { // this item has a sub menu bean.setSubMenu(transformToMenuEntries(cms, item.getSubItems(), resUtil)); } if (CmsExplorerContextMenuItem.TYPE_SEPARATOR.equals(item.getType())) { // this item is a separator bean.setVisible(true); bean.setSeparator(true); } result.add(bean); } return result; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#changePassword(java.lang.String, java.lang.String, java.lang.String) */ public String changePassword(String oldPassword, String newPassword, String newPasswordConfirm) throws CmsRpcException { CmsObject cms = getCmsObject(); CmsPasswordInfo passwordBean = new CmsPasswordInfo(cms); Locale wpLocale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms); try { passwordBean.setCurrentPwd(oldPassword); passwordBean.setNewPwd(newPassword); passwordBean.setConfirmation(newPasswordConfirm); passwordBean.applyChanges(); return null; } catch (CmsSecurityException e) { LOG.error(e.getLocalizedMessage(), e); return e.getMessageContainer().key(wpLocale); } catch (CmsIllegalArgumentException e) { LOG.warn(e.getLocalizedMessage(), e); return e.getMessageContainer().key(wpLocale); } catch (Exception e) { error(e); return null; // will never be executed } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#createUUID() */ public CmsUUID createUUID() { return new CmsUUID(); } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getBroadcast() */ public List getBroadcast() { OpenCms.getWorkplaceManager().checkWorkplaceRequest(getRequest(), getCmsObject()); CmsSessionInfo sessionInfo = OpenCms.getSessionManager().getSessionInfo(getRequest().getSession()); if (sessionInfo == null) { return null; } String sessionId = sessionInfo.getSessionId().toString(); Buffer messageQueue = OpenCms.getSessionManager().getBroadcastQueue(sessionId); if (!messageQueue.isEmpty()) { CmsMessages messages = org.opencms.workplace.Messages.get().getBundle( OpenCms.getWorkplaceManager().getWorkplaceLocale(getCmsObject())); List result = new ArrayList(); // the user has pending messages, display them all while (!messageQueue.isEmpty()) { CmsBroadcast broadcastMessage = (CmsBroadcast)messageQueue.remove(); CmsBroadcastMessage message = new CmsBroadcastMessage( broadcastMessage.getUser() != null ? broadcastMessage.getUser().getName() : messages.key(org.opencms.workplace.Messages.GUI_LABEL_BROADCAST_FROM_SYSTEM_0), messages.getDateTime(broadcastMessage.getSendTime()), broadcastMessage.getMessage()); result.add(message); } return result; } // no message pending, return null return null; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getCategories(java.lang.String, boolean, java.util.List) */ public List getCategories(String fromPath, boolean includeSubCats, List refPaths) throws CmsRpcException { CmsObject cms = getCmsObject(); CmsCategoryService catService = CmsCategoryService.getInstance(); List repositories = new ArrayList(); if ((refPaths != null) && !refPaths.isEmpty()) { for (String refPath : refPaths) { repositories.addAll(catService.getCategoryRepositories(getCmsObject(), refPath)); } } else { repositories.add(CmsCategoryService.CENTRALIZED_REPOSITORY); } List result = null; try { // get the categories List categories = catService.readCategoriesForRepositories( cms, fromPath, includeSubCats, repositories); result = buildCategoryTree(cms, categories); } catch (Throwable e) { error(e); } return result; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getCategoriesForSitePath(java.lang.String) */ public List getCategoriesForSitePath(String sitePath) throws CmsRpcException { List result = null; CmsObject cms = getCmsObject(); try { result = getCategoriesForSitePathStatic(cms, sitePath); } catch (Throwable e) { error(e); } return result; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getCategoryInfo(org.opencms.util.CmsUUID) */ public CmsResourceCategoryInfo getCategoryInfo(CmsUUID structureId) throws CmsRpcException { CmsObject cms = getCmsObject(); CmsCategoryService catService = CmsCategoryService.getInstance(); try { CmsResource resource = cms.readResource(structureId, CmsResourceFilter.ignoreExpirationOffline(cms)); List categories = catService.readResourceCategories(cms, resource); List currentCategories = new ArrayList(); for (CmsCategory category : categories) { currentCategories.add(category.getPath()); } return new CmsResourceCategoryInfo( structureId, CmsVfsService.getPageInfoWithLock(cms, resource), currentCategories, getCategories(null, true, Collections.singletonList(cms.getSitePath(resource)))); } catch (CmsException e) { error(e); } return null; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getContextMenuEntries(org.opencms.util.CmsUUID, org.opencms.gwt.shared.CmsCoreData.AdeContext) */ public List getContextMenuEntries(CmsUUID structureId, AdeContext context) throws CmsRpcException { List result = null; try { result = getContextMenuEntries(getCmsObject(), structureId, context); } catch (Throwable e) { error(e); } return result; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getLinkForReturnCode(java.lang.String) */ public CmsReturnLinkInfo getLinkForReturnCode(String returnCode) throws CmsRpcException { try { return internalGetLinkForReturnCode(getCmsObject(), returnCode); } catch (Throwable e) { error(e); return null; } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getResourceState(org.opencms.util.CmsUUID) */ public CmsResourceState getResourceState(CmsUUID structureId) throws CmsRpcException { CmsObject cms = getCmsObject(); CmsResourceState result = null; try { try { CmsResource res = cms.readResource(structureId); result = res.getState(); } catch (CmsVfsResourceNotFoundException e) { LOG.debug(e.getLocalizedMessage(), e); result = CmsResourceState.STATE_DELETED; } } catch (CmsException e) { error(e); } return result; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getUniqueFileName(java.lang.String, java.lang.String) */ public String getUniqueFileName(String parentFolder, String baseName) { return OpenCms.getResourceManager().getNameGenerator().getUniqueFileName( getCmsObject(), parentFolder, baseName); } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getUserInfo() */ public UserInfo getUserInfo() { CmsObject cms = getCmsObject(); CmsRoleManager roleManager = OpenCms.getRoleManager(); boolean isAdmin = roleManager.hasRole(cms, CmsRole.ADMINISTRATOR); boolean isDeveloper = roleManager.hasRole(cms, CmsRole.DEVELOPER); boolean isCategoryManager = roleManager.hasRole(cms, CmsRole.CATEGORY_EDITOR); boolean isWorkplaceUser = roleManager.hasRole(cms, CmsRole.WORKPLACE_USER); UserInfo userInfo = new UserInfo( cms.getRequestContext().getCurrentUser().getName(), OpenCms.getWorkplaceAppManager().getUserIconHelper().getSmallIconPath( cms, cms.getRequestContext().getCurrentUser()), isAdmin, isDeveloper, isCategoryManager, isWorkplaceUser, cms.getRequestContext().getCurrentUser().isManaged()); return userInfo; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#getWorkplaceLink(org.opencms.util.CmsUUID, org.opencms.gwt.shared.CmsWorkplaceLinkMode) */ public String getWorkplaceLink(CmsUUID structureId, CmsWorkplaceLinkMode linkMode) throws CmsRpcException { String result = null; CmsObject cms = getCmsObject(); try { String resourceRootFolder = structureId != null ? CmsResource.getFolderPath(cms.readResource(structureId).getRootPath()) : cms.getRequestContext().getSiteRoot(); switch (linkMode) { case oldWorkplace: result = CmsWorkplace.getWorkplaceExplorerLink(cms, resourceRootFolder); break; case newWorkplace: result = getVaadinWorkplaceLink(cms, resourceRootFolder); break; case auto: default: boolean newWp = CmsWorkplace.getWorkplaceSettings( cms, getRequest()).getUserSettings().usesNewWorkplace(); result = getWorkplaceLink( structureId, newWp ? CmsWorkplaceLinkMode.newWorkplace : CmsWorkplaceLinkMode.oldWorkplace); break; } } catch (Throwable e) { error(e); } return result; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#loadUserSettings() */ public CmsUserSettingsBean loadUserSettings() throws CmsRpcException { CmsObject cms = getCmsObject(); CmsClientUserSettingConverter converter = new CmsClientUserSettingConverter(cms, getRequest(), getResponse()); try { return converter.loadSettings(); } catch (Exception e) { error(e); return null; } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#lockIfExists(java.lang.String) */ public String lockIfExists(String sitePath) throws CmsRpcException { CmsObject cms = getCmsObject(); String errorMessage = null; try { if (cms.existsResource(sitePath, CmsResourceFilter.IGNORE_EXPIRATION)) { try { ensureLock(cms.readResource(sitePath, CmsResourceFilter.IGNORE_EXPIRATION)); } catch (CmsException e) { errorMessage = e.getLocalizedMessage(OpenCms.getWorkplaceManager().getWorkplaceLocale(cms)); } } else { // check if parent folder may be locked by the current user String parentFolder = CmsResource.getParentFolder(sitePath); while ((parentFolder != null) && !cms.existsResource(parentFolder, CmsResourceFilter.IGNORE_EXPIRATION)) { parentFolder = CmsResource.getParentFolder(parentFolder); } if (parentFolder != null) { CmsResource ancestorFolder = cms.readResource(parentFolder, CmsResourceFilter.IGNORE_EXPIRATION); CmsUser user = cms.getRequestContext().getCurrentUser(); CmsLock lock = cms.getLock(ancestorFolder); if (!lock.isLockableBy(user)) { errorMessage = "Can not lock parent folder '" + parentFolder + "'."; } } else { errorMessage = "Can not access any parent folder."; } } } catch (Throwable e) { error(e); } return errorMessage; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#lockTemp(org.opencms.util.CmsUUID) */ public String lockTemp(CmsUUID structureId) throws CmsRpcException { CmsObject cms = getCmsObject(); try { try { ensureLock(structureId); } catch (CmsException e) { return e.getLocalizedMessage(OpenCms.getWorkplaceManager().getWorkplaceLocale(cms)); } } catch (Throwable e) { error(e); } return null; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#lockTempAndCheckModification(org.opencms.util.CmsUUID, long) */ public CmsLockInfo lockTempAndCheckModification(CmsUUID structureId, long modification) throws CmsRpcException { CmsObject cms = getCmsObject(); try { CmsResource resource = cms.readResource(structureId, CmsResourceFilter.IGNORE_EXPIRATION); if (resource.getDateLastModified() != modification) { CmsUser user = cms.readUser(resource.getUserLastModified()); return CmsLockInfo.forChangedResource(user.getFullName()); } } catch (Throwable e) { error(e); } try { return getLock(structureId); } catch (CmsException e) { return CmsLockInfo.forError(e.getLocalizedMessage()); } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#ping() */ public void ping() { // do nothing } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#prefetch() */ public CmsCoreData prefetch() { CmsObject cms = getCmsObject(); String navigationUri = cms.getRequestContext().getUri(); boolean toolbarVisible = CmsADESessionCache.getCache(getRequest(), getCmsObject()).isToolbarVisible(); boolean isShowHelp = OpenCms.getADEManager().isShowEditorHelp(cms); CmsUUID structureId = null; try { CmsResource requestedResource = cms.readResource(cms.getRequestContext().getUri()); structureId = requestedResource.getStructureId(); } catch (CmsException e) { // may happen in case of VAADIN UI LOG.debug("Could not read resource for URI.", e); structureId = CmsUUID.getNullUUID(); } String loginUrl = CmsWorkplaceLoginHandler.LOGIN_FORM; try { loginUrl = cms.readPropertyObject( cms.getRequestContext().getUri(), CmsPropertyDefinition.PROPERTY_LOGIN_FORM, true).getValue(loginUrl); } catch (CmsException e) { log(e.getLocalizedMessage(), e); } String defaultWorkplaceLink = CmsWorkplace.getWorkplaceExplorerLink(cms, cms.getRequestContext().getSiteRoot()); Locale wpLocale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms); UserInfo userInfo = getUserInfo(); String aboutLink = OpenCms.getLinkManager().substituteLink( getCmsObject(), "/system/modules/org.opencms.gwt/about.jsp"); CmsCoreData data = new CmsCoreData( EDITOR_URI, EDITOR_BACKLINK_URI, loginUrl, OpenCms.getStaticExportManager().getVfsPrefix(), getFileExplorerLink(cms, cms.getRequestContext().getSiteRoot()), OpenCms.getSystemInfo().getStaticResourceContext(), CmsEmbeddedDialogsUI.getEmbeddedDialogsContextPath(), cms.getRequestContext().getSiteRoot(), cms.getRequestContext().getLocale().toString(), wpLocale.toString(), cms.getRequestContext().getUri(), navigationUri, structureId, new HashMap(OpenCms.getResourceManager().getExtensionMapping()), System.currentTimeMillis(), isShowHelp, toolbarVisible, defaultWorkplaceLink, aboutLink, userInfo, OpenCms.getWorkplaceManager().getFileBytesMaxUploadSize(getCmsObject()), OpenCms.getWorkplaceManager().isKeepAlive(), OpenCms.getADEManager().getParameters(getCmsObject())); return data; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#saveUserSettings(java.util.Map, java.util.Set) */ public void saveUserSettings(Map userSettings, Set edited) throws CmsRpcException { try { CmsObject cms = getCmsObject(); CmsClientUserSettingConverter converter = new CmsClientUserSettingConverter( cms, getRequest(), getResponse()); userSettings.keySet().retainAll(edited); converter.saveSettings(userSettings); } catch (Exception e) { error(e); } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#setResourceCategories(org.opencms.util.CmsUUID, java.util.List) */ public void setResourceCategories(CmsUUID structureId, List categories) throws CmsRpcException { CmsObject cms = getCmsObject(); CmsCategoryService catService = CmsCategoryService.getInstance(); try { CmsResource resource = cms.readResource(structureId, CmsResourceFilter.IGNORE_EXPIRATION); ensureLock(resource); String sitePath = cms.getSitePath(resource); List previousCategories = catService.readResourceCategories(cms, resource); for (CmsCategory category : previousCategories) { if (categories.contains(category.getPath())) { categories.remove(category.getPath()); } else { catService.removeResourceFromCategory(cms, sitePath, category); } } for (String path : categories) { catService.addResourceToCategory(cms, sitePath, path); } tryUnlock(resource); } catch (Throwable t) { error(t); } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#setShowEditorHelp(boolean) */ public void setShowEditorHelp(boolean visible) throws CmsRpcException { try { OpenCms.getADEManager().setShowEditorHelp(getCmsObject(), visible); } catch (Throwable e) { error(e); } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#setToolbarVisible(boolean) */ public void setToolbarVisible(boolean visible) throws CmsRpcException { try { ensureSession(); CmsADESessionCache.getCache(getRequest(), getCmsObject()).setToolbarVisible(visible); } catch (Throwable e) { error(e); } } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#unlock(org.opencms.util.CmsUUID) */ public String unlock(CmsUUID structureId) throws CmsRpcException { CmsObject cms = getCmsObject(); try { CmsResource resource = cms.readResource(structureId, CmsResourceFilter.IGNORE_EXPIRATION); tryUnlock(resource); } catch (CmsException e) { return e.getLocalizedMessage(OpenCms.getWorkplaceManager().getWorkplaceLocale(cms)); } catch (Throwable e) { error(e); } return null; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#unlock(java.lang.String) */ public String unlock(String sitePath) throws CmsRpcException { try { CmsObject cms = OpenCms.initCmsObject(getCmsObject()); cms.getRequestContext().setSiteRoot(""); if (cms.existsResource(sitePath, CmsResourceFilter.IGNORE_EXPIRATION)) { CmsResource resource = cms.readResource(sitePath, CmsResourceFilter.IGNORE_EXPIRATION); tryUnlock(resource); } } catch (CmsException e) { return e.getLocalizedMessage(OpenCms.getWorkplaceManager().getWorkplaceLocale(getCmsObject())); } catch (Throwable e) { error(e); } return null; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#validate(java.util.Map) */ public Map validate(Map validationQueries) throws CmsRpcException { try { Map result = new HashMap(); for (Map.Entry queryEntry : validationQueries.entrySet()) { String fieldName = queryEntry.getKey(); CmsValidationQuery query = queryEntry.getValue(); result.put(fieldName, validate(query.getValidatorId(), query.getValue(), query.getConfig())); } return result; } catch (Throwable e) { error(e); } return null; } /** * @see org.opencms.gwt.shared.rpc.I_CmsCoreService#validate(java.lang.String, java.util.Map, java.util.Map, java.lang.String) */ public Map validate( String formValidatorClass, Map validationQueries, Map values, String config) throws CmsRpcException { try { I_CmsFormValidator formValidator = instantiate(I_CmsFormValidator.class, formValidatorClass); return formValidator.validate(getCmsObject(), validationQueries, values, config); } catch (Throwable e) { error(e); } return null; } /** * Collect GWT build ids from the different ADE modules.

* * @return the map of GWT build ids */ protected Map getBuildIds() { List modules = OpenCms.getModuleManager().getAllInstalledModules(); Map result = new HashMap(); for (CmsModule module : modules) { String buildid = module.getParameter(CmsCoreData.KEY_GWT_BUILDID); if (buildid != null) { result.put(module.getName(), buildid); } } return result; } /** * Helper method for locking a resource which returns some information on whether the locking * failed, and why.

* * @param structureId the structure id of the resource * @return the locking information * * @throws CmsException if something went wrong */ protected CmsLockInfo getLock(CmsUUID structureId) throws CmsException { CmsResource res = getCmsObject().readResource(structureId, CmsResourceFilter.IGNORE_EXPIRATION); return getLock(getCmsObject().getSitePath(res)); } /** * Helper method for locking a resource which returns some information on whether the locking * failed, and why.

* * @param sitepath the site path of the resource to lock * @return the locking information * * @throws CmsException if something went wrong */ protected CmsLockInfo getLock(String sitepath) throws CmsException { CmsObject cms = getCmsObject(); CmsUser user = cms.getRequestContext().getCurrentUser(); CmsLock lock = cms.getLock(sitepath); if (lock.isOwnedBy(user)) { return CmsLockInfo.forSuccess(); } if (lock.getUserId().isNullUUID()) { cms.lockResourceTemporary(sitepath); return CmsLockInfo.forSuccess(); } CmsUser owner = cms.readUser(lock.getUserId()); return CmsLockInfo.forLockedResource(owner.getName()); } /** * Internal helper method for validating a single value.

* * @param validator the class name of the validation service * @param value the value to validate * @param config the configuration for the validation service * * @return the result of the validation * * @throws Exception if something goes wrong */ private CmsValidationResult validate(String validator, String value, String config) throws Exception { I_CmsValidationService validationService = getValidationService(validator); return validationService.validate(getCmsObject(), value, config); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy