/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.workplace.commons; 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.types.CmsResourceTypePlain; import org.opencms.file.types.I_CmsResourceType; import org.opencms.jsp.CmsJspActionElement; import org.opencms.loader.CmsLoaderException; import org.opencms.main.CmsException; import org.opencms.main.OpenCms; import org.opencms.security.CmsPermissionSet; import org.opencms.security.CmsRole; import org.opencms.util.CmsStringUtil; import org.opencms.workplace.CmsWorkplace; import org.opencms.workplace.CmsWorkplaceSettings; import org.opencms.workplace.explorer.CmsExplorerTypeSettings; import org.opencms.workplace.explorer.CmsNewResource; import org.opencms.workplace.list.A_CmsListResourceTypeDialog; import org.opencms.workplace.list.CmsListItem; import org.opencms.workplace.list.CmsListOrderEnum; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; /** * The change resource type dialog handles the change of a resource type of a single VFS file.<p> * * The following files use this class: * <ul> * <li>/commons/chtype.jsp * </ul> * <p> * * @since 6.0.0 */ public class CmsChtype extends A_CmsListResourceTypeDialog { /** Dialog action: show advanced list (for workplace VFS managers). */ public static final int ACTION_ADVANCED = 555; /** The dialog type.<p> */ public static final String DIALOG_TYPE = "chtype"; /** Session attribute to store advanced mode. */ public static final String SESSION_ATTR_ADVANCED = "ocms_chtype_adv"; /** Flag indicating if dialog is in advanced mode. */ private boolean m_advancedMode; /** The available resource types as String, if set. */ private String m_availableResTypes; /** Flag indicating if resource types to select are limited. */ private boolean m_limitedRestypes; /** * Public constructor with JSP action element.<p> * * @param jsp an initialized JSP action element */ public CmsChtype(CmsJspActionElement jsp) { super( jsp, A_CmsListResourceTypeDialog.LIST_ID, Messages.get().container(Messages.GUI_CHTYPE_PLEASE_SELECT_0), A_CmsListResourceTypeDialog.LIST_COLUMN_NAME, CmsListOrderEnum.ORDER_ASCENDING, null); } /** * Public constructor with JSP variables.<p> * * @param context the JSP page context * @param req the JSP request * @param res the JSP response */ public CmsChtype(PageContext context, HttpServletRequest req, HttpServletResponse res) { this(new CmsJspActionElement(context, req, res)); } /** * Uploads the specified file and replaces the VFS file.<p> * * @throws JspException if inclusion of error dialog fails */ public void actionChtype() throws JspException { int plainId; try { plainId = OpenCms.getResourceManager().getResourceType(CmsResourceTypePlain.getStaticTypeName()).getTypeId(); } catch (CmsLoaderException e) { // this should really never happen plainId = CmsResourceTypePlain.getStaticTypeId(); } try { int newType = plainId; try { // get new resource type id from request newType = Integer.parseInt(getParamSelectedType()); } catch (NumberFormatException nf) { throw new CmsException(Messages.get().container(Messages.ERR_GET_RESTYPE_1, getParamSelectedType())); } // check the resource lock state checkLock(getParamResource()); // change the resource type getCms().chtype(getParamResource(), newType); // close the dialog window actionCloseDialog(); } catch (Throwable e) { // error changing resource type, show error dialog includeErrorpage(this, e); } } /** * @see org.opencms.workplace.list.A_CmsListDialog#actionDialog() */ public void actionDialog() throws JspException, ServletException, IOException { if (getAction() == ACTION_OK) { actionChtype(); return; } else if (getAction() == ACTION_ADVANCED) { refreshList(); return; } super.actionDialog(); } /** * Builds a default button row with a continue and cancel button.<p> * * Override this to have special buttons for your dialog.<p> * * @return the button row */ public String dialogButtons() { return dialogButtonsOkAdvancedCancel( " onclick=\"submitChtype(form);\"", " onclick=\"submitAdvanced(form);\"", null); } /** * Builds a button row with an optional "ok", "advanced" and a "cancel" button.<p> * * @param okAttrs optional attributes for the ok button * @param advancedAttrs optional attributes for the advanced button * @param cancelAttrs optional attributes for the cancel button * @return the button row */ public String dialogButtonsOkAdvancedCancel(String okAttrs, String advancedAttrs, String cancelAttrs) { if (!m_advancedMode && m_limitedRestypes && OpenCms.getRoleManager().hasRole(getCms(), CmsRole.VFS_MANAGER)) { return dialogButtons(new int[] {BUTTON_OK, BUTTON_ADVANCED, BUTTON_CANCEL}, new String[] { okAttrs, advancedAttrs, cancelAttrs}); } else { return dialogButtonsOkCancel(okAttrs, cancelAttrs); } } /** * @see org.opencms.workplace.list.A_CmsListResourceTypeDialog#getParamSelectedType() */ public String getParamSelectedType() { String item = super.getParamSelectedType(); if (CmsStringUtil.isEmptyOrWhitespaceOnly(item)) { // determine resource type id of resource to change try { CmsResource res = getCms().readResource(getParamResource(), CmsResourceFilter.ALL); return Integer.toString(res.getTypeId()); } catch (CmsException e) { // do nothing } } return item; } /** * Returns the html code to add directly before the list inside the form element.<p> * * @return the html code to add directly before the list inside the form element */ protected String customHtmlBeforeList() { StringBuffer result = new StringBuffer(256); result.append(dialogBlockStart(null)); result.append(key(Messages.GUI_LABEL_TITLE_0)); result.append(": "); result.append(getJsp().property("Title", getParamResource(), "")); result.append("<br>"); result.append(key(Messages.GUI_LABEL_STATE_0)); result.append(": "); try { result.append(getState()); } catch (CmsException e) { // not so important ... just go on } result.append("<br>"); result.append(key(Messages.GUI_LABEL_PERMALINK_0)); result.append(": "); result.append(OpenCms.getLinkManager().getPermalink(getCms(), getParamResource())); result.append(dialogBlockEnd()); result.append(dialogSpacer()); return result.toString(); } /** * @see org.opencms.workplace.list.A_CmsListDialog#customHtmlStart() */ protected String customHtmlStart() { StringBuffer result = new StringBuffer(256); result.append(super.customHtmlStart()); result.append("<script type='text/javascript'>\n"); result.append("function submitAdvanced(theForm) {\n"); result.append("\ttheForm.action.value = \"" + CmsNewResource.DIALOG_ADVANCED + "\";\n"); result.append("\ttheForm.submit();\n"); result.append("}\n\n"); result.append("function submitChtype(theForm) {\n"); result.append("\ttheForm.action.value = \"" + DIALOG_OK + "\";\n"); result.append("\ttheForm.submit();\n"); result.append("}\n\n"); result.append("</script>"); return result.toString(); } /** * @see org.opencms.workplace.list.A_CmsListDialog#getListItems() */ protected List getListItems() throws CmsException { List ret = new ArrayList(); // fill the list with available resource types if they are limited List availableResTypes = new ArrayList(); if (!m_advancedMode && m_limitedRestypes) { if (m_availableResTypes.indexOf(CmsNewResource.DELIM_PROPERTYVALUES) > -1) { availableResTypes = CmsStringUtil.splitAsList( m_availableResTypes, CmsNewResource.DELIM_PROPERTYVALUES, true); } else { availableResTypes = CmsStringUtil.splitAsList( m_availableResTypes, CmsProperty.VALUE_LIST_DELIMITER, true); } } // get current Cms object CmsObject cms = getCms(); // determine resource type id of resource to change CmsResource res = cms.readResource(getParamResource(), CmsResourceFilter.ALL); // get all available explorer type settings List resTypes = OpenCms.getWorkplaceManager().getExplorerTypeSettings(); boolean isFolder = res.isFolder(); // loop through all visible resource types for (int i = 0; i < resTypes.size(); i++) { boolean changeable = false; // get explorer type settings for current resource type CmsExplorerTypeSettings settings = (CmsExplorerTypeSettings)resTypes.get(i); // only if settings is a real resourcetype boolean isResourceType; I_CmsResourceType type = new CmsResourceTypePlain(); try { type = OpenCms.getResourceManager().getResourceType(settings.getName()); isResourceType = true; } catch (CmsLoaderException e) { isResourceType = false; } if (isResourceType) { // first check if types are limited if (!m_advancedMode && m_limitedRestypes && (availableResTypes.indexOf(type.getTypeName()) == -1)) { // this resource type is not in the list of available types, skip it continue; } int resTypeId = OpenCms.getResourceManager().getResourceType(settings.getName()).getTypeId(); // determine if this resTypeId is changeable by currentResTypeId // changeable is true if current resource is a folder and this resource type also if (isFolder && OpenCms.getResourceManager().getResourceType(resTypeId).isFolder()) { changeable = true; } else if (!isFolder && !OpenCms.getResourceManager().getResourceType(resTypeId).isFolder()) { // changeable is true if current resource is NOT a folder and this resource type also NOT changeable = true; } if (changeable) { // determine if this resource type is editable for the current user CmsPermissionSet permissions = settings.getAccess().getPermissions(cms, res); if (!permissions.requiresWritePermission() || !permissions.requiresControlPermission()) { // skip resource types without required write or create permissions continue; } // add found setting to list CmsListItem item = getList().newItem(Integer.toString(resTypeId)); item.set(LIST_COLUMN_NAME, key(settings.getKey())); item.set(LIST_COLUMN_ICON, "<img src=\"" + getSkinUri() + CmsWorkplace.RES_PATH_FILETYPES + settings.getIcon() + "\" style=\"width: 16px; height: 16px;\" />"); ret.add(item); } } } return ret; } /** * @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest) */ protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { // first call of dialog setAction(ACTION_DEFAULT); super.initWorkplaceRequestValues(settings, request); // check the required permissions to change the resource type if (!checkResourcePermissions(CmsPermissionSet.ACCESS_WRITE, false)) { // no write permissions for the resource, set cancel action to close dialog setParamAction(DIALOG_CANCEL); } // set the dialog type setParamDialogtype(DIALOG_TYPE); // set the action for the JSP switch if (DIALOG_OK.equals(getParamAction())) { // ok button pressed, change file type setAction(ACTION_OK); getJsp().getRequest().getSession(true).removeAttribute(SESSION_ATTR_ADVANCED); } else if (DIALOG_LOCKS_CONFIRMED.equals(getParamAction())) { setAction(ACTION_LOCKS_CONFIRMED); } else if (DIALOG_CANCEL.equals(getParamAction())) { // cancel button pressed setAction(ACTION_CANCEL); getJsp().getRequest().getSession(true).removeAttribute(SESSION_ATTR_ADVANCED); } else { // build title for change file type dialog setParamTitle(key(Messages.GUI_CHTYPE_1, new Object[] {CmsResource.getName(getParamResource())})); } // get session attribute storing if we are in advanced mode String sessionAttr = (String)request.getSession(true).getAttribute(SESSION_ATTR_ADVANCED); if (CmsNewResource.DIALOG_ADVANCED.equals(getParamAction()) || (sessionAttr != null)) { // advanced mode to display all possible resource types if (sessionAttr == null) { // set attribute that we are in advanced mode request.getSession(true).setAttribute(SESSION_ATTR_ADVANCED, "true"); setAction(ACTION_ADVANCED); } m_advancedMode = true; } else { // check for presence of property limiting the new resource types to create String newResTypesProperty = ""; try { newResTypesProperty = getCms().readPropertyObject( getParamResource(), CmsPropertyDefinition.PROPERTY_RESTYPES_AVAILABLE, true).getValue(); } catch (CmsException e) { // ignore this exception, this is a minor issue } if (CmsStringUtil.isNotEmpty(newResTypesProperty) && !newResTypesProperty.equals(CmsNewResource.VALUE_DEFAULT)) { m_limitedRestypes = true; m_availableResTypes = newResTypesProperty; } } } }