1 31 32 package org.opencms.workplace.commons; 33 34 import org.opencms.file.CmsResource; 35 import org.opencms.file.CmsResourceFilter; 36 import org.opencms.file.CmsVfsException; 37 import org.opencms.file.CmsVfsResourceAlreadyExistsException; 38 import org.opencms.file.CmsVfsResourceNotFoundException; 39 import org.opencms.jsp.CmsJspActionElement; 40 import org.opencms.main.CmsException; 41 import org.opencms.main.CmsLog; 42 import org.opencms.security.CmsPermissionSet; 43 import org.opencms.site.CmsSiteManager; 44 import org.opencms.staticexport.CmsLinkManager; 45 import org.opencms.util.CmsStringUtil; 46 import org.opencms.workplace.CmsMultiDialog; 47 import org.opencms.workplace.CmsWorkplaceSettings; 48 49 import java.util.ArrayList ; 50 import java.util.Iterator ; 51 import java.util.List ; 52 53 import javax.servlet.http.HttpServletRequest ; 54 import javax.servlet.http.HttpServletResponse ; 55 import javax.servlet.jsp.JspException ; 56 import javax.servlet.jsp.PageContext ; 57 58 import org.apache.commons.logging.Log; 59 60 75 public class CmsMove extends CmsMultiDialog { 76 77 78 public static final int ACTION_MOVE = 100; 79 80 81 public static final String DIALOG_TYPE = "move"; 82 83 84 public static final String PARAM_OVERWRITE = "overwrite"; 85 86 87 private static final Log LOG = CmsLog.getLog(CmsMove.class); 88 89 private String m_paramOverwrite; 90 private String m_paramTarget; 91 92 97 public CmsMove(CmsJspActionElement jsp) { 98 99 super(jsp); 100 } 101 102 109 public CmsMove(PageContext context, HttpServletRequest req, HttpServletResponse res) { 110 111 this(new CmsJspActionElement(context, req, res)); 112 } 113 114 119 public void actionMove() throws JspException { 120 121 getJsp().getRequest().setAttribute(SESSION_WORKPLACE_CLASS, this); 123 CmsResource resource = null; 124 try { 125 boolean isFolder = false; 126 String source = (String )getResourceList().get(0); 127 String target = CmsLinkManager.getAbsoluteUri(getParamTarget(), CmsResource.getParentFolder(source)); 128 if (! isMultiOperation()) { 129 resource = getCms().readResource(source, CmsResourceFilter.ALL); 130 isFolder = resource.isFolder(); 131 } else { 132 resource = getCms().readResource(target, CmsResourceFilter.ALL); 133 if (! resource.isFolder()) { 134 throw new CmsVfsException(Messages.get().container(Messages.ERR_MOVE_MULTI_TARGET_NOFOLDER_1, target)); 136 } 137 } 138 if (performDialogOperation()) { 139 if (isMultiOperation() || isFolder) { 141 List folderList = new ArrayList (2); 143 String sourceParent = CmsResource.getParentFolder(source); 144 String targetParent = CmsResource.getParentFolder(target); 145 if (!targetParent.equals(sourceParent)) { 146 folderList.add(targetParent); 148 } 149 folderList.add(sourceParent); 150 getJsp().getRequest().setAttribute(REQUEST_ATTRIBUTE_RELOADTREE, folderList); 151 } 152 actionCloseDialog(); 153 } else { 154 getJsp().include(FILE_DIALOG_SCREEN_WAIT); 156 } 157 } catch (Throwable e) { 158 if (! isMultiOperation() && (e instanceof CmsVfsResourceAlreadyExistsException) && !(resource.isFolder())) { 160 int targetType = -1; 162 boolean restoreSiteRoot = false; 163 try { 164 if (CmsSiteManager.getSiteRoot(getParamTarget()) != null) { 165 getCms().getRequestContext().saveSiteRoot(); 166 getCms().getRequestContext().setSiteRoot("/"); 167 restoreSiteRoot = true; 168 } 169 CmsResource targetRes = getCms().readResource(getParamTarget()); 170 targetType = targetRes.getTypeId(); 171 } catch (CmsException e2) { 172 if (LOG.isInfoEnabled()) { 174 LOG.info(e2.getLocalizedMessage()); 175 } 176 } finally { 177 if (restoreSiteRoot) { 178 getCms().getRequestContext().restoreSiteRoot(); 179 } 180 } 181 if (resource.getTypeId() == targetType) { 182 setParamMessage(CmsStringUtil.escapeHtml(key(Messages.GUI_COPY_CONFIRM_OVERWRITE_2, 184 new Object [] {getParamResource(), getParamTarget()}))); 185 getJsp().include(FILE_DIALOG_SCREEN_CONFIRM); 186 } else { 187 includeErrorpage(this, e); 189 } 190 } else { 191 includeErrorpage(this, e); 193 } 194 } 195 } 196 197 202 public String buildMoveOptions() { 203 204 StringBuffer retValue = new StringBuffer (256); 205 if (isMultiOperation()) { 206 retValue.append("<input type=\"checkbox\" name=\""); 208 retValue.append(PARAM_OVERWRITE); 209 retValue.append("\" value=\"true\"> "); 210 retValue.append(key(Messages.GUI_COPY_MULTI_OVERWRITE_0)); 211 retValue.append("<br>\n"); 212 retValue.append(dialogSpacer()); 213 } 214 return retValue.toString(); 215 } 216 217 224 public String getCurrentResourceName() { 225 226 if (isMultiOperation()) { 227 return ""; 228 } 229 String resourceName = CmsResource.getName(getParamResource()); 230 if (resourceName.endsWith("/")) { 231 resourceName = resourceName.substring(0, resourceName.length() - 1); 232 } 233 return resourceName; 234 } 235 236 241 public String getParamOverwrite() { 242 243 return m_paramOverwrite; 244 } 245 246 255 public String getParamTarget() { 256 257 return m_paramTarget; 258 } 259 260 265 public void setParamOverwrite(String paramOverwrite) { 266 267 m_paramOverwrite = paramOverwrite; 268 } 269 270 275 public void setParamTarget(String value) { 276 277 m_paramTarget = value; 278 } 279 280 283 protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { 284 285 fillParamValues(request); 287 288 if (! checkResourcePermissions(CmsPermissionSet.ACCESS_WRITE, false)) { 290 setParamAction(DIALOG_CANCEL); 292 } 293 294 setParamDialogtype(DIALOG_TYPE); 296 if (DIALOG_TYPE.equals(getParamAction())) { 298 setAction(ACTION_MOVE); 299 } else if (DIALOG_CONFIRMED.equals(getParamAction())) { 300 setAction(ACTION_CONFIRMED); 301 } else if (DIALOG_WAIT.equals(getParamAction())) { 302 setAction(ACTION_WAIT); 303 } else if (DIALOG_CANCEL.equals(getParamAction())) { 304 setAction(ACTION_CANCEL); 305 } else { 306 setAction(ACTION_DEFAULT); 307 setDialogTitle(Messages.GUI_MOVE_RESOURCE_1, Messages.GUI_MOVE_MULTI_2); 309 } 310 } 311 312 318 protected boolean performDialogOperation() throws CmsException { 319 320 boolean isFolder = isOperationOnFolder(); 322 if ((isMultiOperation() || isFolder) && !DIALOG_WAIT.equals(getParamAction())) { 324 return false; 326 } 327 328 boolean overwrite = Boolean.valueOf(getParamOverwrite()).booleanValue(); 330 overwrite = ((isMultiOperation() && overwrite) || DIALOG_CONFIRMED.equals(getParamAction())); 331 332 String target = getParamTarget(); 334 if (target == null) { 335 target = ""; 336 } 337 338 boolean restoreSiteRoot = false; 339 try { 340 String sitePrefix = ""; 342 if (CmsSiteManager.getSiteRoot(target) != null) { 343 String siteRootFolder = getCms().getRequestContext().getSiteRoot(); 344 if (siteRootFolder.endsWith("/")) { 345 siteRootFolder = siteRootFolder.substring(0, siteRootFolder.length() - 1); 346 } 347 sitePrefix = siteRootFolder; 348 getCms().getRequestContext().saveSiteRoot(); 349 getCms().getRequestContext().setSiteRoot("/"); 350 restoreSiteRoot = true; 351 } 352 353 Iterator i = getResourceList().iterator(); 354 while (i.hasNext()) { 356 String resName = (String )i.next(); 357 try { 358 performSingleMoveOperation(resName, target, sitePrefix, overwrite); 359 } catch (CmsException e) { 360 if (isMultiOperation()) { 361 addMultiOperationException(e); 363 } else { 364 throw e; 366 } 367 } 368 } 369 checkMultiOperationException(Messages.get(), Messages.ERR_MOVE_MULTI_0); 371 } finally { 372 if (restoreSiteRoot) { 373 getCms().getRequestContext().restoreSiteRoot(); 374 } 375 } 376 return true; 377 } 378 379 388 protected void performSingleMoveOperation(String source, String target, String sitePrefix, boolean overwrite) 389 throws CmsException { 390 391 target = CmsLinkManager.getAbsoluteUri(target, CmsResource.getParentFolder(source)); 393 394 if (target.equals(source) || (isMultiOperation() && target.startsWith(source))) { 395 throw new CmsVfsException(Messages.get().container(Messages.ERR_MOVE_ONTO_ITSELF_1, target)); 396 } 397 398 try { 399 CmsResource res = getCms().readResource(target, CmsResourceFilter.ALL); 400 if (res.isFolder()) { 401 if (! target.endsWith("/")) { 403 target += "/"; 404 } 405 target = target + CmsResource.getName(source); 406 if (target.endsWith("/")) { 407 target = target.substring(0, target.length() - 1); 408 } 409 } 410 } catch (CmsVfsResourceNotFoundException e) { 411 if (LOG.isInfoEnabled()) { 413 LOG.info(e.getLocalizedMessage()); 414 } 415 } 416 417 setParamTarget(target); 419 420 setParamTarget(target); 422 423 if (getCms().existsResource(target, CmsResourceFilter.ALL)) { 425 if (overwrite) { 426 checkLock(target); 427 getCms().deleteResource(target, CmsResource.DELETE_PRESERVE_SIBLINGS); 428 } else { 429 throw new CmsVfsResourceAlreadyExistsException(Messages.get().container( 431 Messages.ERR_MOVE_FAILED_TARGET_EXISTS_2, 432 source, 433 getJsp().getRequestContext().removeSiteRoot(target))); 434 } 435 } 436 437 checkLock(sitePrefix + source); 439 getCms().moveResource(sitePrefix + source, target); 441 } 442 } 443 | Popular Tags |