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 CmsCopy extends CmsMultiDialog { 76 77 78 public static final int ACTION_COPY = 100; 79 80 81 public static final String DIALOG_TYPE = "copy"; 82 83 84 public static final String PARAM_KEEPRIGHTS = "keeprights"; 85 86 87 public static final String PARAM_OVERWRITE = "overwrite"; 88 89 90 private static final Log LOG = CmsLog.getLog(CmsCopy.class); 91 92 private String m_paramCopymode; 93 private String m_paramKeeprights; 94 private String m_paramOverwrite; 95 private String m_paramTarget; 96 97 102 public CmsCopy(CmsJspActionElement jsp) { 103 104 super(jsp); 105 } 106 107 114 public CmsCopy(PageContext context, HttpServletRequest req, HttpServletResponse res) { 115 116 this(new CmsJspActionElement(context, req, res)); 117 } 118 119 124 public void actionCopy() throws JspException { 125 126 getJsp().getRequest().setAttribute(SESSION_WORKPLACE_CLASS, this); 128 CmsResource resource = null; 129 try { 130 boolean isFolder = false; 131 String source = (String )getResourceList().get(0); 132 String target = CmsLinkManager.getAbsoluteUri(getParamTarget(), CmsResource.getParentFolder(source)); 133 if (! isMultiOperation()) { 134 resource = getCms().readResource(source, CmsResourceFilter.ALL); 135 isFolder = resource.isFolder(); 136 } else { 137 String siteRootFolder = null; 138 try { 139 if (CmsSiteManager.getSiteRoot(target) != null) { 141 siteRootFolder = getCms().getRequestContext().getSiteRoot(); 142 if (siteRootFolder.endsWith("/")) { 143 siteRootFolder = siteRootFolder.substring(0, siteRootFolder.length() - 1); 144 } 145 getCms().getRequestContext().setSiteRoot("/"); 146 } 147 resource = getCms().readResource(target, CmsResourceFilter.ALL); 148 } finally { 149 if (siteRootFolder != null) { 150 getCms().getRequestContext().setSiteRoot(siteRootFolder); 151 } 152 } 153 if (! resource.isFolder()) { 154 throw new CmsVfsException(Messages.get().container(Messages.ERR_COPY_MULTI_TARGET_NOFOLDER_1, target)); 156 } 157 } 158 if (performDialogOperation()) { 159 if (isMultiOperation() || isFolder) { 161 List folderList = new ArrayList (1); 163 String targetParent = CmsResource.getParentFolder(target); 164 folderList.add(targetParent); 165 getJsp().getRequest().setAttribute(REQUEST_ATTRIBUTE_RELOADTREE, folderList); 166 } 167 actionCloseDialog(); 168 } else { 169 getJsp().include(FILE_DIALOG_SCREEN_WAIT); 171 } 172 } catch (Throwable e) { 173 if (! isMultiOperation() && (e instanceof CmsVfsResourceAlreadyExistsException) && !(resource.isFolder())) { 175 int targetType = -1; 177 boolean restoreSiteRoot = false; 178 try { 179 if (CmsSiteManager.getSiteRoot(getParamTarget()) != null) { 180 getCms().getRequestContext().saveSiteRoot(); 181 getCms().getRequestContext().setSiteRoot("/"); 182 restoreSiteRoot = true; 183 } 184 CmsResource targetRes = getCms().readResource(getParamTarget()); 185 targetType = targetRes.getTypeId(); 186 } catch (CmsException e2) { 187 if (LOG.isInfoEnabled()) { 189 LOG.info(e2.getLocalizedMessage()); 190 } 191 } finally { 192 if (restoreSiteRoot) { 193 getCms().getRequestContext().restoreSiteRoot(); 194 } 195 } 196 if (resource.getTypeId() == targetType) { 197 setParamMessage(CmsStringUtil.escapeHtml(key(Messages.GUI_COPY_CONFIRM_OVERWRITE_2, new Object [] { 199 getParamResource(), 200 getParamTarget()}))); 201 getJsp().include(FILE_DIALOG_SCREEN_CONFIRM); 202 } else { 203 includeErrorpage(this, e); 205 } 206 } else { 207 includeErrorpage(this, e); 209 } 210 } 211 } 212 213 218 public String buildRadioCopyMode() { 219 220 StringBuffer retValue = new StringBuffer (256); 221 222 boolean isFolder = isOperationOnFolder(); 224 String checkedAttr = " checked=\"checked\""; 225 226 if (isMultiOperation() || isFolder) { 227 int defaultMode = getSettings().getUserSettings().getDialogCopyFolderMode(); 229 retValue.append("<input type=\"radio\" name=\"copymode\" value=\""); 230 retValue.append(CmsResource.COPY_AS_SIBLING); 231 retValue.append("\""); 232 if (defaultMode == CmsResource.COPY_AS_SIBLING) { 233 retValue.append(checkedAttr); 234 } 235 retValue.append("> "); 236 String msgKey; 237 if (isMultiOperation()) { 238 msgKey = Messages.GUI_COPY_MULTI_CREATE_SIBLINGS_0; 239 } else { 240 msgKey = Messages.GUI_COPY_CREATE_SIBLINGS_0; 241 } 242 retValue.append(key(msgKey)); 243 retValue.append("<br>\n"); 244 retValue.append("<input type=\"radio\" name=\"copymode\" value=\""); 245 retValue.append(CmsResource.COPY_PRESERVE_SIBLING); 246 retValue.append("\""); 247 if (defaultMode == CmsResource.COPY_PRESERVE_SIBLING) { 248 retValue.append(checkedAttr); 249 } 250 retValue.append("> "); 251 retValue.append(key(Messages.GUI_COPY_ALL_NO_SIBLINGS_0)); 252 retValue.append("<br>\n"); 253 retValue.append("<input type=\"radio\" name=\"copymode\" value=\""); 254 retValue.append(CmsResource.COPY_AS_NEW); 255 retValue.append("\""); 256 if (defaultMode == CmsResource.COPY_AS_NEW) { 257 retValue.append(checkedAttr); 258 } 259 retValue.append("> "); 260 retValue.append(key(Messages.GUI_COPY_ALL_0)); 261 retValue.append("<br>\n"); 262 263 if (isMultiOperation()) { 264 retValue.append(dialogSpacer()); 266 retValue.append("<input type=\"checkbox\" name=\""); 267 retValue.append(PARAM_OVERWRITE); 268 retValue.append("\" value=\"true\"> "); 269 retValue.append(key(Messages.GUI_COPY_MULTI_OVERWRITE_0)); 270 retValue.append("<br>\n"); 271 } 272 } else { 273 int defaultMode = getSettings().getUserSettings().getDialogCopyFileMode(); 275 retValue.append("<input type=\"radio\" name=\"copymode\" value=\""); 276 retValue.append(CmsResource.COPY_AS_SIBLING); 277 retValue.append("\""); 278 if (defaultMode == CmsResource.COPY_AS_SIBLING) { 279 retValue.append(checkedAttr); 280 } 281 retValue.append("> "); 282 retValue.append(key(Messages.GUI_CREATE_SIBLING_0)); 283 retValue.append("<br>\n"); 284 retValue.append("<input type=\"radio\" name=\"copymode\" value=\""); 285 retValue.append(CmsResource.COPY_AS_NEW); 286 retValue.append("\""); 287 if (defaultMode == CmsResource.COPY_AS_NEW) { 288 retValue.append(checkedAttr); 289 } 290 retValue.append("> "); 291 retValue.append(key(Messages.GUI_COPY_AS_NEW_0)); 292 retValue.append("<br>\n"); 293 } 294 295 return retValue.toString(); 296 } 297 298 303 public String getParamCopymode() { 304 305 return m_paramCopymode; 306 } 307 308 313 public String getParamKeeprights() { 314 315 return m_paramKeeprights; 316 } 317 318 323 public String getParamOverwrite() { 324 325 return m_paramOverwrite; 326 } 327 328 337 public String getParamTarget() { 338 339 return m_paramTarget; 340 } 341 342 347 public void setParamCopymode(String value) { 348 349 m_paramCopymode = value; 350 } 351 352 357 public void setParamKeeprights(String value) { 358 359 m_paramKeeprights = value; 360 } 361 362 367 public void setParamOverwrite(String paramOverwrite) { 368 369 m_paramOverwrite = paramOverwrite; 370 } 371 372 377 public void setParamTarget(String value) { 378 379 m_paramTarget = value; 380 } 381 382 385 protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { 386 387 fillParamValues(request); 389 390 if (! checkResourcePermissions(CmsPermissionSet.ACCESS_WRITE, false)) { 392 setParamAction(DIALOG_CANCEL); 394 } 395 396 setParamDialogtype(DIALOG_TYPE); 398 if (DIALOG_TYPE.equals(getParamAction())) { 400 setAction(ACTION_COPY); 401 } else if (DIALOG_CONFIRMED.equals(getParamAction())) { 402 setAction(ACTION_CONFIRMED); 403 } else if (DIALOG_WAIT.equals(getParamAction())) { 404 setAction(ACTION_WAIT); 405 } else if (DIALOG_CANCEL.equals(getParamAction())) { 406 setAction(ACTION_CANCEL); 407 } else { 408 setAction(ACTION_DEFAULT); 409 setDialogTitle(Messages.GUI_COPY_RESOURCE_1, Messages.GUI_COPY_MULTI_2); 411 } 412 } 413 414 420 protected boolean performDialogOperation() throws CmsException { 421 422 boolean isFolder = isOperationOnFolder(); 424 425 if ((isMultiOperation() || isFolder) && !DIALOG_WAIT.equals(getParamAction())) { 427 return false; 429 } 430 431 int copyMode = CmsResource.COPY_PRESERVE_SIBLING; 433 try { 434 copyMode = Integer.parseInt(getParamCopymode()); 435 } catch (Exception e) { 436 if (LOG.isInfoEnabled()) { 438 LOG.info(e.getLocalizedMessage()); 439 } 440 } 441 442 boolean overwrite = Boolean.valueOf(getParamOverwrite()).booleanValue(); 444 overwrite = ((isMultiOperation() && overwrite) || DIALOG_CONFIRMED.equals(getParamAction())); 445 446 String target = getParamTarget(); 448 if (target == null) { 449 target = ""; 450 } 451 452 boolean restoreSiteRoot = false; 453 try { 454 String sitePrefix = ""; 456 if (CmsSiteManager.getSiteRoot(target) != null) { 457 String siteRootFolder = getCms().getRequestContext().getSiteRoot(); 458 if (siteRootFolder.endsWith("/")) { 459 siteRootFolder = siteRootFolder.substring(0, siteRootFolder.length() - 1); 460 } 461 sitePrefix = siteRootFolder; 462 getCms().getRequestContext().saveSiteRoot(); 463 getCms().getRequestContext().setSiteRoot("/"); 464 restoreSiteRoot = true; 465 } 466 467 Iterator i = getResourceList().iterator(); 468 while (i.hasNext()) { 470 String resName = (String )i.next(); 471 try { 472 performSingleCopyOperation(resName, target, sitePrefix, copyMode, overwrite); 473 } catch (CmsException e) { 474 if (isMultiOperation()) { 475 addMultiOperationException(e); 477 } else { 478 throw e; 480 } 481 } 482 } 483 checkMultiOperationException(Messages.get(), Messages.ERR_COPY_MULTI_0); 485 } finally { 486 if (restoreSiteRoot) { 488 getCms().getRequestContext().restoreSiteRoot(); 489 } 490 } 491 return true; 492 } 493 494 504 protected void performSingleCopyOperation( 505 String source, 506 String target, 507 String sitePrefix, 508 int copyMode, 509 boolean overwrite) throws CmsException { 510 511 target = CmsLinkManager.getAbsoluteUri(target, CmsResource.getParentFolder(source)); 513 514 if (target.equals(source) || (isMultiOperation() && target.startsWith(source))) { 515 throw new CmsVfsException(Messages.get().container(Messages.ERR_COPY_ONTO_ITSELF_1, target)); 516 } 517 518 try { 519 CmsResource res = getCms().readResource(target, CmsResourceFilter.ALL); 520 if (res.isFolder()) { 521 if (! target.endsWith("/")) { 523 target += "/"; 524 } 525 target = target + CmsResource.getName(source); 526 } 527 } catch (CmsVfsResourceNotFoundException e) { 528 if (LOG.isInfoEnabled()) { 530 LOG.info(e.getLocalizedMessage()); 531 } 532 } 533 534 setParamTarget(target); 536 537 if (overwrite && getCms().existsResource(target)) { 539 checkLock(target); 540 getCms().deleteResource(target, CmsResource.DELETE_PRESERVE_SIBLINGS); 541 } 542 543 getCms().copyResource(sitePrefix + source, target, copyMode); 545 } 546 } 547 | Popular Tags |