org.opencms.workplace.commons.CmsTouch 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 GmbH & Co. KG, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.workplace.commons;
import org.opencms.file.CmsFile;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.jsp.CmsJspActionElement;
import org.opencms.main.CmsException;
import org.opencms.security.CmsPermissionSet;
import org.opencms.util.CmsStringUtil;
import org.opencms.widgets.CmsCalendarWidget;
import org.opencms.workplace.CmsMultiDialog;
import org.opencms.workplace.CmsWorkplaceSettings;
import java.text.ParseException;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
/**
* Provides methods for the touch resource(s) dialog.
*
* The following files use this class:
*
* - /commons/touch.jsp
*
*
*
* @since 6.0.0
*/
public class CmsTouch extends CmsMultiDialog {
/** Value for the action: touch. */
public static final int ACTION_TOUCH = 100;
/** Default value for date last modified, the release and expire date. */
public static final String DEFAULT_DATE_STRING = "-";
/** The dialog type. */
public static final String DIALOG_TYPE = "touch";
/** Request parameter name for the content flag. */
public static final String PARAM_CONTENT = "content";
/** Request parameter name for timestamp. */
public static final String PARAM_NEWTIMESTAMP = "newtimestamp";
/** Request parameter name for the recursive flag. */
public static final String PARAM_RECURSIVE = "recursive";
/** Content parameter. */
private String m_paramContent;
/** Timestamp parameter. */
private String m_paramNewtimestamp;
/** Recursive parameter. */
private String m_paramRecursive;
/**
* Public constructor.
*
* @param jsp an initialized JSP action element
*/
public CmsTouch(CmsJspActionElement jsp) {
super(jsp);
}
/**
* Public constructor with JSP variables.
*
* @param context the JSP page context
* @param req the JSP request
* @param res the JSP response
*/
public CmsTouch(PageContext context, HttpServletRequest req, HttpServletResponse res) {
this(new CmsJspActionElement(context, req, res));
}
/**
* Performs a touch operation for a single resource.
*
* @param resourceName the resource name of the resource to touch
* @param timeStamp the new time stamp
* @param recursive the flag if the touch operation is recursive
* @param correctDate the flag if the new time stamp is a correct date
* @param touchContent if the content has to be rewritten
*
* @throws CmsException if touching the resource fails
*/
public static void touchSingleResource(
CmsObject cms,
String resourceName,
long timeStamp,
boolean recursive,
boolean correctDate,
boolean touchContent) throws CmsException {
CmsResource sourceRes = cms.readResource(resourceName, CmsResourceFilter.ALL);
if (!correctDate) {
// no date value entered, use current resource modification date
timeStamp = sourceRes.getDateLastModified();
}
cms.setDateLastModified(resourceName, timeStamp, recursive);
if (touchContent) {
if (sourceRes.isFile()) {
hardTouch(cms, sourceRes);
} else if (recursive) {
Iterator it = cms.readResources(resourceName, CmsResourceFilter.ALL, true).iterator();
while (it.hasNext()) {
CmsResource subRes = it.next();
if (subRes.isFile()) {
hardTouch(cms, subRes);
}
}
}
}
}
/**
* Rewrites the content of the given file.
*
* @param resource the resource to rewrite the content for
*
* @throws CmsException if something goes wrong
*/
private static void hardTouch(CmsObject cms, CmsResource resource) throws CmsException {
CmsFile file = cms.readFile(resource);
file.setContents(file.getContents());
cms.writeFile(file);
}
/**
* Performs the resource touching, will be called by the JSP page.
*
* @throws JspException if problems including sub-elements occur
*/
public void actionTouch() throws JspException {
// save initialized instance of this class in request attribute for included sub-elements
getJsp().getRequest().setAttribute(SESSION_WORKPLACE_CLASS, this);
try {
if (performDialogOperation()) {
// if no exception is caused and "true" is returned the touch operation was successful
actionCloseDialog();
} else {
// "false" returned, display "please wait" screen
getJsp().include(FILE_DIALOG_SCREEN_WAIT);
}
} catch (Throwable e) {
includeErrorpage(this, e);
}
}
/**
* Creates the "rewrite content" checkbox.
*
* @return the String with the checkbox input field
*/
public String buildCheckContent() {
StringBuffer retValue = new StringBuffer(256);
retValue.append("
\n\t");
retValue.append(" ");
retValue.append(key(Messages.GUI_TOUCH_MODIFY_CONTENT_0));
retValue.append(" \n \n");
return retValue.toString();
}
/**
* Creates the "recursive" checkbox for touching subresources of folders.
*
* @return the String with the checkbox input field or an empty String for folders.
*/
public String buildCheckRecursive() {
StringBuffer retValue = new StringBuffer(256);
// show the checkbox only for folders
if (isOperationOnFolder()) {
retValue.append("
\n\t");
retValue.append(" ");
retValue.append(key(Messages.GUI_TOUCH_MODIFY_SUBRESOURCES_0));
retValue.append(" \n \n");
}
return retValue.toString();
}
/**
* Creates the HTML JavaScript and stylesheet includes required by the calendar for the head of the page.
*
* @return the necessary HTML code for the js and stylesheet includes
*
* @deprecated use {@link CmsCalendarWidget#calendarIncludes(java.util.Locale)}, this is just here so that old JSP still work
*/
@Deprecated
public String calendarIncludes() {
return CmsCalendarWidget.calendarIncludes(getLocale());
}
/**
* Generates the HTML to initialize the JavaScript calendar element on the end of a page.
*
* @param inputFieldId the ID of the input field where the date is pasted to
* @param triggerButtonId the ID of the button which triggers the calendar
* @param align initial position of the calendar popup element
* @param singleClick if true, a single click selects a date and closes the calendar, otherwise calendar is closed by doubleclick
* @param weekNumbers show the week numbers in the calendar or not
* @param mondayFirst show monday as first day of week
* @param dateStatusFunc name of the function which determines if/how a date should be disabled
* @param showTime true if the time selector should be shown, otherwise false
* @return the HTML code to initialize a calendar poup element
*
* @deprecated use {@link CmsCalendarWidget#calendarInit(org.opencms.i18n.CmsMessages, String, String, String, boolean, boolean, boolean, String, boolean)}, this is just here so that old JSP still work
*/
@Deprecated
public String calendarInit(
String inputFieldId,
String triggerButtonId,
String align,
boolean singleClick,
boolean weekNumbers,
boolean mondayFirst,
String dateStatusFunc,
boolean showTime) {
return CmsCalendarWidget.calendarInit(
getMessages(),
inputFieldId,
triggerButtonId,
align,
singleClick,
weekNumbers,
mondayFirst,
dateStatusFunc,
showTime);
}
/**
* Returns the current date and time as String formatted in localized pattern.
*
* @return the current date and time as String formatted in localized pattern
*/
public String getCurrentDateTime() {
// get the current date & time
return CmsCalendarWidget.getCalendarLocalizedTime(getLocale(), getMessages(), System.currentTimeMillis());
}
/**
* Returns the value of the content parameter,
* or null if this parameter was not provided.
*
* The content parameter on files decides if also the content is rewritten.
*
* @return the value of the content parameter
*/
public String getParamContent() {
return m_paramContent;
}
/**
* Returns the value of the new timestamp parameter,
* or null if this parameter was not provided.
*
* The timestamp parameter stores the new timestamp as String.
*
* @return the value of the new timestamp parameter
*/
public String getParamNewtimestamp() {
return m_paramNewtimestamp;
}
/**
* Returns the value of the recursive parameter,
* or null if this parameter was not provided.
*
* The recursive parameter on folders decides if all subresources
* of the folder should be touched, too.
*
* @return the value of the recursive parameter
*/
public String getParamRecursive() {
return m_paramRecursive;
}
/**
* Sets the value of the content parameter.
*
* @param value the value to set
*/
public void setParamContent(String value) {
m_paramContent = value;
}
/**
* Sets the value of the new timestamp parameter.
*
* @param value the value to set
*/
public void setParamNewtimestamp(String value) {
m_paramNewtimestamp = value;
}
/**
* Sets the value of the recursive parameter.
*
* @param value the value to set
*/
public void setParamRecursive(String value) {
m_paramRecursive = value;
}
/**
* @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest)
*/
@Override
protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) {
// fill the parameter values in the get/set methods
fillParamValues(request);
// check the required permissions to touch the resource
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_TYPE.equals(getParamAction())) {
setAction(ACTION_TOUCH);
} else if (DIALOG_WAIT.equals(getParamAction())) {
setAction(ACTION_WAIT);
} else if (DIALOG_CANCEL.equals(getParamAction())) {
setAction(ACTION_CANCEL);
} else if (DIALOG_LOCKS_CONFIRMED.equals(getParamAction())) {
setAction(ACTION_LOCKS_CONFIRMED);
} else {
setAction(ACTION_DEFAULT);
// build title for touch dialog
setDialogTitle(Messages.GUI_TOUCH_RESOURCE_1, Messages.GUI_TOUCH_MULTI_2);
}
}
/**
* Performs the resource touching.
*
* @return true, if the resource was touched, otherwise false
* @throws CmsException if touching is not successful
*/
@Override
protected boolean performDialogOperation() throws CmsException {
// on folder touch or multi resource operation display "please wait" screen, not for simple file copy
if (!DIALOG_WAIT.equals(getParamAction())) {
// check if the "please wait" screen has to be shown
if (isMultiOperation()) {
// show please wait for every multi resource operation
return false;
} else {
// check if the single resource is a folder
CmsResource sourceRes = getCms().readResource(getParamResource(), CmsResourceFilter.ALL);
if (sourceRes.isFolder()) {
return false;
}
}
}
// get the new timestamp for the resource(s) from request parameter
long timeStamp = 0;
boolean correctDate = false;
try {
if (CmsStringUtil.isNotEmpty(getParamNewtimestamp())) {
timeStamp = CmsCalendarWidget.getCalendarDate(getMessages(), getParamNewtimestamp(), true);
correctDate = true;
}
} catch (ParseException e) {
throw new CmsException(Messages.get().container(Messages.ERR_PARSE_TIMESTAMP_1, getParamNewtimestamp()), e);
}
// get the flag if the touch is recursive from request parameter
boolean touchRecursive = Boolean.valueOf(getParamRecursive()).booleanValue();
// get the flag to the touch the content from request parameter
boolean touchContent = Boolean.valueOf(getParamContent()).booleanValue();
// now touch the resource(s)
Iterator i = getResourceList().iterator();
while (i.hasNext()) {
String resName = i.next();
try {
// lock resource if autolock is enabled
checkLock(resName);
touchSingleResource(getCms(), resName, timeStamp, touchRecursive, correctDate, touchContent);
} catch (CmsException e) {
// collect exceptions to create a detailed output
addMultiOperationException(e);
}
}
checkMultiOperationException(Messages.get(), Messages.ERR_TOUCH_MULTI_0);
return true;
}
}