docs: public void actionCopy() throws JspException {
  
          // save initialized instance of this class in request attribute for included sub-elements
          getJsp().getRequest().setAttribute(SESSION_WORKPLACE_CLASS, this);
          CmsResource resource = null;
          try {
              boolean isFolder = false;
              String source = getResourceList().get(0);
              String target = CmsLinkManager.getAbsoluteUri(getParamTarget(), CmsResource.getParentFolder(source));
              if (!isMultiOperation()) {
                  resource = getCms().readResource(source, CmsResourceFilter.ALL);
                  isFolder = resource.isFolder();
              } else {
                  String siteRootFolder = null;
                  try {
                      // check if a site root was added to the target name
                      if (OpenCms.getSiteManager().getSiteRoot(target) != null) {
                          siteRootFolder = getCms().getRequestContext().getSiteRoot();
                          if (siteRootFolder.endsWith("/")) {
                              siteRootFolder = siteRootFolder.substring(0, siteRootFolder.length() - 1);
                          }
                          getCms().getRequestContext().setSiteRoot("/");
                      }
                      resource = getCms().readResource(target, CmsResourceFilter.ALL);
                  } finally {
                      if (siteRootFolder != null) {
                          getCms().getRequestContext().setSiteRoot(siteRootFolder);
                      }
                  }
                  if (!resource.isFolder()) {
                      // no folder selected for multi operation, throw exception
                      throw new CmsVfsException(
                          Messages.get().container(Messages.ERR_COPY_MULTI_TARGET_NOFOLDER_1, target));
                  }
              }
              if (performDialogOperation()) {
                  // if no exception is caused and "true" is returned copy operation was successful
                  if (isMultiOperation() || isFolder) {
                      // set request attribute to reload the explorer tree view
                      List<String> folderList = new ArrayList<String>(1);
                      String targetParent = CmsResource.getParentFolder(target);
                      folderList.add(targetParent);
                      getJsp().getRequest().setAttribute(REQUEST_ATTRIBUTE_RELOADTREE, folderList);
                  }
                  actionCloseDialog();
              } else {
                  // "false" returned, display "please wait" screen
                  getJsp().include(FILE_DIALOG_SCREEN_WAIT);
              }
          } catch (Throwable e) {
              // check if this exception requires a confirmation or error screen for single resource operations
              if (!isMultiOperation()
                  && ((e instanceof CmsVfsResourceAlreadyExistsException) || (e instanceof CmsLockException))
                  && (resource != null)
                  && !(resource.isFolder())) {
                  // file copy but file already exists, now check target file type
                  int targetType = -1;
                  String storedSiteRoot = null;
                  try {
                      if (OpenCms.getSiteManager().getSiteRoot(getParamTarget()) != null) {
                          storedSiteRoot = getCms().getRequestContext().getSiteRoot();
                          getCms().getRequestContext().setSiteRoot("/");
                      }
                      CmsResource targetRes = getCms().readResource(getParamTarget());
                      targetType = targetRes.getTypeId();
                  } catch (CmsException e2) {
                      // can usually be ignored
                      if (LOG.isInfoEnabled()) {
                          LOG.info(e2.getLocalizedMessage());
                      }
                  } finally {
                      if (storedSiteRoot != null) {
                          getCms().getRequestContext().setSiteRoot(storedSiteRoot);
                      }
                  }
                  if (resource.getTypeId() == targetType) {
                      // file type of target is the same as source, show confirmation dialog
                      setParamMessage(
                          CmsStringUtil.escapeHtml(key(
                              Messages.GUI_COPY_CONFIRM_OVERWRITE_2,
                              new Object[] {getParamResource(), getParamTarget()})));
                      getJsp().include(FILE_DIALOG_SCREEN_CONFIRM);
                  } else {
                      // file type is different, create error message
                      includeErrorpage(this, e);
                  }
              } else {
                  // error during copy, show error dialog
                  includeErrorpage(this, e);
              }
          }
      }