docs: protected void moveResource(CmsDbContext dbc, CmsResource source, String destination) throws CmsException {
  
          List<CmsResource> resources = null;
  
          if (source.isFolder()) {
              if (!CmsResource.isFolder(destination)) {
                  // ensure folder name end's with a /
                  destination = destination.concat("/");
              }
              // collect all resources in the folder without checking permissions
              resources = m_driverManager.readChildResources(dbc, source, CmsResourceFilter.ALL, true, true, false);
          }
  
          // target permissions will be checked later
          m_driverManager.moveResource(dbc, source, destination, false);
  
          // make sure lock is set
          CmsResource destinationResource = m_driverManager.readResource(dbc, destination, CmsResourceFilter.ALL);
          try {
              // the destination must always get a new lock
              m_driverManager.lockResource(dbc, destinationResource, CmsLockType.EXCLUSIVE);
          } catch (Exception e) {
              // could happen with with shared locks on single files
              if (LOG.isWarnEnabled()) {
                  LOG.warn(e);
              }
          }
  
          if (resources != null) {
              // now walk through all sub-resources in the folder
              for (int i = 0; i < resources.size(); i++) {
                  CmsResource childResource = resources.get(i);
                  String childDestination = destination.concat(childResource.getName());
                  // recurse with child resource
                  moveResource(dbc, childResource, childDestination);
              }
          }
          CmsProject currentProject = dbc.getRequestContext().getCurrentProject();
          if (!currentProject.isOnlineProject()) {
              List<CmsResource> movedResources = m_driverManager.readChildResources(
                  dbc,
                  destinationResource,
                  CmsResourceFilter.ALL,
                  true,
                  true,
                  false);
              movedResources.add(destinationResource);
              for (CmsResource res : movedResources) {
                  m_driverManager.repairCategories(dbc, dbc.getRequestContext().getCurrentProject().getUuid(), res);
              }
          }
      }