org.opencms.ade.containerpage.CmsContainerpageService Maven / Gradle / Ivy
Show all versions of opencms-test Show documentation
/*
* 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.ade.containerpage;
import org.opencms.ade.configuration.CmsADEConfigData;
import org.opencms.ade.configuration.CmsADEManager;
import org.opencms.ade.configuration.CmsElementView;
import org.opencms.ade.configuration.CmsModelPageConfig;
import org.opencms.ade.configuration.CmsResourceTypeConfig;
import org.opencms.ade.containerpage.inherited.CmsInheritanceReference;
import org.opencms.ade.containerpage.inherited.CmsInheritanceReferenceParser;
import org.opencms.ade.containerpage.inherited.CmsInheritedContainerState;
import org.opencms.ade.containerpage.shared.CmsCntPageData;
import org.opencms.ade.containerpage.shared.CmsCntPageData.ElementDeleteMode;
import org.opencms.ade.containerpage.shared.CmsCntPageData.ElementReuseMode;
import org.opencms.ade.containerpage.shared.CmsContainer;
import org.opencms.ade.containerpage.shared.CmsContainerElement;
import org.opencms.ade.containerpage.shared.CmsContainerElement.ModelGroupState;
import org.opencms.ade.containerpage.shared.CmsContainerElementData;
import org.opencms.ade.containerpage.shared.CmsContainerPageGalleryData;
import org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext;
import org.opencms.ade.containerpage.shared.CmsCreateElementData;
import org.opencms.ade.containerpage.shared.CmsElementViewInfo;
import org.opencms.ade.containerpage.shared.CmsFormatterConfig;
import org.opencms.ade.containerpage.shared.CmsGroupContainer;
import org.opencms.ade.containerpage.shared.CmsGroupContainerSaveResult;
import org.opencms.ade.containerpage.shared.CmsInheritanceContainer;
import org.opencms.ade.containerpage.shared.CmsInheritanceInfo;
import org.opencms.ade.containerpage.shared.CmsLocaleLinkBean;
import org.opencms.ade.containerpage.shared.CmsRemovedElementStatus;
import org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService;
import org.opencms.ade.detailpage.CmsDetailPageResourceHandler;
import org.opencms.ade.galleries.CmsGalleryService;
import org.opencms.ade.galleries.shared.CmsGalleryDataBean;
import org.opencms.ade.galleries.shared.CmsGallerySearchBean;
import org.opencms.ade.galleries.shared.CmsResourceTypeBean;
import org.opencms.ade.galleries.shared.CmsVfsEntryBean;
import org.opencms.ade.galleries.shared.I_CmsGalleryProviderConstants.GalleryTabId;
import org.opencms.ade.sitemap.CmsVfsSitemapService;
import org.opencms.file.CmsFile;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProperty;
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.CmsResourceTypeXmlContainerPage;
import org.opencms.file.types.CmsResourceTypeXmlContent;
import org.opencms.file.types.I_CmsResourceType;
import org.opencms.flex.CmsFlexController;
import org.opencms.gwt.CmsDefaultResourceStatusProvider;
import org.opencms.gwt.CmsGwtActionElement;
import org.opencms.gwt.CmsGwtService;
import org.opencms.gwt.CmsRpcException;
import org.opencms.gwt.CmsVfsService;
import org.opencms.gwt.shared.CmsListInfoBean;
import org.opencms.gwt.shared.CmsModelResourceInfo;
import org.opencms.gwt.shared.CmsTemplateContextInfo;
import org.opencms.i18n.CmsLocaleGroup;
import org.opencms.i18n.CmsLocaleManager;
import org.opencms.jsp.CmsJspTagContainer;
import org.opencms.jsp.util.CmsJspStandardContextBean.TemplateBean;
import org.opencms.loader.CmsTemplateContextManager;
import org.opencms.lock.CmsLock;
import org.opencms.lock.CmsLockType;
import org.opencms.main.CmsException;
import org.opencms.main.CmsIllegalArgumentException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.relations.CmsRelation;
import org.opencms.relations.CmsRelationFilter;
import org.opencms.relations.CmsRelationType;
import org.opencms.search.CmsSearchIndex;
import org.opencms.search.galleries.CmsGallerySearch;
import org.opencms.search.galleries.CmsGallerySearchResult;
import org.opencms.security.CmsPermissionSet;
import org.opencms.security.CmsRole;
import org.opencms.site.CmsSiteManagerImpl;
import org.opencms.ui.apps.CmsQuickLaunchLocationCache;
import org.opencms.util.CmsPair;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.CmsWorkplace;
import org.opencms.workplace.CmsWorkplaceSettings;
import org.opencms.workplace.editors.CmsWorkplaceEditorManager;
import org.opencms.workplace.explorer.CmsResourceUtil;
import org.opencms.xml.CmsXmlException;
import org.opencms.xml.containerpage.CmsADESessionCache;
import org.opencms.xml.containerpage.CmsContainerBean;
import org.opencms.xml.containerpage.CmsContainerElementBean;
import org.opencms.xml.containerpage.CmsContainerPageBean;
import org.opencms.xml.containerpage.CmsFormatterConfiguration;
import org.opencms.xml.containerpage.CmsGroupContainerBean;
import org.opencms.xml.containerpage.CmsMacroFormatterBean;
import org.opencms.xml.containerpage.CmsXmlContainerPage;
import org.opencms.xml.containerpage.CmsXmlContainerPageFactory;
import org.opencms.xml.containerpage.CmsXmlGroupContainer;
import org.opencms.xml.containerpage.CmsXmlGroupContainerFactory;
import org.opencms.xml.containerpage.I_CmsFormatterBean;
import org.opencms.xml.content.CmsXmlContent;
import org.opencms.xml.content.CmsXmlContentFactory;
import org.opencms.xml.content.CmsXmlContentProperty;
import org.opencms.xml.content.CmsXmlContentPropertyHelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
/**
* The RPC service used by the container-page editor.
*
* @since 8.0.0
*/
public class CmsContainerpageService extends CmsGwtService implements I_CmsContainerpageService {
/**
* Helper class used to determine both the available views and the active start view when loading a container page.
*/
private class InitialElementViewProvider {
/** Start view id. */
private CmsUUID m_defaultView;
/** Map of available views. */
private Map m_viewMap;
/**
* Empty default constructor.
*/
public InitialElementViewProvider() {
// do nothing
}
/**
* Returns the default view info.
*
* @return the default view info
*/
public CmsElementViewInfo getDefaultView() {
return getViewMap().get(getDefaultViewId());
}
/**
* Gets the start view id.
*
* @return the start view id
*/
public CmsUUID getDefaultViewId() {
return m_defaultView;
}
/**
* Gets the map of available views.
*
* @return the map of available views
*/
public Map getViewMap() {
return m_viewMap;
}
/**
* Initializes this object.
*
* @param defaultValue the default view id from the session cache
* @param checkRes the resource used to check permissions
*/
@SuppressWarnings("synthetic-access")
public void init(CmsUUID defaultValue, CmsResource checkRes) {
Map result = new LinkedHashMap();
CmsObject cms = getCmsObject();
// collect the actually used element view ids
CmsADEConfigData config = getConfigData(
cms.getRequestContext().addSiteRoot(cms.getRequestContext().getUri()));
Set usedIds = new HashSet();
for (CmsResourceTypeConfig typeConfig : config.getResourceTypes()) {
usedIds.add(typeConfig.getElementView());
}
Locale wpLocale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms);
Map realViewMap = OpenCms.getADEManager().getElementViews(cms);
Set parentIds = Sets.newHashSet();
for (CmsElementView view : realViewMap.values()) {
if (view.getParentViewId() != null) {
parentIds.add(view.getParentViewId());
}
// add only element view that are used within the type configuration and the user has sufficient permissions for
if (usedIds.contains(view.getId()) && view.hasPermission(cms, checkRes) && !view.isOther()) {
result.put(view.getId(), new CmsElementViewInfo(view.getTitle(cms, wpLocale), view.getId()));
}
}
m_viewMap = result;
for (Map.Entry viewEntry : m_viewMap.entrySet()) {
CmsElementView realView = realViewMap.get(viewEntry.getKey());
CmsUUID parentViewId = realView.getParentViewId();
if ((parentViewId != null) && !parentIds.contains(viewEntry.getKey())) {
CmsElementViewInfo parentBean = m_viewMap.get(parentViewId);
if (parentBean != null) {
viewEntry.getValue().setParent(parentBean);
}
}
}
if (m_viewMap.containsKey(defaultValue)) {
m_defaultView = defaultValue;
} else if (m_viewMap.containsKey(CmsElementView.DEFAULT_ELEMENT_VIEW.getId())) {
m_defaultView = CmsElementView.DEFAULT_ELEMENT_VIEW.getId();
} else if (!m_viewMap.isEmpty()) {
m_defaultView = m_viewMap.values().iterator().next().getElementViewId();
} else {
m_defaultView = defaultValue;
LOG.error(
"Initial view not available and no suitable replacement view found: user="
+ getCmsObject().getRequestContext().getCurrentUser().getName()
+ " view="
+ defaultValue
+ " path="
+ checkRes.getRootPath());
}
}
}
/** Additional info key for storing the "edit small elements" setting on the user. */
public static final String ADDINFO_EDIT_SMALL_ELEMENTS = "EDIT_SMALL_ELEMENTS";
/** Session attribute name used to store the selected clipboard tab. */
public static final String ATTR_CLIPBOARD_TAB = "clipboardtab";
/** The model group pages path fragment. */
public static final String MODEL_GROUP_PATH_FRAGMENT = "/.content/.modelgroups/";
/** The source container page id settings key. */
public static final String SOURCE_CONTAINERPAGE_ID_SETTING = "source_containerpage_id";
/** Static reference to the log. */
private static final Log LOG = CmsLog.getLog(CmsContainerpageService.class);
/** Serial version UID. */
private static final long serialVersionUID = -6188370638303594280L;
/** The configuration data of the current container page context. */
private CmsADEConfigData m_configData;
/** The session cache. */
private CmsADESessionCache m_sessionCache;
/** The workplace settings. */
private CmsWorkplaceSettings m_workplaceSettings;
/**
* Generates the model resource data list.
*
* @param cms the cms context
* @param resourceType the resource type name
* @param modelResources the model resource
* @param contentLocale the content locale
*
* @return the model resources data
*
* @throws CmsException if something goes wrong reading the resource information
*/
public static List generateModelResourceList(
CmsObject cms,
String resourceType,
List modelResources,
Locale contentLocale)
throws CmsException {
List result = new ArrayList();
Locale wpLocale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms);
CmsModelResourceInfo defaultInfo = new CmsModelResourceInfo(
Messages.get().getBundle(wpLocale).key(Messages.GUI_TITLE_DEFAULT_RESOURCE_CONTENT_0),
Messages.get().getBundle(wpLocale).key(Messages.GUI_DESCRIPTION_DEFAULT_RESOURCE_CONTENT_0),
null);
defaultInfo.setResourceType(resourceType);
result.add(defaultInfo);
for (CmsResource model : modelResources) {
CmsGallerySearchResult searchInfo = CmsGallerySearch.searchById(cms, model.getStructureId(), contentLocale);
CmsModelResourceInfo modelInfo = new CmsModelResourceInfo(
searchInfo.getTitle(),
searchInfo.getDescription(),
null);
modelInfo.addAdditionalInfo(
Messages.get().getBundle(wpLocale).key(Messages.GUI_LABEL_PATH_0),
cms.getSitePath(model));
modelInfo.setResourceType(resourceType);
modelInfo.setStructureId(model.getStructureId());
result.add(modelInfo);
}
return result;
}
/**
* Returns serialized container data.
*
* @param container the container
*
* @return the serialized data
*
* @throws Exception if serialization fails
*/
public static String getSerializedContainerInfo(CmsContainer container) throws Exception {
return CmsGwtActionElement.serialize(I_CmsContainerpageService.class.getMethod("getContainerInfo"), container);
}
/**
* Returns the serialized element data.
*
* @param cms the cms context
* @param request the servlet request
* @param response the servlet response
* @param elementBean the element to serialize
* @param page the container page
*
* @return the serialized element data
*
* @throws Exception if something goes wrong
*/
public static String getSerializedElementInfo(
CmsObject cms,
HttpServletRequest request,
HttpServletResponse response,
CmsContainerElementBean elementBean,
CmsContainerPageBean page)
throws Exception {
CmsContainerElement result = new CmsContainerElement();
CmsElementUtil util = new CmsElementUtil(
cms,
cms.getRequestContext().getUri(),
page,
null,
request,
response,
false,
cms.getRequestContext().getLocale());
util.setElementInfo(elementBean, result);
return CmsGwtActionElement.serialize(I_CmsContainerpageService.class.getMethod("getElementInfo"), result);
}
/**
* Checks whether the current page is a model group page.
*
* @param cms the CMS context
* @param containerPage the current page
*
* @return true
if the current page is a model group page
*/
public static boolean isEditingModelGroups(CmsObject cms, CmsResource containerPage) {
return (OpenCms.getResourceManager().getResourceType(containerPage).getTypeName().equals(
CmsResourceTypeXmlContainerPage.MODEL_GROUP_TYPE_NAME)
&& OpenCms.getRoleManager().hasRole(cms, CmsRole.DEVELOPER));
}
/**
* Fetches the container page data.
*
* @param request the current request
*
* @return the container page data
*
* @throws CmsRpcException if something goes wrong
*/
public static CmsCntPageData prefetch(HttpServletRequest request) throws CmsRpcException {
CmsContainerpageService srv = new CmsContainerpageService();
srv.setCms(CmsFlexController.getCmsObject(request));
srv.setRequest(request);
CmsCntPageData result = null;
try {
result = srv.prefetch();
} finally {
srv.clearThreadStorage();
}
return result;
}
/**
* Returns the server id part of the given client id.
*
* @param id the id
*
* @return the server id
*/
private static String getServerIdString(String id) {
if (id.contains(CmsADEManager.CLIENT_ID_SEPERATOR)) {
id = id.substring(0, id.indexOf(CmsADEManager.CLIENT_ID_SEPERATOR));
}
return id;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#addToFavoriteList(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, java.lang.String)
*/
public void addToFavoriteList(CmsContainerPageRpcContext context, String clientId) throws CmsRpcException {
try {
ensureSession();
List list = OpenCms.getADEManager().getFavoriteList(getCmsObject());
CmsResource containerPage = getCmsObject().readResource(context.getPageStructureId());
updateFavoriteRecentList(containerPage, clientId, list);
OpenCms.getADEManager().saveFavoriteList(getCmsObject(), list);
} catch (Throwable e) {
error(e);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#addToRecentList(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, java.lang.String)
*/
public void addToRecentList(CmsContainerPageRpcContext context, String clientId) throws CmsRpcException {
try {
ensureSession();
List list = OpenCms.getADEManager().getRecentList(getCmsObject());
CmsResource containerPage = getCmsObject().readResource(context.getPageStructureId());
updateFavoriteRecentList(containerPage, clientId, list);
OpenCms.getADEManager().saveRecentList(getCmsObject(), list);
} catch (Throwable e) {
error(e);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#checkContainerpageOrElementsChanged(org.opencms.util.CmsUUID, org.opencms.util.CmsUUID, java.lang.String)
*/
public boolean checkContainerpageOrElementsChanged(
CmsUUID structureId,
CmsUUID detailContentId,
String contentLocale)
throws CmsRpcException {
try {
List additionalIds = new ArrayList();
additionalIds.add(structureId);
boolean detailOnlyChanged = false;
if (detailContentId != null) {
additionalIds.add(detailContentId);
try {
CmsObject cms = getCmsObject();
CmsResource detailContentRes = cms.readResource(detailContentId, CmsResourceFilter.ALL);
OpenCms.getLocaleManager();
Optional detailOnlyRes = CmsJspTagContainer.getDetailOnlyPage(
cms,
detailContentRes,
CmsJspTagContainer.getDetailContainerLocale(cms, contentLocale, cms.readResource(structureId)));
if (detailOnlyRes.isPresent()) {
detailOnlyChanged = CmsDefaultResourceStatusProvider.getContainerpageRelationTargets(
getCmsObject(),
detailOnlyRes.get().getStructureId(),
Arrays.asList(detailOnlyRes.get().getStructureId()),
true).isChanged();
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
}
}
return detailOnlyChanged
|| CmsDefaultResourceStatusProvider.getContainerpageRelationTargets(
getCmsObject(),
structureId,
additionalIds,
true /*stop looking if we find a changed resource.*/).isChanged();
} catch (Throwable e) {
error(e);
return false; // will never be reached
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#checkCreateNewElement(org.opencms.util.CmsUUID, java.lang.String, java.lang.String, org.opencms.ade.containerpage.shared.CmsContainer, java.lang.String)
*/
public CmsCreateElementData checkCreateNewElement(
CmsUUID pageStructureId,
String clientId,
String resourceType,
CmsContainer container,
String locale)
throws CmsRpcException {
CmsObject cms = getCmsObject();
CmsCreateElementData result = new CmsCreateElementData();
try {
CmsResource currentPage = cms.readResource(pageStructureId);
List modelResources = CmsResourceTypeXmlContent.getModelFiles(
getCmsObject(),
CmsResource.getFolderPath(cms.getSitePath(currentPage)),
resourceType);
if (modelResources.isEmpty()) {
CmsContainerElementBean bean = getCachedElement(clientId, currentPage.getRootPath());
I_CmsFormatterBean formatter = CmsElementUtil.getFormatterForContainer(
cms,
bean,
container,
getConfigData(currentPage.getRootPath()),
true,
getSessionCache());
CmsUUID modelResId = null;
if (formatter instanceof CmsMacroFormatterBean) {
modelResId = ((CmsMacroFormatterBean)formatter).getDefaultContentStructureId();
}
result.setCreatedElement(createNewElement(pageStructureId, clientId, resourceType, modelResId, locale));
} else {
result.setModelResources(
generateModelResourceList(
getCmsObject(),
resourceType,
modelResources,
CmsLocaleManager.getLocale(locale)));
}
} catch (CmsException e) {
error(e);
}
return result;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#checkNewWidgetsAvailable(org.opencms.util.CmsUUID)
*/
public boolean checkNewWidgetsAvailable(CmsUUID structureId) throws CmsRpcException {
try {
CmsObject cms = getCmsObject();
CmsResource resource = cms.readResource(structureId);
return CmsWorkplaceEditorManager.checkAcaciaEditorAvailable(cms, resource);
} catch (Throwable t) {
error(t);
}
return false;
}
/**
* Parses an element id.
*
* @param id the element id
*
* @return the corresponding structure id
*
* @throws CmsIllegalArgumentException if the id has not the right format
*/
public CmsUUID convertToServerId(String id) throws CmsIllegalArgumentException {
if (id == null) {
throw new CmsIllegalArgumentException(
org.opencms.xml.containerpage.Messages.get().container(
org.opencms.xml.containerpage.Messages.ERR_INVALID_ID_1,
id));
}
String serverId = getServerIdString(id);
try {
return new CmsUUID(serverId);
} catch (NumberFormatException e) {
throw new CmsIllegalArgumentException(
org.opencms.xml.containerpage.Messages.get().container(
org.opencms.xml.containerpage.Messages.ERR_INVALID_ID_1,
id),
e);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#copyElement(org.opencms.util.CmsUUID, org.opencms.util.CmsUUID)
*/
public CmsUUID copyElement(CmsUUID pageId, CmsUUID originalElementId) throws CmsRpcException {
try {
CmsObject cms = getCmsObject();
CmsResource page = cms.readResource(pageId, CmsResourceFilter.IGNORE_EXPIRATION);
CmsResource element = cms.readResource(originalElementId, CmsResourceFilter.IGNORE_EXPIRATION);
CmsADEConfigData config = OpenCms.getADEManager().lookupConfiguration(cms, page.getRootPath());
String typeName = OpenCms.getResourceManager().getResourceType(element.getTypeId()).getTypeName();
CmsResourceTypeConfig typeConfig = config.getResourceType(typeName);
if (typeConfig == null) {
LOG.error("copyElement: Type not configured in ADE configuration: " + typeName);
return originalElementId;
} else {
CmsResource newResource = typeConfig.createNewElement(
cms,
element,
CmsResource.getParentFolder(page.getRootPath()));
return newResource.getStructureId();
}
} catch (Throwable e) {
error(e);
return null; // will never be reached
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#createNewElement(org.opencms.util.CmsUUID, java.lang.String, java.lang.String, org.opencms.util.CmsUUID, java.lang.String)
*/
public CmsContainerElement createNewElement(
CmsUUID pageStructureId,
String clientId,
String resourceType,
CmsUUID modelResourceStructureId,
String locale)
throws CmsRpcException {
CmsContainerElement element = null;
try {
ensureSession();
CmsObject cms = getCmsObject();
CmsResource pageResource = cms.readResource(pageStructureId);
CmsADEConfigData configData = getConfigData(pageResource.getRootPath());
CmsResourceTypeConfig typeConfig = configData.getResourceType(resourceType);
CmsObject cloneCms = OpenCms.initCmsObject(cms);
cloneCms.getRequestContext().setLocale(CmsLocaleManager.getLocale(locale));
CmsResource modelResource = null;
if (modelResourceStructureId != null) {
modelResource = cms.readResource(modelResourceStructureId);
}
CmsResource newResource = typeConfig.createNewElement(
cloneCms,
modelResource,
CmsResource.getParentFolder(pageResource.getRootPath()));
CmsContainerElementBean bean = getCachedElement(clientId, pageResource.getRootPath());
CmsContainerElementBean newBean = new CmsContainerElementBean(
newResource.getStructureId(),
null,
bean.getIndividualSettings(),
typeConfig.isCopyInModels());
String newClientId = newBean.editorHash();
getSessionCache().setCacheContainerElement(newClientId, newBean);
element = new CmsContainerElement();
element.setNewEditorDisabled(!CmsWorkplaceEditorManager.checkAcaciaEditorAvailable(cms, newResource));
element.setClientId(newClientId);
element.setSitePath(cms.getSitePath(newResource));
element.setResourceType(resourceType);
element.setCreateNew(newBean.isCreateNew());
} catch (CmsException e) {
error(e);
}
return element;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getContainerInfo()
*/
public CmsContainer getContainerInfo() {
throw new UnsupportedOperationException("This method is used for serialization only.");
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getElementInfo()
*/
public CmsContainerElement getElementInfo() {
throw new UnsupportedOperationException("This method is used for serialization only.");
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getElementsData(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, org.opencms.util.CmsUUID, java.lang.String, java.util.Collection, java.util.Collection, boolean, boolean, java.lang.String, java.lang.String)
*/
public Map getElementsData(
CmsContainerPageRpcContext context,
CmsUUID detailContentId,
String reqParams,
Collection clientIds,
Collection containers,
boolean allowNested,
boolean allwaysCopy,
String dndSource,
String locale)
throws CmsRpcException {
Map result = null;
try {
ensureSession();
CmsResource pageResource = getCmsObject().readResource(context.getPageStructureId());
initRequestFromRpcContext(context);
String containerpageUri = getCmsObject().getSitePath(pageResource);
result = getElements(
pageResource,
clientIds,
containerpageUri,
detailContentId,
containers,
allowNested,
allwaysCopy,
dndSource,
CmsStringUtil.isNotEmptyOrWhitespaceOnly(dndSource),
CmsLocaleManager.getLocale(locale));
} catch (Throwable e) {
error(e);
}
return result;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getElementSettingsConfig(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, java.lang.String, java.lang.String, java.util.Collection, boolean, java.lang.String)
*/
public CmsContainerElementData getElementSettingsConfig(
CmsContainerPageRpcContext context,
String clientId,
String containerId,
Collection containers,
boolean allowNested,
String locale)
throws CmsRpcException {
try {
ensureSession();
CmsObject cms = getCmsObject();
CmsResource pageResource = cms.readResource(context.getPageStructureId());
initRequestFromRpcContext(context);
String containerpageUri = cms.getSitePath(pageResource);
CmsContainerPageBean pageBean = generateContainerPageForContainers(
containers,
cms.getRequestContext().addSiteRoot(containerpageUri));
CmsElementUtil elemUtil = new CmsElementUtil(
cms,
containerpageUri,
pageBean,
null,
getRequest(),
getResponse(),
false,
CmsLocaleManager.getLocale(locale));
CmsContainerElementBean element = getCachedElement(
clientId,
cms.getRequestContext().addSiteRoot(containerpageUri));
if (element.getInstanceId() == null) {
element = element.clone();
getSessionCache().setCacheContainerElement(element.editorHash(), element);
}
element.initResource(cms);
return elemUtil.getElementSettingsConfig(pageResource, element, containerId, containers, allowNested);
} catch (Throwable e) {
error(e);
}
return null;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getElementWithSettings(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, org.opencms.util.CmsUUID, java.lang.String, java.lang.String, java.util.Map, java.util.Collection, boolean, java.lang.String)
*/
public CmsContainerElementData getElementWithSettings(
CmsContainerPageRpcContext context,
CmsUUID detailContentId,
String uriParams,
String clientId,
Map settings,
Collection containers,
boolean allowNested,
String locale)
throws CmsRpcException {
CmsContainerElementData element = null;
try {
ensureSession();
CmsObject cms = getCmsObject();
CmsResource pageResource = cms.readResource(context.getPageStructureId());
initRequestFromRpcContext(context);
String containerpageUri = cms.getSitePath(pageResource);
Locale contentLocale = CmsLocaleManager.getLocale(locale);
CmsElementUtil elemUtil = new CmsElementUtil(
cms,
containerpageUri,
generateContainerPageForContainers(containers, pageResource.getRootPath()),
detailContentId,
getRequest(),
getResponse(),
false,
contentLocale);
CmsContainerElementBean elementBean = getCachedElement(clientId, pageResource.getRootPath());
elementBean.initResource(cms);
storeFormatterSelection(elementBean, settings);
// make sure to keep the element instance id
if (!settings.containsKey(CmsContainerElement.ELEMENT_INSTANCE_ID)
&& elementBean.getIndividualSettings().containsKey(CmsContainerElement.ELEMENT_INSTANCE_ID)) {
settings.put(
CmsContainerElement.ELEMENT_INSTANCE_ID,
elementBean.getIndividualSettings().get(CmsContainerElement.ELEMENT_INSTANCE_ID));
}
elementBean = CmsContainerElementBean.cloneWithSettings(
elementBean,
convertSettingValues(elementBean.getResource(), settings, contentLocale));
getSessionCache().setCacheContainerElement(elementBean.editorHash(), elementBean);
element = elemUtil.getElementData(pageResource, elementBean, containers, allowNested);
} catch (Throwable e) {
error(e);
}
return element;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getFavoriteList(org.opencms.util.CmsUUID, org.opencms.util.CmsUUID, java.util.Collection, boolean, java.lang.String)
*/
public List getFavoriteList(
CmsUUID pageStructureId,
CmsUUID detailContentId,
Collection containers,
boolean allowNested,
String locale)
throws CmsRpcException {
List result = null;
try {
ensureSession();
CmsResource containerpage = getCmsObject().readResource(pageStructureId);
String containerpageUri = getCmsObject().getSitePath(containerpage);
result = getListElementsData(
OpenCms.getADEManager().getFavoriteList(getCmsObject()),
containerpageUri,
detailContentId,
containers,
allowNested,
CmsLocaleManager.getLocale(locale));
} catch (Throwable e) {
error(e);
}
return result;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getGalleryDataForPage(java.util.List, org.opencms.util.CmsUUID, java.lang.String, java.lang.String)
*/
public CmsContainerPageGalleryData getGalleryDataForPage(
final List containers,
CmsUUID elementView,
String uri,
String locale)
throws CmsRpcException {
CmsGalleryDataBean data = null;
try {
CmsObject cms = getCmsObject();
CmsAddDialogTypeHelper typeHelper = new CmsAddDialogTypeHelper();
List resTypeBeans = typeHelper.getResourceTypes(
cms,
cms.getRequestContext().addSiteRoot(uri),
uri,
OpenCms.getADEManager().getElementViews(cms).get(elementView),
new I_CmsResourceTypeEnabledCheck() {
public boolean checkEnabled(
CmsObject paramCms,
CmsADEConfigData config,
I_CmsResourceType resType) {
boolean isModelGroup = CmsResourceTypeXmlContainerPage.MODEL_GROUP_TYPE_NAME.equals(
resType.getTypeName());
return isModelGroup || config.hasFormatters(paramCms, resType, containers);
}
});
CmsGalleryService srv = new CmsGalleryService();
srv.setCms(cms);
srv.setRequest(getRequest());
data = srv.getInitialSettingsForContainerPage(resTypeBeans, uri, locale);
CmsContainerPageGalleryData result = new CmsContainerPageGalleryData();
CmsADESessionCache cache = CmsADESessionCache.getCache(getRequest(), cms);
CmsGallerySearchBean search = cache.getLastPageEditorGallerySearch();
String subsite = OpenCms.getADEManager().getSubSiteRoot(cms, cms.addSiteRoot(uri));
String searchStoreKey = elementView + "|" + subsite + "|" + locale;
data.getContextParameters().put("searchStoreKey", searchStoreKey);
if (search != null) {
if (searchStoreKey.equals(
search.getOriginalGalleryData().getContextParameters().get("searchStoreKey"))) {
if (hasCompatibleSearchData(search.getOriginalGalleryData(), data, search)) {
CmsVfsEntryBean preloadData = null;
if (search.getFolders() != null) {
preloadData = CmsGalleryService.generateVfsPreloadData(
getCmsObject(),
CmsGalleryService.getVfsTreeState(getRequest(), data.getTreeToken()),
search.getFolders());
}
// only restore last result list if the search was performed in a 'similar' context
search.setTabId(GalleryTabId.cms_tab_results.toString());
search.setPage(1);
search.setLastPage(0);
data.setStartTab(GalleryTabId.cms_tab_results);
search = srv.getSearch(search);
data.setVfsPreloadData(preloadData);
data.setIncludeExpiredDefault(search.isIncludeExpired());
result.setGallerySearch(search);
}
}
}
result.setGalleryData(data);
return result;
} catch (Exception e) {
error(e);
return null;
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getNewElementData(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, org.opencms.util.CmsUUID, java.lang.String, java.lang.String, java.util.Collection, boolean, java.lang.String)
*/
public CmsContainerElementData getNewElementData(
CmsContainerPageRpcContext context,
CmsUUID detailContentId,
String reqParams,
String resourceType,
Collection containers,
boolean allowNested,
String localeName)
throws CmsRpcException {
CmsContainerElementData result = null;
try {
ensureSession();
CmsResource pageResource = getCmsObject().readResource(context.getPageStructureId());
initRequestFromRpcContext(context);
String containerpageUri = getCmsObject().getSitePath(pageResource);
Locale locale = CmsLocaleManager.getLocale(localeName);
result = getNewElement(
getServerIdString(resourceType),
containerpageUri,
detailContentId,
containers,
allowNested,
locale);
} catch (Throwable e) {
error(e);
}
return result;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getRecentList(org.opencms.util.CmsUUID, org.opencms.util.CmsUUID, java.util.Collection, boolean, java.lang.String)
*/
public List getRecentList(
CmsUUID pageStructureId,
CmsUUID detailContentId,
Collection containers,
boolean allowNested,
String locale)
throws CmsRpcException {
List result = null;
try {
ensureSession();
CmsResource containerpage = getCmsObject().readResource(pageStructureId);
String containerpageUri = getCmsObject().getSitePath(containerpage);
result = getListElementsData(
OpenCms.getADEManager().getRecentList(getCmsObject()),
containerpageUri,
detailContentId,
containers,
allowNested,
CmsLocaleManager.getLocale(locale));
} catch (Throwable e) {
error(e);
}
return result;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#getRemovedElementStatus(java.lang.String, org.opencms.util.CmsUUID)
*/
public CmsRemovedElementStatus getRemovedElementStatus(String id, CmsUUID containerpageId) throws CmsRpcException {
if ((id == null) || !id.matches(CmsUUID.UUID_REGEX + ".*$")) {
return new CmsRemovedElementStatus(null, null, false, null);
}
try {
CmsUUID structureId = convertToServerId(id);
return internalGetRemovedElementStatus(structureId, containerpageId);
} catch (CmsException e) {
error(e);
return null;
}
}
/**
* Internal helper method to get the status of a removed element.
*
* @param structureId the structure id of the removed element
* @param containerpageId the id of the page to exclude from the relation check, or null if no page should be excluded
*
* @return the status of the removed element
*
* @throws CmsException in case reading the resource fails
*/
public CmsRemovedElementStatus internalGetRemovedElementStatus(CmsUUID structureId, CmsUUID containerpageId)
throws CmsException {
CmsObject cms = getCmsObject();
CmsResource elementResource = cms.readResource(structureId, CmsResourceFilter.IGNORE_EXPIRATION);
boolean hasWritePermissions = cms.hasPermissions(
elementResource,
CmsPermissionSet.ACCESS_WRITE,
false,
CmsResourceFilter.ALL);
boolean isSystemResource = elementResource.getRootPath().startsWith(CmsResource.VFS_FOLDER_SYSTEM + "/");
CmsRelationFilter relationFilter = CmsRelationFilter.relationsToStructureId(structureId);
List relationsToElement = cms.readRelations(relationFilter);
Iterator iter = relationsToElement.iterator();
// ignore XML_STRONG (i.e. container element) relations from the container page, this must be checked on the client side.
while (iter.hasNext()) {
CmsRelation relation = iter.next();
if ((containerpageId != null)
&& containerpageId.equals(relation.getSourceId())
&& relation.getType().equals(CmsRelationType.XML_STRONG)) {
iter.remove();
}
}
ElementDeleteMode elementDeleteMode = null;
CmsResource pageResource = cms.readResource(containerpageId, CmsResourceFilter.IGNORE_EXPIRATION);
CmsADEConfigData adeConfig = OpenCms.getADEManager().lookupConfiguration(cms, pageResource.getRootPath());
CmsResourceTypeConfig typeConfig = adeConfig.getResourceType(
OpenCms.getResourceManager().getResourceType(elementResource).getTypeName());
if (typeConfig != null) {
elementDeleteMode = typeConfig.getElementDeleteMode();
}
boolean hasNoRelations = relationsToElement.isEmpty();
boolean deletionCandidate = hasNoRelations && hasWritePermissions && !isSystemResource;
CmsListInfoBean elementInfo = CmsVfsService.getPageInfo(cms, elementResource);
return new CmsRemovedElementStatus(structureId, elementInfo, deletionCandidate, elementDeleteMode);
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#loadClipboardTab()
*/
public int loadClipboardTab() {
Integer clipboardTab = (Integer)(getRequest().getSession().getAttribute(ATTR_CLIPBOARD_TAB));
if (clipboardTab == null) {
clipboardTab = Integer.valueOf(0);
}
return clipboardTab.intValue();
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#prefetch()
*/
public CmsCntPageData prefetch() throws CmsRpcException {
CmsCntPageData data = null;
CmsObject cms = getCmsObject();
Locale wpLocale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms);
HttpServletRequest request = getRequest();
try {
CmsTemplateContextInfo info = OpenCms.getTemplateContextManager().getContextInfoBean(cms, request);
CmsResource containerPage = getContainerpage(cms);
boolean isEditingModelGroup = isEditingModelGroups(cms, containerPage);
boolean isModelPage = isModelPage(cms, containerPage);
if (isModelPage) {
// the model edit confirm dialog should only be shown once per session, disable it after first model editing
getRequest().getSession().setAttribute(
CmsVfsSitemapService.ATTR_SHOW_MODEL_EDIT_CONFIRM,
Boolean.FALSE);
}
TemplateBean templateBean = (TemplateBean)getRequest().getAttribute(
CmsTemplateContextManager.ATTR_TEMPLATE_BEAN);
CmsADESessionCache sessionCache = CmsADESessionCache.getCache(getRequest(), cms);
sessionCache.setTemplateBean(containerPage.getRootPath(), templateBean);
long lastModified = containerPage.getDateLastModified();
String editorUri = OpenCms.getWorkplaceManager().getEditorHandler().getEditorUri(
cms,
"xmlcontent",
"User agent",
false);
boolean useClassicEditor = (editorUri == null) || !editorUri.contains("acacia");
CmsResource detailResource = CmsDetailPageResourceHandler.getDetailResource(request);
String noEditReason;
String detailContainerPage = null;
CmsQuickLaunchLocationCache locationCache = CmsQuickLaunchLocationCache.getLocationCache(
request.getSession());
if (detailResource != null) {
locationCache.setPageEditorLocation(
cms.getRequestContext().getSiteRoot(),
cms.getSitePath(detailResource));
CmsObject rootCms = OpenCms.initCmsObject(cms);
rootCms.getRequestContext().setSiteRoot("");
detailContainerPage = CmsJspTagContainer.getDetailOnlyPageName(
detailResource.getRootPath(),
CmsJspTagContainer.getDetailContainerLocale(
cms,
cms.getRequestContext().getLocale().toString(),
containerPage));
if (rootCms.existsResource(detailContainerPage, CmsResourceFilter.IGNORE_EXPIRATION)) {
noEditReason = getNoEditReason(
rootCms,
rootCms.readResource(detailContainerPage, CmsResourceFilter.IGNORE_EXPIRATION));
} else {
String permissionFolder = CmsResource.getFolderPath(detailContainerPage);
while (!rootCms.existsResource(permissionFolder, CmsResourceFilter.IGNORE_EXPIRATION)) {
permissionFolder = CmsResource.getParentFolder(permissionFolder);
}
noEditReason = getNoEditReason(
rootCms,
rootCms.readResource(permissionFolder, CmsResourceFilter.IGNORE_EXPIRATION));
}
} else {
if (!isModelPage && !isEditingModelGroup) {
locationCache.setPageEditorLocation(
cms.getRequestContext().getSiteRoot(),
cms.getSitePath(containerPage));
}
noEditReason = getNoEditReason(cms, containerPage);
}
String sitemapPath = "";
boolean sitemapManager = OpenCms.getRoleManager().hasRole(cms, CmsRole.EDITOR);
if (sitemapManager) {
sitemapPath = CmsADEManager.PATH_SITEMAP_EDITOR_JSP;
}
CmsCntPageData.ElementReuseMode reuseMode = ElementReuseMode.reuse;
String reuseModeString = getWorkplaceSettings().getUserSettings().getAdditionalPreference(
"elementReuseMode",
true);
try {
reuseMode = ElementReuseMode.valueOf(reuseModeString);
} catch (Exception e) {
LOG.info("Invalid reuse mode : " + reuseModeString, e);
}
InitialElementViewProvider viewHelper = new InitialElementViewProvider();
viewHelper.init(getSessionCache().getElementView(), containerPage);
CmsLocaleGroup group = cms.getLocaleGroupService().readLocaleGroup(containerPage);
Locale mainLocale = null;
if (group.isRealGroup() && !cms.getRequestContext().getLocale().equals(group.getMainLocale())) {
mainLocale = group.getMainLocale();
}
CmsSiteManagerImpl siteManager = OpenCms.getSiteManager();
String ownRoot = siteManager.getSiteRoot(containerPage.getRootPath());
Map localeLinkBeans = null;
if (group.isRealGroup()) {
localeLinkBeans = Maps.newHashMap();
Locale locale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms);
for (Map.Entry entry : group.getResourcesByLocale().entrySet()) {
String otherRoot = siteManager.getSiteRoot(entry.getValue().getRootPath());
if ((otherRoot != null) && otherRoot.equals(ownRoot)) {
String theLink = OpenCms.getLinkManager().substituteLinkForUnknownTarget(
cms,
cms.getRequestContext().removeSiteRoot(entry.getValue().getRootPath()));
localeLinkBeans.put(entry.getKey().getDisplayLanguage(locale), CmsLocaleLinkBean.link(theLink));
} else {
localeLinkBeans.put(
entry.getKey().getDisplayLanguage(locale),
CmsLocaleLinkBean.error(
Messages.get().getBundle(locale).key(Messages.GUI_SHOWLOCALE_WRONG_SITE_0)));
}
}
}
String onlineLink = null;
if (!OpenCms.getSiteManager().getWorkplaceServer().equals(
OpenCms.getSiteManager().getSiteForSiteRoot(cms.getRequestContext().getSiteRoot()).getUrl())) {
if (detailResource != null) {
onlineLink = OpenCms.getLinkManager().getOnlineLink(
cms,
cms.getSitePath(containerPage),
cms.getSitePath(detailResource),
false);
} else {
onlineLink = OpenCms.getLinkManager().getOnlineLink(cms, cms.getSitePath(containerPage));
}
}
String modelGroupElementId = null;
if (isEditingModelGroup) {
CmsProperty modelElementProp = cms.readPropertyObject(
containerPage,
CmsPropertyDefinition.PROPERTY_TEMPLATE_ELEMENTS,
false);
if (!modelElementProp.isNullProperty() && CmsUUID.isValidUUID(modelElementProp.getValue())) {
modelGroupElementId = modelElementProp.getValue();
}
}
String title = null;
if (isModelPage || isEditingModelGroup) {
title = Messages.get().getBundle(wpLocale).key(Messages.GUI_TITLE_MODEL_0);
}
ElementDeleteMode deleteMode = OpenCms.getWorkplaceManager().getElementDeleteMode();
if (deleteMode == null) {
deleteMode = ElementDeleteMode.askDelete;
}
data = new CmsCntPageData(
onlineLink,
noEditReason,
CmsRequestUtil.encodeParams(request),
sitemapPath,
sitemapManager,
detailResource != null ? detailResource.getStructureId() : null,
detailContainerPage,
lastModified,
getLockInfo(containerPage),
cms.getRequestContext().getLocale().toString(),
useClassicEditor,
info,
isEditSmallElements(request, cms),
Lists.newArrayList(viewHelper.getViewMap().values()),
viewHelper.getDefaultView(),
reuseMode,
deleteMode,
isModelPage,
isEditingModelGroup,
modelGroupElementId,
mainLocale != null ? mainLocale.toString() : null,
localeLinkBeans,
title);
} catch (Throwable e) {
error(e);
}
return data;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveClipboardTab(int)
*/
public void saveClipboardTab(int tabIndex) {
getRequest().getSession().setAttribute(ATTR_CLIPBOARD_TAB, new Integer(tabIndex));
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveContainerpage(org.opencms.util.CmsUUID, java.util.List)
*/
public void saveContainerpage(CmsUUID pageStructureId, List containers) throws CmsRpcException {
CmsObject cms = getCmsObject();
try {
ensureSession();
CmsResource containerpage = cms.readResource(pageStructureId);
ensureLock(containerpage);
String containerpageUri = cms.getSitePath(containerpage);
saveContainers(cms, containerpage, containerpageUri, containers);
} catch (Throwable e) {
error(e);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveDetailContainers(org.opencms.util.CmsUUID, java.lang.String, java.util.List)
*/
public void saveDetailContainers(CmsUUID detailId, String detailContainerResource, List containers)
throws CmsRpcException {
CmsObject cms = getCmsObject();
try {
CmsObject rootCms = OpenCms.initCmsObject(cms);
rootCms.getRequestContext().setSiteRoot("");
CmsResource containerpage;
ensureSession();
if (rootCms.existsResource(detailContainerResource)) {
containerpage = rootCms.readResource(detailContainerResource);
} else {
String parentFolder = CmsResource.getFolderPath(detailContainerResource);
List foldersToCreate = new ArrayList();
// ensure the parent folder exists
while (!rootCms.existsResource(parentFolder)) {
foldersToCreate.add(0, parentFolder);
parentFolder = CmsResource.getParentFolder(parentFolder);
}
for (String folderName : foldersToCreate) {
CmsResource parentRes = rootCms.createResource(
folderName,
OpenCms.getResourceManager().getResourceType(CmsResourceTypeFolder.getStaticTypeName()));
// set the search exclude property on parent folder
rootCms.writePropertyObject(
folderName,
new CmsProperty(
CmsPropertyDefinition.PROPERTY_SEARCH_EXCLUDE,
CmsSearchIndex.PROPERTY_SEARCH_EXCLUDE_VALUE_ALL,
null));
tryUnlock(parentRes);
}
containerpage = rootCms.createResource(
detailContainerResource,
OpenCms.getResourceManager().getResourceType(CmsResourceTypeXmlContainerPage.getStaticTypeName()));
}
ensureLock(containerpage);
try {
CmsResource detailResource = cms.readResource(detailId, CmsResourceFilter.IGNORE_EXPIRATION);
String title = cms.readPropertyObject(
detailResource,
CmsPropertyDefinition.PROPERTY_TITLE,
true).getValue();
if (title != null) {
title = Messages.get().getBundle(OpenCms.getWorkplaceManager().getWorkplaceLocale(cms)).key(
Messages.GUI_DETAIL_CONTENT_PAGE_TITLE_1,
title);
CmsProperty titleProp = new CmsProperty(CmsPropertyDefinition.PROPERTY_TITLE, title, null);
cms.writePropertyObjects(containerpage, Arrays.asList(titleProp));
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
}
saveContainers(rootCms, containerpage, detailContainerResource, containers);
} catch (Throwable e) {
error(e);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveElementSettings(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, org.opencms.util.CmsUUID, java.lang.String, java.lang.String, java.util.Map, java.util.List, boolean, java.lang.String)
*/
public CmsContainerElementData saveElementSettings(
CmsContainerPageRpcContext context,
CmsUUID detailContentId,
String reqParams,
String clientId,
Map settings,
List containers,
boolean allowNested,
String locale)
throws CmsRpcException {
CmsContainerElementData element = null;
try {
ensureSession();
CmsObject cms = getCmsObject();
CmsResource pageResource = cms.readResource(context.getPageStructureId());
initRequestFromRpcContext(context);
Locale contentLocale = CmsLocaleManager.getLocale(locale);
CmsContainerElementBean elementBean = getCachedElement(clientId, pageResource.getRootPath());
elementBean.initResource(cms);
storeFormatterSelection(elementBean, settings);
// make sure to keep the element instance id
if (!settings.containsKey(CmsContainerElement.ELEMENT_INSTANCE_ID)
&& elementBean.getIndividualSettings().containsKey(CmsContainerElement.ELEMENT_INSTANCE_ID)) {
settings.put(
CmsContainerElement.ELEMENT_INSTANCE_ID,
elementBean.getIndividualSettings().get(CmsContainerElement.ELEMENT_INSTANCE_ID));
}
if (!isEditingModelGroups(cms, pageResource)) {
// in case of model group state set to 'noGroup', the group will be dissolved and former group id forgotten
if (!(settings.containsKey(CmsContainerElement.MODEL_GROUP_STATE)
&& (ModelGroupState.noGroup == ModelGroupState.evaluate(
settings.get(CmsContainerElement.MODEL_GROUP_STATE))))) {
if (elementBean.getIndividualSettings().containsKey(CmsContainerElement.MODEL_GROUP_ID)) {
// make sure to keep the model group id
settings.put(
CmsContainerElement.MODEL_GROUP_ID,
elementBean.getIndividualSettings().get(CmsContainerElement.MODEL_GROUP_ID));
}
if (elementBean.getIndividualSettings().containsKey(CmsContainerElement.MODEL_GROUP_STATE)) {
settings.put(
CmsContainerElement.MODEL_GROUP_STATE,
elementBean.getIndividualSettings().get(CmsContainerElement.MODEL_GROUP_STATE));
}
}
}
elementBean = CmsContainerElementBean.cloneWithSettings(
elementBean,
convertSettingValues(elementBean.getResource(), settings, contentLocale));
getSessionCache().setCacheContainerElement(elementBean.editorHash(), elementBean);
// update client id within container data
for (CmsContainer container : containers) {
for (CmsContainerElement child : container.getElements()) {
if (child.getClientId().equals(clientId)) {
child.setClientId(elementBean.editorHash());
}
}
}
if (detailContentId == null) {
saveContainers(cms, pageResource, cms.getSitePath(pageResource), containers);
} else {
List detailContainers = new ArrayList();
for (CmsContainer container : containers) {
if (container.isDetailOnly()) {
detailContainers.add(container);
}
}
CmsObject rootCms = OpenCms.initCmsObject(cms);
rootCms.getRequestContext().setSiteRoot("");
CmsResource detailResource = rootCms.readResource(detailContentId, CmsResourceFilter.IGNORE_EXPIRATION);
CmsResource detailContainerPage = rootCms.readResource(
CmsJspTagContainer.getDetailOnlyPageName(
detailResource.getRootPath(),
CmsJspTagContainer.getDetailContainerLocale(cms, locale, pageResource)));
ensureLock(detailContainerPage);
saveContainers(rootCms, detailContainerPage, detailContainerPage.getRootPath(), detailContainers);
}
String containerpageUri = cms.getSitePath(pageResource);
CmsElementUtil elemUtil = new CmsElementUtil(
cms,
containerpageUri,
generateContainerPageForContainers(containers, pageResource.getRootPath()),
detailContentId,
getRequest(),
getResponse(),
false,
contentLocale);
element = elemUtil.getElementData(pageResource, elementBean, containers, allowNested);
} catch (Throwable e) {
error(e);
}
return element;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveFavoriteList(java.util.List, java.lang.String)
*/
public void saveFavoriteList(List clientIds, String uri) throws CmsRpcException {
try {
ensureSession();
OpenCms.getADEManager().saveFavoriteList(
getCmsObject(),
getCachedElements(clientIds, getCmsObject().getRequestContext().addSiteRoot(uri)));
} catch (Throwable e) {
error(e);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveGroupContainer(org.opencms.ade.containerpage.shared.CmsContainerPageRpcContext, org.opencms.util.CmsUUID, java.lang.String, org.opencms.ade.containerpage.shared.CmsGroupContainer, java.util.Collection, java.lang.String)
*/
public CmsGroupContainerSaveResult saveGroupContainer(
CmsContainerPageRpcContext context,
CmsUUID detailContentId,
String reqParams,
CmsGroupContainer groupContainer,
Collection containers,
String locale)
throws CmsRpcException {
CmsObject cms = getCmsObject();
List removedElements = null;
try {
CmsPair> saveResult = internalSaveGroupContainer(
cms,
context.getPageStructureId(),
groupContainer);
removedElements = saveResult.getSecond();
} catch (Throwable e) {
error(e);
}
Collection ids = new ArrayList();
ids.add(groupContainer.getClientId());
// update offline indices
OpenCms.getSearchManager().updateOfflineIndexes();
return new CmsGroupContainerSaveResult(
getElementsData(context, detailContentId, reqParams, ids, containers, false, false, null, locale),
removedElements);
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveInheritanceContainer(org.opencms.util.CmsUUID, org.opencms.util.CmsUUID, org.opencms.ade.containerpage.shared.CmsInheritanceContainer, java.util.Collection, java.lang.String)
*/
public Map saveInheritanceContainer(
CmsUUID pageStructureId,
CmsUUID detailContentId,
CmsInheritanceContainer inheritanceContainer,
Collection containers,
String locale)
throws CmsRpcException {
try {
CmsObject cms = getCmsObject();
CmsResource containerPage = cms.readResource(pageStructureId);
String sitePath = cms.getSitePath(containerPage);
Locale requestedLocale = CmsLocaleManager.getLocale(locale);
CmsResource referenceResource = null;
if (inheritanceContainer.isNew()) {
CmsADEConfigData config = getConfigData(containerPage.getRootPath());
CmsResourceTypeConfig typeConfig = config.getResourceType(
CmsResourceTypeXmlContainerPage.INHERIT_CONTAINER_TYPE_NAME);
referenceResource = typeConfig.createNewElement(cms, containerPage.getRootPath());
inheritanceContainer.setClientId(referenceResource.getStructureId().toString());
}
if (referenceResource == null) {
CmsUUID id = convertToServerId(inheritanceContainer.getClientId());
referenceResource = cms.readResource(id, CmsResourceFilter.ONLY_VISIBLE_NO_DELETED);
}
ensureLock(referenceResource);
saveInheritanceGroup(referenceResource, inheritanceContainer);
tryUnlock(referenceResource);
List elements = new ArrayList();
for (CmsContainerElement clientElement : inheritanceContainer.getElements()) {
CmsContainerElementBean elementBean = getCachedElement(
clientElement.getClientId(),
containerPage.getRootPath());
elementBean = CmsContainerElementBean.cloneWithSettings(
elementBean,
elementBean.getIndividualSettings());
CmsInheritanceInfo inheritanceInfo = clientElement.getInheritanceInfo();
// if a local elements misses the key it was newly added
if (inheritanceInfo.isNew() && CmsStringUtil.isEmptyOrWhitespaceOnly(inheritanceInfo.getKey())) {
// generating new key
inheritanceInfo.setKey(CmsResource.getFolderPath(sitePath) + new CmsUUID().toString());
}
elementBean.setInheritanceInfo(inheritanceInfo);
elements.add(elementBean);
}
cms.getRequestContext().setLocale(requestedLocale);
if (inheritanceContainer.getElementsChanged()) {
OpenCms.getADEManager().saveInheritedContainer(
cms,
containerPage,
inheritanceContainer.getName(),
true,
elements);
}
return getElements(
containerPage,
new ArrayList(Collections.singletonList(inheritanceContainer.getClientId())),
sitePath,
detailContentId,
containers,
false,
false,
null,
false,
requestedLocale);
} catch (Exception e) {
error(e);
}
return null;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#saveRecentList(java.util.List, java.lang.String)
*/
public void saveRecentList(List clientIds, String uri) throws CmsRpcException {
try {
ensureSession();
OpenCms.getADEManager().saveRecentList(
getCmsObject(),
getCachedElements(clientIds, getCmsObject().getRequestContext().addSiteRoot(uri)));
} catch (Throwable e) {
error(e);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#setEditSmallElements(boolean)
*/
public void setEditSmallElements(boolean editSmallElements) throws CmsRpcException {
try {
CmsObject cms = getCmsObject();
CmsUser user = cms.getRequestContext().getCurrentUser();
user.getAdditionalInfo().put(ADDINFO_EDIT_SMALL_ELEMENTS, "" + editSmallElements);
cms.writeUser(user);
} catch (Throwable t) {
error(t);
}
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#setElementView(org.opencms.util.CmsUUID)
*/
public void setElementView(CmsUUID elementView) {
getSessionCache().setElementView(elementView);
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#setLastPage(org.opencms.util.CmsUUID, org.opencms.util.CmsUUID)
*/
public void setLastPage(CmsUUID pageId, CmsUUID detailId) throws CmsRpcException {
try {
HttpServletRequest req = getRequest();
CmsObject cms = getCmsObject();
CmsADESessionCache cache = CmsADESessionCache.getCache(req, cms);
cache.setLastPage(cms, pageId, detailId);
} catch (Exception e) {
error(e);
}
}
/**
* Sets the session cache.
*
* @param cache the session cache
*/
public void setSessionCache(CmsADESessionCache cache) {
m_sessionCache = cache;
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#syncSaveContainerpage(org.opencms.util.CmsUUID, java.util.List)
*/
public void syncSaveContainerpage(CmsUUID pageStructureId, List containers) throws CmsRpcException {
saveContainerpage(pageStructureId, containers);
}
/**
* @see org.opencms.ade.containerpage.shared.rpc.I_CmsContainerpageService#syncSaveDetailContainers(org.opencms.util.CmsUUID, java.lang.String, java.util.List)
*/
public void syncSaveDetailContainers(
CmsUUID detailId,
String detailContainerResource,
List containers)
throws CmsRpcException {
saveDetailContainers(detailId, detailContainerResource, containers);
}
/**
* Gets the settings which should be updated for an element in the DND case.
*
* @param originalSettings the original settings
* @param formatterConfig the formatter configuration for the element
* @param containers the containers
* @param dndContainer the id of the DND origin container
* @param allowNested true if nested containers are allowed
*
* @return the map of settings to update
*/
Map getSettingsToChangeForDnd(
Map originalSettings,
CmsFormatterConfiguration formatterConfig,
Collection containers,
String dndContainer,
boolean allowNested) {
Map result = Maps.newHashMap();
if (dndContainer == null) {
return result;
}
String key = CmsFormatterConfig.getSettingsKeyForContainer(dndContainer);
String formatterId = originalSettings.get(key);
if (formatterId == null) {
return result;
}
for (CmsContainer container : containers) {
if (container.getName().equals(dndContainer)) {
continue;
}
Map formatterSelection = formatterConfig.getFormatterSelection(
container.getType(),
container.getWidth(),
allowNested);
if (formatterSelection.containsKey(formatterId)) {
String newKey = CmsFormatterConfig.getSettingsKeyForContainer(container.getName());
result.put(newKey, formatterId);
}
}
return result;
}
/**
* Creates a new container element bean from an existing one, but changes some of the individual settings in the copy.
*
* @param element the original container element
* @param settingsToOverride the map of settings to change
*
* @return the new container element bean with the changed settings
*/
CmsContainerElementBean overrideSettings(CmsContainerElementBean element, Map settingsToOverride) {
Map settings = Maps.newHashMap(element.getIndividualSettings());
settings.putAll(settingsToOverride);
CmsContainerElementBean result = new CmsContainerElementBean(
element.getId(),
element.getFormatterId(),
settings,
element.isCreateNew());
return result;
}
/**
* Adds the formatter to the recently used formatter list.
*
* @param elementBean the element bean
* @param settings the changed settings
*/
void storeFormatterSelection(CmsContainerElementBean elementBean, Map settings) {
Entry previousFormatterEntry = null;
for (Entry entry : elementBean.getIndividualSettings().entrySet()) {
if (entry.getKey().startsWith(CmsFormatterConfig.FORMATTER_SETTINGS_KEY)) {
previousFormatterEntry = entry;
break;
}
}
Entry formatterEntry = null;
for (Entry entry : settings.entrySet()) {
if (entry.getKey().startsWith(CmsFormatterConfig.FORMATTER_SETTINGS_KEY)) {
formatterEntry = entry;
break;
}
}
if ((formatterEntry != null)
&& ((previousFormatterEntry == null)
|| !formatterEntry.getKey().equals(previousFormatterEntry.getKey())
|| !formatterEntry.getValue().equals(previousFormatterEntry.getValue()))) {
String idString = formatterEntry.getValue();
if (CmsUUID.isValidUUID(idString)) { // TODO: Make this work for schema formatters
// the formatter setting has changed
I_CmsResourceType resType = OpenCms.getResourceManager().getResourceType(elementBean.getResource());
getSessionCache().addRecentFormatter(resType.getTypeName(), new CmsUUID(idString));
}
}
}
/**
* Converts the given setting values according to the setting configuration of the given resource.
*
* @param resource the resource
* @param settings the settings to convert
* @param locale the locale used for accessing the element settings
*
* @return the converted settings
* @throws CmsException if something goes wrong
*/
private Map convertSettingValues(CmsResource resource, Map settings, Locale locale)
throws CmsException {
CmsObject cms = getCmsObject();
Locale origLocale = cms.getRequestContext().getLocale();
try {
cms.getRequestContext().setLocale(locale);
Map settingsConf = OpenCms.getADEManager().getElementSettings(cms, resource);
Map changedSettings = new HashMap();
if (settings != null) {
for (Map.Entry entry : settings.entrySet()) {
String settingName = entry.getKey();
String settingType = "string";
if (settingsConf.get(settingName) != null) {
settingType = settingsConf.get(settingName).getType();
}
changedSettings.put(
settingName,
CmsXmlContentPropertyHelper.getPropValueIds(getCmsObject(), settingType, entry.getValue()));
}
}
return changedSettings;
} finally {
cms.getRequestContext().setLocale(origLocale);
}
}
/**
* Generates the XML container page bean for the given containers.
*
* @param containers the containers
* @param containerpageRootPath the container page root path
*
* @return the container page bean
*/
private CmsContainerPageBean generateContainerPageForContainers(
Collection containers,
String containerpageRootPath) {
List containerBeans = new ArrayList();
for (CmsContainer container : containers) {
CmsContainerBean containerBean = getContainerBeanToSave(container, containerpageRootPath);
containerBeans.add(containerBean);
}
CmsContainerPageBean page = new CmsContainerPageBean(containerBeans);
return page;
}
/**
* Reads the cached element-bean for the given client-side-id from cache.
*
* @param clientId the client-side-id
* @param pageRootPath the container page root path
*
* @return the cached container element bean
*
* @throws CmsException in case reading the element resource fails
*/
private CmsContainerElementBean getCachedElement(String clientId, String pageRootPath) throws CmsException {
String id = clientId;
CmsContainerElementBean element = null;
element = getSessionCache().getCacheContainerElement(id);
if (element != null) {
return element;
}
if (id.contains(CmsADEManager.CLIENT_ID_SEPERATOR)) {
id = getServerIdString(id);
element = getSessionCache().getCacheContainerElement(id);
if (element != null) {
return element;
}
}
// this is necessary if the element has not been cached yet
CmsResource resource = getCmsObject().readResource(convertToServerId(id), CmsResourceFilter.IGNORE_EXPIRATION);
CmsADEConfigData configData = getConfigData(pageRootPath);
CmsResourceTypeConfig typeConfig = configData.getResourceType(
OpenCms.getResourceManager().getResourceType(resource).getTypeName());
element = new CmsContainerElementBean(
convertToServerId(id),
null,
null,
(typeConfig != null) && typeConfig.isCopyInModels());
getSessionCache().setCacheContainerElement(element.editorHash(), element);
return element;
}
/**
* Returns a list of container elements from a list with client id's.
*
* @param clientIds list of client id's
* @param pageRootPath the container page root path
*
* @return a list of element beans
* @throws CmsException in case reading the element resource fails
*/
private List getCachedElements(List clientIds, String pageRootPath)
throws CmsException {
List result = new ArrayList();
for (String id : clientIds) {
try {
result.add(getCachedElement(id, pageRootPath));
} catch (CmsIllegalArgumentException e) {
log(e.getLocalizedMessage(), e);
}
}
return result;
}
/**
* Returns the configuration data of the current container page context.
*
* @param pageRootPath the container page root path
*
* @return the configuration data of the current container page context
*/
private CmsADEConfigData getConfigData(String pageRootPath) {
if (m_configData == null) {
m_configData = OpenCms.getADEManager().lookupConfiguration(getCmsObject(), pageRootPath);
}
return m_configData;
}
/**
* Helper method for converting a CmsContainer to a CmsContainerBean when saving a container page.
*
* @param container the container for which the CmsContainerBean should be created
* @param containerpageRootPath the container page root path
*
* @return a container bean
*/
private CmsContainerBean getContainerBeanToSave(CmsContainer container, String containerpageRootPath) {
CmsObject cms = getCmsObject();
List elements = new ArrayList();
for (CmsContainerElement elementData : container.getElements()) {
try {
CmsContainerElementBean newElementBean = getContainerElementBeanToSave(
cms,
containerpageRootPath,
container,
elementData);
if (newElementBean != null) {
elements.add(newElementBean);
}
} catch (Exception e) {
LOG.error(e.getLocalizedMessage(), e);
}
}
CmsContainerBean result = new CmsContainerBean(
container.getName(),
container.getType(),
container.getParentInstanceId(),
container.isRootContainer(),
elements);
return result;
}
/**
* Converts container page element data to a bean which can be saved in a container page.
*
* @param cms the current CMS context
* @param containerpageRootPath the container page root path
* @param container the container containing the element
* @param elementData the data for the single element
*
* @return the container element bean
*
* @throws CmsException if something goes wrong
*/
private CmsContainerElementBean getContainerElementBeanToSave(
CmsObject cms,
String containerpageRootPath,
CmsContainer container,
CmsContainerElement elementData)
throws CmsException {
String elementClientId = elementData.getClientId();
boolean hasUuidPrefix = (elementClientId != null) && elementClientId.matches(CmsUUID.UUID_REGEX + ".*$");
boolean isCreateNew = elementData.isCreateNew();
if (elementData.isNew() && !hasUuidPrefix) {
// Due to the changed save system without the save button, we need to make sure that new elements
// are only created once. This must happen when the user first edits a new element. But we still
// want to save changes to non-new elements on the page, so we skip new elements while saving.
return null;
}
CmsContainerElementBean element = getCachedElement(elementData.getClientId(), containerpageRootPath);
CmsResource resource;
if (element.getResource() == null) {
element.initResource(cms);
resource = element.getResource();
} else {
// make sure resource is readable, this is necessary for new content elements
if (element.getId().isNullUUID()) {
// in memory only element, can not be read nor saved
return null;
}
resource = cms.readResource(element.getId(), CmsResourceFilter.IGNORE_EXPIRATION);
}
// check if there is a valid formatter
int containerWidth = container.getWidth();
CmsADEConfigData config = getConfigData(containerpageRootPath);
CmsFormatterConfiguration formatters = config.getFormatters(cms, resource);
String containerType = null;
containerType = container.getType();
I_CmsFormatterBean formatter = null;
String formatterConfigId = null;
if ((element.getIndividualSettings() != null)
&& (element.getIndividualSettings().get(
CmsFormatterConfig.getSettingsKeyForContainer(container.getName())) != null)) {
formatterConfigId = element.getIndividualSettings().get(
CmsFormatterConfig.getSettingsKeyForContainer(container.getName()));
if (CmsUUID.isValidUUID(formatterConfigId)) {
formatter = OpenCms.getADEManager().getCachedFormatters(false).getFormatters().get(
new CmsUUID(formatterConfigId));
} else if (formatterConfigId.startsWith(CmsFormatterConfig.SCHEMA_FORMATTER_ID)
&& CmsUUID.isValidUUID(formatterConfigId.substring(CmsFormatterConfig.SCHEMA_FORMATTER_ID.length()))) {
formatter = formatters.getFormatterSelection(containerType, containerWidth, true).get(
formatterConfigId);
}
}
if (formatter == null) {
formatter = CmsElementUtil.getFormatterForContainer(
cms,
element,
container,
config,
true,
getSessionCache());
if (formatter != null) {
formatterConfigId = formatter.isFromFormatterConfigFile()
? formatter.getId()
: CmsFormatterConfig.SCHEMA_FORMATTER_ID + formatter.getJspStructureId().toString();
}
}
CmsContainerElementBean newElementBean = null;
if (formatter != null) {
Map settings = new HashMap(element.getIndividualSettings());
String formatterKey = CmsFormatterConfig.getSettingsKeyForContainer(container.getName());
settings.put(formatterKey, formatterConfigId);
// remove not used formatter settings
Iterator> entries = settings.entrySet().iterator();
while (entries.hasNext()) {
Entry entry = entries.next();
if (entry.getKey().startsWith(CmsFormatterConfig.FORMATTER_SETTINGS_KEY)
&& !entry.getKey().equals(formatterKey)) {
entries.remove();
}
}
newElementBean = new CmsContainerElementBean(
element.getId(),
formatter.getJspStructureId(),
settings,
isCreateNew);
}
return newElementBean;
}
/**
* Returns the requested container-page resource.
*
* @param cms the current cms object
*
* @return the container-page resource
*
* @throws CmsException if the resource could not be read for any reason
*/
private CmsResource getContainerpage(CmsObject cms) throws CmsException {
String currentUri = cms.getRequestContext().getUri();
CmsResource containerPage = cms.readResource(currentUri);
if (!CmsResourceTypeXmlContainerPage.isContainerPage(containerPage)) {
// container page is used as template
String cntPagePath = cms.readPropertyObject(
containerPage,
CmsPropertyDefinition.PROPERTY_TEMPLATE_ELEMENTS,
true).getValue("");
try {
containerPage = cms.readResource(cntPagePath);
} catch (CmsException e) {
if (!LOG.isDebugEnabled()) {
LOG.warn(e.getLocalizedMessage());
}
LOG.debug(e.getLocalizedMessage(), e);
}
}
return containerPage;
}
/**
* Returns the data of the given elements.
*
* @param page the current container page
* @param clientIds the list of IDs of the elements to retrieve the data for
* @param uriParam the current URI
* @param detailContentId the detail content structure id
* @param containers the containers for which the element data should be fetched
* @param allowNested if nested containers are allowed
* @param allwaysCopy true
in case reading data for a clipboard element used as a copy group
* @param dndOriginContainer the container from which an element was dragged (null if this method is not called for DND)
* @param isDragMode if the page is in drag mode
* @param locale the locale to use
*
* @return the elements data
*
* @throws CmsException if something really bad happens
*/
private Map getElements(
CmsResource page,
Collection clientIds,
String uriParam,
CmsUUID detailContentId,
Collection containers,
boolean allowNested,
boolean allwaysCopy,
String dndOriginContainer,
boolean isDragMode,
Locale locale)
throws CmsException {
CmsObject cms = getCmsObject();
CmsContainerPageBean pageBean = generateContainerPageForContainers(
containers,
cms.getRequestContext().addSiteRoot(uriParam));
Map idMapping = new HashMap();
for (String elemId : clientIds) {
if ((elemId == null)) {
continue;
}
CmsContainerElementBean element = getCachedElement(elemId, cms.getRequestContext().addSiteRoot(uriParam));
if (element.getInstanceId() == null) {
element = element.clone();
getSessionCache().setCacheContainerElement(element.editorHash(), element);
}
element.initResource(cms);
idMapping.put(elemId, element);
}
List foundGroups = new ArrayList();
if (CmsContainerElement.MENU_CONTAINER_ID.equals(dndOriginContainer)) {
// this indicates the element is added to the page and not being repositioned, check for model group data
CmsModelGroupHelper modelHelper = new CmsModelGroupHelper(
cms,
getConfigData(uriParam),
getSessionCache(),
isEditingModelGroups(cms, page));
pageBean = modelHelper.prepareforModelGroupContent(idMapping, foundGroups, pageBean, allwaysCopy, locale);
}
CmsElementUtil elemUtil = new CmsElementUtil(
cms,
uriParam,
pageBean,
detailContentId,
getRequest(),
getResponse(),
isDragMode,
locale);
Map result = new HashMap();
Set ids = new HashSet();
for (Entry entry : idMapping.entrySet()) {
CmsContainerElementBean element = entry.getValue();
String dndId = null;
if (ids.contains(element.editorHash())) {
continue;
}
if ((dndOriginContainer != null) && !CmsContainerElement.MENU_CONTAINER_ID.equals(dndOriginContainer)) {
CmsFormatterConfiguration formatterConfig = elemUtil.getFormatterConfiguration(element.getResource());
Map dndSettings = getSettingsToChangeForDnd(
element.getIndividualSettings(),
formatterConfig,
containers,
dndOriginContainer,
allowNested);
if (!dndSettings.isEmpty()) {
CmsContainerElementBean dndElementBean = overrideSettings(element, dndSettings);
getSessionCache().setCacheContainerElement(dndElementBean.editorHash(), dndElementBean);
dndId = dndElementBean.editorHash();
Map dndResults = getElements(
page,
Arrays.asList(dndId),
uriParam,
detailContentId,
containers,
allowNested,
false,
null,
isDragMode,
locale);
result.putAll(dndResults);
}
}
CmsContainerElementData elementData = elemUtil.getElementData(page, element, containers, allowNested);
if (elementData == null) {
continue;
}
elementData.setDndId(dndId);
result.put(entry.getKey(), elementData);
if (elementData.isGroupContainer() || elementData.isInheritContainer()) {
// this is a group-container
CmsResource elementRes = cms.readResource(element.getId());
List subElements = elementData.isGroupContainer()
? getGroupContainerElements(elementRes)
: getInheritedElements(elementRes, locale, uriParam);
// adding all sub-items to the elements data
for (CmsContainerElementBean subElement : subElements) {
getSessionCache().setCacheContainerElement(subElement.editorHash(), subElement);
if (!ids.contains(subElement.editorHash())) {
CmsContainerElementData subItemData = elemUtil.getElementData(
page,
subElement,
containers,
allowNested);
ids.add(subElement.editorHash());
result.put(subElement.editorHash(), subItemData);
}
}
}
ids.add(element.editorHash());
}
for (CmsContainerElementData elementData : result.values()) {
elementData.setGroup(foundGroups.contains(elementData.getClientId()));
}
return result;
}
/**
* Helper method for converting a CmsGroupContainer to a CmsGroupContainerBean when saving a group container.
*
* @param groupContainer the group-container data
* @param containerPage the container page
* @param locale the locale to use
*
* @return the group-container bean
*/
private CmsGroupContainerBean getGroupContainerBean(
CmsGroupContainer groupContainer,
CmsResource containerPage,
String locale) {
CmsObject cms = getCmsObject();
List elements = new ArrayList();
for (CmsContainerElement elementData : groupContainer.getElements()) {
try {
if (elementData.isNew()) {
elementData = createNewElement(
containerPage.getStructureId(),
elementData.getClientId(),
elementData.getResourceType(),
null,
locale);
}
CmsContainerElementBean element = getCachedElement(
elementData.getClientId(),
containerPage.getRootPath());
// make sure resource is readable,
if (cms.existsResource(element.getId(), CmsResourceFilter.IGNORE_EXPIRATION)) {
elements.add(element);
}
} catch (Exception e) {
log(e.getLocalizedMessage(), e);
}
}
return new CmsGroupContainerBean(
groupContainer.getTitle(),
groupContainer.getDescription(),
elements,
groupContainer.getTypes());
}
/**
* Returns the sub-elements of this group container resource.
*
* @param resource the group container resource
*
* @return the sub-elements
*
* @throws CmsException if something goes wrong reading the resource
*/
private List getGroupContainerElements(CmsResource resource) throws CmsException {
CmsXmlGroupContainer xmlGroupContainer = CmsXmlGroupContainerFactory.unmarshal(
getCmsObject(),
resource,
getRequest());
CmsGroupContainerBean groupContainer = xmlGroupContainer.getGroupContainer(getCmsObject());
return groupContainer.getElements();
}
/**
* Gets the structure ids of group container elements from an unmarshalled group container for a single locale.
*
* @param groupContainer the group container
* @param locale the locale for which we want the element ids
*
* @return the group container's element ids for the given locale
*/
private Set getGroupElementIds(CmsXmlGroupContainer groupContainer, Locale locale) {
Set idSet = new HashSet();
CmsGroupContainerBean groupContainerBean = groupContainer.getGroupContainer(getCmsObject());
if (groupContainerBean != null) {
for (CmsContainerElementBean element : groupContainerBean.getElements()) {
idSet.add(element.getId());
}
}
return idSet;
}
/**
* Returns the sub-elements of this inherit container resource.
*
* @param resource the inherit container resource
* @param locale the requested locale
* @param uriParam the current URI
*
* @return the sub-elements
*
* @throws CmsException if something goes wrong reading the resource
*/
private List getInheritedElements(CmsResource resource, Locale locale, String uriParam)
throws CmsException {
CmsObject cms = getCmsObject();
cms.getRequestContext().setLocale(locale);
CmsInheritanceReferenceParser parser = new CmsInheritanceReferenceParser(cms);
parser.parse(resource);
CmsInheritanceReference ref = parser.getReference(locale);
if (ref == null) {
// new inheritance reference, return an empty list
return Collections.emptyList();
}
String name = ref.getName();
CmsADEManager adeManager = OpenCms.getADEManager();
CmsInheritedContainerState result = adeManager.getInheritedContainerState(cms, cms.addSiteRoot(uriParam), name);
return result.getElements(true);
}
/**
* Returns the data of the given elements.
*
* @param listElements the list of element beans to retrieve the data for
* @param containerpageUri the current URI
* @param detailContentId the detail content structure id
* @param containers the containers which exist on the container page
* @param allowNested if nested containers are allowed
* @param locale the locale to use
*
* @return the elements data
*
* @throws CmsException if something really bad happens
*/
private List getListElementsData(
List listElements,
String containerpageUri,
CmsUUID detailContentId,
Collection containers,
boolean allowNested,
Locale locale)
throws CmsException {
CmsObject cms = getCmsObject();
CmsElementUtil elemUtil = new CmsElementUtil(
cms,
containerpageUri,
generateContainerPageForContainers(containers, cms.getRequestContext().addSiteRoot(containerpageUri)),
detailContentId,
getRequest(),
getResponse(),
true,
locale);
CmsADESessionCache cache = getSessionCache();
List result = new ArrayList();
for (CmsContainerElementBean element : listElements) {
// checking if resource exists
if (cms.existsResource(element.getId(), CmsResourceFilter.ONLY_VISIBLE_NO_DELETED.addRequireFile())) {
cache.setCacheContainerElement(element.editorHash(), element);
CmsContainerElementData elementData = elemUtil.getElementData(
elemUtil.getPage(),
element,
containers,
allowNested);
result.add(elementData);
}
}
return result;
}
/**
* Returns the lock information to the given resource.
*
* @param resource the resource
*
* @return lock information, if the page is locked by another user
*
* @throws CmsException if something goes wrong reading the lock owner user
*/
private String getLockInfo(CmsResource resource) throws CmsException {
CmsObject cms = getCmsObject();
CmsResourceUtil resourceUtil = new CmsResourceUtil(cms, resource);
CmsLock lock = resourceUtil.getLock();
String lockInfo = null;
if (!lock.isLockableBy(cms.getRequestContext().getCurrentUser())) {
if (lock.getType() == CmsLockType.PUBLISH) {
lockInfo = Messages.get().getBundle(OpenCms.getWorkplaceManager().getWorkplaceLocale(cms)).key(
Messages.GUI_LOCKED_FOR_PUBLISH_0);
} else {
CmsUser lockOwner = cms.readUser(lock.getUserId());
lockInfo = Messages.get().getBundle(OpenCms.getWorkplaceManager().getWorkplaceLocale(cms)).key(
Messages.GUI_LOCKED_BY_1,
lockOwner.getFullName());
}
}
return lockInfo;
}
/**
* Returns the element data for a new element not existing in the VFS yet.
*
* @param resourceTypeName the resource type name
* @param uriParam the request parameters
* @param detailContentId the detail content structure id
* @param containers the containers of the template
* @param allowNested if nested containers are allowed
* @param locale the current locale
*
* @return the element data
*
* @throws CmsException if something goes wrong
*/
private CmsContainerElementData getNewElement(
String resourceTypeName,
String uriParam,
CmsUUID detailContentId,
Collection containers,
boolean allowNested,
Locale locale)
throws CmsException {
CmsObject cms = getCmsObject();
CmsElementUtil elemUtil = new CmsElementUtil(
cms,
uriParam,
generateContainerPageForContainers(containers, cms.getRequestContext().addSiteRoot(uriParam)),
detailContentId,
getRequest(),
getResponse(),
true,
locale);
CmsADEConfigData configData = getConfigData(cms.getRequestContext().addSiteRoot(uriParam));
CmsResourceTypeConfig typeConfig = configData.getResourceType(resourceTypeName);
CmsContainerElementBean elementBean = CmsContainerElementBean.createElementForResourceType(
cms,
OpenCms.getResourceManager().getResourceType(resourceTypeName),
"/",
Collections. emptyMap(),
typeConfig.isCopyInModels(),
locale);
CmsContainerElementData data = elemUtil.getElementData(
elemUtil.getPage(),
elementBean,
containers,
allowNested);
getSessionCache().setCacheContainerElement(resourceTypeName, elementBean);
getSessionCache().setCacheContainerElement(elementBean.editorHash(), elementBean);
return data;
}
/**
* Returns the no-edit reason for the given resource.
*
* @param cms the current cms object
* @param containerPage the resource
*
* @return the no-edit reason, empty if editing is allowed
*
* @throws CmsException is something goes wrong
*/
private String getNoEditReason(CmsObject cms, CmsResource containerPage) throws CmsException {
return new CmsResourceUtil(cms, containerPage).getNoEditReason(
OpenCms.getWorkplaceManager().getWorkplaceLocale(cms));
}
/**
* Returns the session cache.
*
* @return the session cache
*/
private CmsADESessionCache getSessionCache() {
if (m_sessionCache == null) {
m_sessionCache = CmsADESessionCache.getCache(getRequest(), getCmsObject());
}
return m_sessionCache;
}
/**
* Returns the workplace settings of the current user.
*
* @return the workplace settings
*/
private CmsWorkplaceSettings getWorkplaceSettings() {
if (m_workplaceSettings == null) {
m_workplaceSettings = CmsWorkplace.getWorkplaceSettings(getCmsObject(), getRequest());
}
return m_workplaceSettings;
}
/**
* Checks if results for the stored gallery data can be restored for the new gallery data.
*
* @param originalGalleryData the original gallery data
* @param data the new gallery data
* @param search the search bean
*
* @return true if the original and new gallery data are compatible, i.e. we can restore the search results
*/
private boolean hasCompatibleSearchData(
CmsGalleryDataBean originalGalleryData,
CmsGalleryDataBean data,
CmsGallerySearchBean search) {
Set originalUsableTypes = Sets.newHashSet();
Set usableTypes = Sets.newHashSet();
for (CmsResourceTypeBean type : originalGalleryData.getTypes()) {
if (!type.isDeactivated()) {
originalUsableTypes.add(type.getType());
}
}
for (CmsResourceTypeBean type : data.getTypes()) {
if (!type.isDeactivated()) {
usableTypes.add(type.getType());
}
}
if (!usableTypes.containsAll(originalUsableTypes)) {
return false;
}
return true;
}
/**
* Initializes request attributes using data from the RPC context.
*
* @param context the RPC context
*/
private void initRequestFromRpcContext(CmsContainerPageRpcContext context) {
if (context.getTemplateContext() != null) {
getRequest().setAttribute(
CmsTemplateContextManager.ATTR_RPC_CONTEXT_OVERRIDE,
context.getTemplateContext());
}
}
/**
* Internal method for saving a group container.
*
* @param cms the cms context
* @param pageStructureId the container page structure id
* @param groupContainer the group container to save
*
* @return the container element representing the group container
*
* @throws CmsException if something goes wrong
* @throws CmsXmlException if the XML processing goes wrong
*/
private CmsPair> internalSaveGroupContainer(
CmsObject cms,
CmsUUID pageStructureId,
CmsGroupContainer groupContainer)
throws CmsException, CmsXmlException {
ensureSession();
CmsResource pageResource = getCmsObject().readResource(pageStructureId, CmsResourceFilter.IGNORE_EXPIRATION);
CmsResource groupContainerResource = null;
if (groupContainer.isNew()) {
CmsADEConfigData config = getConfigData(pageResource.getRootPath());
CmsResourceTypeConfig typeConfig = config.getResourceType(
CmsResourceTypeXmlContainerPage.GROUP_CONTAINER_TYPE_NAME);
groupContainerResource = typeConfig.createNewElement(getCmsObject(), pageResource.getRootPath());
String resourceName = cms.getSitePath(groupContainerResource);
groupContainer.setSitePath(resourceName);
groupContainer.setClientId(groupContainerResource.getStructureId().toString());
}
if (groupContainerResource == null) {
CmsUUID id = convertToServerId(groupContainer.getClientId());
groupContainerResource = cms.readResource(id, CmsResourceFilter.ONLY_VISIBLE_NO_DELETED);
}
CmsGroupContainerBean groupContainerBean = getGroupContainerBean(
groupContainer,
pageResource,
Locale.ENGLISH.toString());
cms.lockResourceTemporary(groupContainerResource);
CmsFile groupContainerFile = cms.readFile(groupContainerResource);
Locale locale = Locale.ENGLISH;
CmsXmlGroupContainer xmlGroupContainer = CmsXmlGroupContainerFactory.unmarshal(cms, groupContainerFile);
Set oldElementIds = getGroupElementIds(xmlGroupContainer, locale);
xmlGroupContainer.clearLocales();
xmlGroupContainer.save(cms, groupContainerBean, locale);
cms.unlockResource(groupContainerResource);
Set newElementIds = getGroupElementIds(xmlGroupContainer, locale);
Set removedElementIds = Sets.difference(oldElementIds, newElementIds);
List deletionCandidateStatuses = new ArrayList();
for (CmsUUID removedId : removedElementIds) {
CmsRemovedElementStatus status = internalGetRemovedElementStatus(removedId, null);
if (status.isDeletionCandidate()) {
deletionCandidateStatuses.add(status);
}
}
CmsContainerElement element = new CmsContainerElement();
element.setClientId(groupContainerFile.getStructureId().toString());
element.setSitePath(cms.getSitePath(groupContainerFile));
element.setResourceType(CmsResourceTypeXmlContainerPage.GROUP_CONTAINER_TYPE_NAME);
return CmsPair.create(element, deletionCandidateStatuses);
}
/**
* Checks if small elements in a container page should be initially editable.
*
* @param request the current request
* @param cms the current CMS context
* @return true if small elements should be initially editable
*/
private boolean isEditSmallElements(HttpServletRequest request, CmsObject cms) {
CmsUser user = cms.getRequestContext().getCurrentUser();
String editSmallElementsStr = (String)(user.getAdditionalInfo().get(ADDINFO_EDIT_SMALL_ELEMENTS));
if (editSmallElementsStr == null) {
return true;
} else {
return Boolean.valueOf(editSmallElementsStr).booleanValue();
}
}
/**
* Checks if a page is a model page.
*
* @param cms the CMS context to use
* @param containerPage the page to check
*
* @return true if the resource is a model page
*/
private boolean isModelPage(CmsObject cms, CmsResource containerPage) {
CmsADEConfigData config = getConfigData(containerPage.getRootPath());
for (CmsModelPageConfig modelConfig : config.getModelPages()) {
if (modelConfig.getResource().getStructureId().equals(containerPage.getStructureId())) {
return true;
}
}
return false;
}
/**
* Saves the given containers to the container page resource.
*
* @param cms the cms context
* @param containerpage the container page resource
* @param containerpageUri the container page site path
* @param containers the container to save
*
* @throws CmsException if something goes wrong writing the file
*/
private void saveContainers(
CmsObject cms,
CmsResource containerpage,
String containerpageUri,
List containers)
throws CmsException {
CmsContainerPageBean page = generateContainerPageForContainers(containers, containerpage.getRootPath());
CmsModelGroupHelper modelHelper = new CmsModelGroupHelper(
getCmsObject(),
getConfigData(containerpage.getRootPath()),
getSessionCache(),
isEditingModelGroups(cms, containerpage));
if (isEditingModelGroups(cms, containerpage)) {
page = modelHelper.saveModelGroups(page, containerpage);
} else {
page = modelHelper.removeModelGroupContainers(page);
}
CmsXmlContainerPage xmlCnt = CmsXmlContainerPageFactory.unmarshal(cms, cms.readFile(containerpageUri));
xmlCnt.save(cms, page);
}
/**
* Saves the inheritance group.
*
* @param resource the inheritance group resource
* @param inheritanceContainer the inherited group container data
*
* @throws CmsException if something goes wrong
*/
private void saveInheritanceGroup(CmsResource resource, CmsInheritanceContainer inheritanceContainer)
throws CmsException {
CmsObject cms = getCmsObject();
CmsFile file = cms.readFile(resource);
CmsXmlContent document = CmsXmlContentFactory.unmarshal(cms, file);
for (Locale docLocale : document.getLocales()) {
document.removeLocale(docLocale);
}
Locale locale = Locale.ENGLISH;
document.addLocale(cms, locale);
document.getValue("Title", locale).setStringValue(cms, inheritanceContainer.getTitle());
document.getValue("Description", locale).setStringValue(cms, inheritanceContainer.getDescription());
document.getValue("ConfigName", locale).setStringValue(cms, inheritanceContainer.getName());
byte[] content = document.marshal();
file.setContents(content);
cms.writeFile(file);
}
/**
* Update favorite or recent list with the given element.
*
* @param containerPage the edited container page
* @param clientId the elements client id
* @param list the list to update
*
* @return the updated list
*
* @throws CmsException in case reading the element resource fails
*/
private List updateFavoriteRecentList(
CmsResource containerPage,
String clientId,
List list)
throws CmsException {
try {
CmsContainerElementBean element = getCachedElement(clientId, containerPage.getRootPath());
Map settings = new HashMap(element.getIndividualSettings());
String formatterID = null;
Iterator> entries = settings.entrySet().iterator();
while (entries.hasNext()) {
Entry entry = entries.next();
if (entry.getKey().startsWith(CmsFormatterConfig.FORMATTER_SETTINGS_KEY)) {
formatterID = entry.getValue();
entries.remove();
}
}
settings.put(CmsFormatterConfig.FORMATTER_SETTINGS_KEY, formatterID);
settings.put(SOURCE_CONTAINERPAGE_ID_SETTING, containerPage.getStructureId().toString());
element = CmsContainerElementBean.cloneWithSettings(element, settings);
Iterator listIt = list.iterator();
while (listIt.hasNext()) {
CmsContainerElementBean listElem = listIt.next();
if (element.getInstanceId().equals(listElem.getInstanceId())) {
listIt.remove();
}
}
list.add(0, element);
return list;
} catch (CmsVfsResourceNotFoundException e) {
LOG.warn(e.getLocalizedMessage(), e);
return list;
}
}
}