docs: protected void performUpdate() {
  
          // Wrap a try-catch around everything, because an escaping exception would cancel the task from which this is called
          List<CmsWaitHandle> waitHandles = new ArrayList<>();
          try {
              ArrayList<Object> work = new ArrayList<>();
              m_workQueue.drainTo(work);
              Set<CmsUUID> updateIds = new HashSet<CmsUUID>();
  
              for (Object item : work) {
                  if (item instanceof CmsUUID) {
                      updateIds.add((CmsUUID)item);
                  } else if (item instanceof CmsWaitHandle) {
                      waitHandles.add((CmsWaitHandle)item);
                  }
              }
              CmsADEConfigCacheState oldState = m_state;
              if (!updateIds.isEmpty() || (oldState == null)) {
                  try {
                      // Although  the updates are performed in a scheduled task, it is still possible
                      // that the task is scheduled immediately after a configuration update event. So
                      // here we ensure that there is at least a small delay between the event and the
                      // actual update. This is required to prevent problems with other caches.
                      Thread.sleep(100);
                  } catch (InterruptedException e) {
                      // ignore
                  }
                  if (updateIds.contains(ID_UPDATE_ALL) || (oldState == null)) {
                      m_state = readCompleteConfiguration();
                  } else {
                      boolean updateModules = updateIds.remove(ID_UPDATE_MODULES);
                      boolean updateElementViews = updateIds.remove(ID_UPDATE_ELEMENT_VIEWS);
                      updateIds.remove(ID_UPDATE_FOLDERTYPES); // folder types are always updated when the update set is not empty, so at this point we don't care whether the id for folder type updates actually is in the update set
                      Map<CmsUUID, CmsADEConfigDataInternal> updateMap = Maps.newHashMap();
                      for (CmsUUID structureId : updateIds) {
                          CmsADEConfigDataInternal sitemapConfig = parseSitemapConfiguration(structureId);
                          // sitemapConfig may be null at this point
                          updateMap.put(structureId, sitemapConfig);
                      }
                      List<CmsADEConfigDataInternal> moduleConfigs = null;
                      if (updateModules) {
                          moduleConfigs = loadModuleConfiguration();
                      }
                      Map<CmsUUID, CmsElementView> elementViews = null;
                      if (updateElementViews) {
                          elementViews = loadElementViews();
                      }
                      m_state = oldState.createUpdatedCopy(updateMap, moduleConfigs, elementViews);
                  }
              }
  
          } catch (Exception e) {
              LOG.error("Could not perform configuration cache update: " + e.getMessage(), e);
          } finally {
              for (CmsWaitHandle handle : waitHandles) {
                  handle.release();
              }
          }
      }