docs: public void initialize(CmsObject cms) {
  
          if (CmsLog.INIT.isInfoEnabled()) {
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(
                      Messages.INIT_NUM_SITE_ROOTS_CONFIGURED_1,
                      new Integer((m_siteMatcherSites.size() + ((m_defaultUri != null) ? 1 : 0)))));
          }
  
          try {
  
              m_clone = OpenCms.initCmsObject(cms);
              m_clone.getRequestContext().setSiteRoot("");
              m_clone.getRequestContext().setCurrentProject(m_clone.readProject(CmsProject.ONLINE_PROJECT_NAME));
  
              CmsObject cms_offline = OpenCms.initCmsObject(m_clone);
              CmsProject tempProject = cms_offline.createProject(
                  "tempProjectSites",
                  "",
                  "/Users",
                  "/Users",
                  CmsProject.PROJECT_TYPE_TEMPORARY);
              cms_offline.getRequestContext().setCurrentProject(tempProject);
  
              m_siteUUIDs = new HashMap<CmsUUID, CmsSite>();
              // check the presence of sites in VFS
  
              m_onlyOfflineSites = new ArrayList<CmsSite>();
  
              for (CmsSite site : m_siteMatcherSites.values()) {
                  checkUUIDOfSiteRoot(site, m_clone, cms_offline);
                  try {
                      CmsResource siteRes = m_clone.readResource(site.getSiteRoot());
                      site.setSiteRootUUID(siteRes.getStructureId());
  
                      m_siteUUIDs.put(siteRes.getStructureId(), site);
                      // during server startup the digester can not access properties, so set the title afterwards
                      if (CmsStringUtil.isEmptyOrWhitespaceOnly(site.getTitle())) {
                          String title = m_clone.readPropertyObject(
                              siteRes,
                              CmsPropertyDefinition.PROPERTY_TITLE,
                              false).getValue();
                          if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(title)) {
                              site.setTitle(title);
                          }
                      }
                  } catch (Throwable t) {
                      if (CmsLog.INIT.isWarnEnabled()) {
                          CmsLog.INIT.warn(Messages.get().getBundle().key(Messages.INIT_NO_ROOT_FOLDER_1, site));
                      }
                  }
              }
              cms_offline.deleteProject(tempProject.getUuid());
  
              // check the presence of the default site in VFS
              if (CmsStringUtil.isEmptyOrWhitespaceOnly(m_defaultUri)) {
                  m_defaultSite = null;
              } else {
                  m_defaultSite = new CmsSite(m_defaultUri, CmsSiteMatcher.DEFAULT_MATCHER);
                  try {
                      m_clone.readResource(m_defaultSite.getSiteRoot());
                  } catch (Throwable t) {
                      if (CmsLog.INIT.isWarnEnabled()) {
                          CmsLog.INIT.warn(
                              Messages.get().getBundle().key(Messages.INIT_NO_ROOT_FOLDER_DEFAULT_SITE_1, m_defaultSite));
                      }
                  }
              }
              if (m_defaultSite == null) {
                  m_defaultSite = new CmsSite("/", CmsSiteMatcher.DEFAULT_MATCHER);
              }
              if (CmsLog.INIT.isInfoEnabled()) {
                  if (m_defaultSite != null) {
                      CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_DEFAULT_SITE_ROOT_1, m_defaultSite));
                  } else {
                      CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_DEFAULT_SITE_ROOT_0));
                  }
              }
              initWorkplaceMatchers();
  
              // set site lists to unmodifiable
              setSiteMatcherSites(m_siteMatcherSites);
  
              // store additional site roots to optimize lookups later
              for (String root : m_siteRootSites.keySet()) {
                  if (!root.startsWith(SITES_FOLDER) || (root.split("/").length >= 4)) {
                      m_additionalSiteRoots.add(root);
                  }
              }
  
              if (m_sharedFolder == null) {
                  m_sharedFolder = DEFAULT_SHARED_FOLDER;
              }
  
              // initialization is done, set the frozen flag to true
              m_frozen = true;
          } catch (CmsException e) {
              LOG.warn(e);
          }
          if (!m_isListenerSet) {
              OpenCms.addCmsEventListener(this, new int[] {I_CmsEventListener.EVENT_PUBLISH_PROJECT});
              m_isListenerSet = true;
          }
      }