docs: public void copyResource(
          CmsRequestContext context,
          CmsResource source,
          String destination,
          CmsResource.CmsResourceCopyMode siblingMode)
      throws CmsException, CmsSecurityException {
  
          CmsDbContext dbc = m_dbContextFactory.getDbContext(context);
          try {
              checkOfflineProject(dbc);
              checkPermissions(dbc, source, CmsPermissionSet.ACCESS_READ, true, CmsResourceFilter.ALL);
              if (source.isFolder() && destination.startsWith(source.getRootPath())) {
                  throw new CmsVfsException(
                      Messages.get().container(
                          Messages.ERR_RECURSIVE_INCLUSION_2,
                          dbc.removeSiteRoot(source.getRootPath()),
                          dbc.removeSiteRoot(destination)));
              }
              // target permissions will be checked later
              m_driverManager.copyResource(dbc, source, destination, siblingMode);
          } catch (Exception e) {
              dbc.report(
                  null,
                  Messages.get().container(
                      Messages.ERR_COPY_RESOURCE_2,
                      dbc.removeSiteRoot(source.getRootPath()),
                      dbc.removeSiteRoot(destination)),
                  e);
          } finally {
              dbc.clear();
          }
      }