docs: protected synchronized void initConfiguration(CmsParameterConfiguration configuration) throws CmsInitException {
  
          String serverInfo = configuration.getString("context.servlet.container", null);
  
          // output startup message to log file
          if (CmsLog.INIT.isInfoEnabled()) {
              CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_DOT_0));
              CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_DOT_0));
              CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_DOT_0));
              CmsLog.INIT.info(
                  ". "
                      + Messages.get().getBundle().key(
                          Messages.GUI_SHELL_VERSION_1,
                          OpenCms.getSystemInfo().getVersionNumber()));
              for (int i = 0; i < Messages.COPYRIGHT_BY_ALKACON.length; i++) {
                  CmsLog.INIT.info(". " + Messages.COPYRIGHT_BY_ALKACON[i]);
              }
              CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_LINE_0));
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(Messages.INIT_STARTUP_TIME_1, new Date(System.currentTimeMillis())));
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(
                      Messages.INIT_OPENCMS_VERSION_1,
                      OpenCms.getSystemInfo().getVersionNumber() + " [" + OpenCms.getSystemInfo().getVersionId() + "]"));
              if (serverInfo != null) {
                  CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_SERVLET_CONTAINER_1, serverInfo));
              }
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(Messages.INIT_WEBAPP_NAME_1, getSystemInfo().getWebApplicationName()));
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(Messages.INIT_SERVLET_PATH_1, getSystemInfo().getServletPath()));
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(Messages.INIT_OPENCMS_CONTEXT_1, getSystemInfo().getOpenCmsContext()));
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(Messages.INIT_WEBINF_PATH_1, getSystemInfo().getWebInfRfsPath()));
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(
                      Messages.INIT_PROPERTY_FILE_1,
                      getSystemInfo().getConfigurationFileRfsPath()));
  
              String logFileRfsPath = getSystemInfo().getLogFileRfsPath();
              CmsLog.INIT.info(
                  Messages.get().getBundle().key(
                      Messages.INIT_LOG_FILE_1,
                      logFileRfsPath != null ? logFileRfsPath : "Managed by log4j"));
          }
  
          String systemEncoding = null;
          try {
              systemEncoding = System.getProperty("file.encoding");
          } catch (SecurityException se) {
              // security manager is active, but we will try other options before giving up
              LOG.debug("Security manager preventing access to file.encoding system property.", se);
          }
          Security.addProvider(new CryptixCrypto());
          if (CmsLog.INIT.isInfoEnabled()) {
              CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_FILE_ENCODING_1, systemEncoding));
          }
  
          // read server ethernet address (MAC) and init UUID generator
          String ethernetAddress = configuration.getString("server.ethernet.address", CmsStringUtil.getEthernetAddress());
          if (CmsLog.INIT.isInfoEnabled()) {
              CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_ETHERNET_ADDRESS_1, ethernetAddress));
          }
          CmsUUID.init(ethernetAddress);
  
          // set the server name
          String serverName = configuration.getString("server.name", "OpenCmsServer");
          getSystemInfo().setServerName(serverName);
  
          // check the installed Java SDK
          try {
              if (CmsLog.INIT.isInfoEnabled()) {
                  String jdkinfo = System.getProperty("java.vm.name") + " ";
                  jdkinfo += System.getProperty("java.vm.version") + " ";
                  jdkinfo += System.getProperty("java.vm.info") + " ";
                  jdkinfo += System.getProperty("java.vm.vendor") + " ";
                  CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_JAVA_VM_1, jdkinfo));
                  String osinfo = System.getProperty("os.name") + " ";
                  osinfo += System.getProperty("os.version") + " ";
                  osinfo += System.getProperty("os.arch") + " ";
                  CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_OPERATING_SYSTEM_1, osinfo));
              }
          } catch (Exception e) {
              throw new CmsInitException(Messages.get().container(Messages.ERR_CRITICAL_INIT_PROP_0), e);
          }
  
          // create the configuration manager instance
          m_configurationManager = new CmsConfigurationManager(getSystemInfo().getConfigFolder());
          // store the configuration read from "opencms.properties" in the configuration manager
          m_configurationManager.setConfiguration(configuration);
  
          // now load the XML configuration
          try {
              m_configurationManager.loadXmlConfiguration();
          } catch (Exception e) {
              throw new CmsInitException(Messages.get().container(Messages.ERR_CRITICAL_INIT_XML_0), e);
          }
  
          // get the system configuration
          CmsSystemConfiguration systemConfiguration = (CmsSystemConfiguration)m_configurationManager.getConfiguration(
              CmsSystemConfiguration.class);
  
          if (systemConfiguration.useSaxImplSystemProperties()) {
              CmsXmlUtils.initSystemProperties();
          }
  
          // initialize the memory monitor
          CmsMemoryMonitorConfiguration memoryMonitorConfiguration = systemConfiguration.getCmsMemoryMonitorConfiguration();
          // initialize the memory monitor
          try {
              if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(memoryMonitorConfiguration.getClassName())) {
                  m_memoryMonitor = (CmsMemoryMonitor)Class.forName(
                      memoryMonitorConfiguration.getClassName()).newInstance();
              } else {
                  m_memoryMonitor = new CmsMemoryMonitor();
              }
          } catch (Exception e) {
              // we can not start without a valid memory monitor
              throw new CmsInitException(
                  Messages.get().container(
                      Messages.ERR_CRITICAL_INIT_MEMORY_MONITOR_1,
                      memoryMonitorConfiguration.getClassName()),
                  e);
          }
          m_memoryMonitor.initialize(systemConfiguration);
  
          // get the event manager from the configuration and initialize it with the events already registered
          CmsEventManager configuredEventManager = systemConfiguration.getEventManager();
          configuredEventManager.initialize(m_eventManager);
          m_eventManager = configuredEventManager;
  
          // check if the encoding setting is valid
          String setEncoding = systemConfiguration.getDefaultContentEncoding();
          String defaultEncoding = CmsEncoder.lookupEncoding(setEncoding, null);
          if (defaultEncoding == null) {
              // we can not start without a valid encoding setting
              throw new CmsInitException(Messages.get().container(Messages.ERR_CRITICAL_INIT_ENCODING_1, setEncoding));
          }
          if (CmsLog.INIT.isInfoEnabled()) {
              CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_OPENCMS_ENCODING_1, defaultEncoding));
          }
          getSystemInfo().setDefaultEncoding(defaultEncoding);
  
          // set version history information
          getSystemInfo().setVersionHistorySettings(
              systemConfiguration.isHistoryEnabled(),
              systemConfiguration.getHistoryVersions(),
              systemConfiguration.getHistoryVersionsAfterDeletion());
          // set mail configuration
          getSystemInfo().setMailSettings(systemConfiguration.getMailSettings());
          // set HTTP authentication settings
          getSystemInfo().setHttpAuthenticationSettings(systemConfiguration.getHttpAuthenticationSettings());
          getSystemInfo().setRestrictDetailContents(systemConfiguration.isRestrictDetailContents());
  
          // set content notification settings
          getSystemInfo().setNotificationTime(systemConfiguration.getNotificationTime());
          getSystemInfo().setNotificationProject(systemConfiguration.getNotificationProject());
          m_executor = new ScheduledThreadPoolExecutor(2);
          // set resource init classes
          m_resourceInitHandlers = systemConfiguration.getResourceInitHandlers();
          // register request handler classes
          Iterator<I_CmsRequestHandler> it = systemConfiguration.getRequestHandlers().iterator();
          while (it.hasNext()) {
              I_CmsRequestHandler handler = it.next();
              addRequestHandler(handler);
              if (CmsLog.INIT.isInfoEnabled()) {
                  CmsLog.INIT.info(
                      Messages.get().getBundle().key(
                          Messages.INIT_REQUEST_HANDLER_CLASS_1,
                          handler.getClass().getName()));
              }
          }
  
          // read the default user configuration
          m_defaultUsers = systemConfiguration.getCmsDefaultUsers();
  
          // get the site manager from the configuration
          CmsSitesConfiguration sitesConfiguration = (CmsSitesConfiguration)m_configurationManager.getConfiguration(
              CmsSitesConfiguration.class);
          m_siteManager = sitesConfiguration.getSiteManager();
  
          CmsSchedulerConfiguration schedulerConfiguration = (CmsSchedulerConfiguration)m_configurationManager.getConfiguration(
              CmsSchedulerConfiguration.class);
          // set the scheduler manager
          m_scheduleManager = schedulerConfiguration.getScheduleManager();
  
          CmsVariablesConfiguration variablesConfiguration = (CmsVariablesConfiguration)m_configurationManager.getConfiguration(
              CmsVariablesConfiguration.class);
  
          // get the VFS / resource configuration
          CmsVfsConfiguration vfsConfiguation = (CmsVfsConfiguration)m_configurationManager.getConfiguration(
              CmsVfsConfiguration.class);
          m_resourceManager = vfsConfiguation.getResourceManager();
          m_xmlContentTypeManager = vfsConfiguation.getXmlContentTypeManager();
          m_defaultFiles = vfsConfiguation.getDefaultFiles();
  
          // initialize translation engines
          m_resourceManager.setTranslators(
              vfsConfiguation.getFolderTranslator(),
              vfsConfiguation.getFileTranslator(),
              vfsConfiguation.getXsdTranslator());
  
          // try to initialize the flex cache
          CmsFlexCache flexCache = null;
          try {
              if (CmsLog.INIT.isInfoEnabled()) {
                  CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_FLEX_CACHE_STARTING_0));
              }
              // get the flex cache configuration from the SystemConfiguration
              CmsFlexCacheConfiguration flexCacheConfiguration = systemConfiguration.getCmsFlexCacheConfiguration();
              getSystemInfo().setDeviceSelector(flexCacheConfiguration.getDeviceSelector());
              // pass configuration to flex cache for initialization
              flexCache = new CmsFlexCache(flexCacheConfiguration);
              m_flexCache = flexCache;
              if (CmsLog.INIT.isInfoEnabled()) {
                  CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_FLEX_CACHE_FINISHED_0));
              }
          } catch (Exception e) {
              if (CmsLog.INIT.isWarnEnabled()) {
                  CmsLog.INIT.warn(Messages.get().getBundle().key(Messages.INIT_FLEX_CACHE_ERROR_1, e.getMessage()));
              }
          }
  
          if (flexCache != null) {
              // check all resource loaders if they require the Flex cache
              Iterator<I_CmsResourceLoader> i = m_resourceManager.getLoaders().iterator();
              while (i.hasNext()) {
                  Object o = i.next();
                  if (o instanceof I_CmsFlexCacheEnabledLoader) {
                      // this resource loader requires the Flex cache
                      ((I_CmsFlexCacheEnabledLoader)o).setFlexCache(flexCache);
                  }
              }
          }
  
          // get the import/export configuration
          CmsImportExportConfiguration importExportConfiguration = (CmsImportExportConfiguration)m_configurationManager.getConfiguration(
              CmsImportExportConfiguration.class);
          m_importExportManager = importExportConfiguration.getImportExportManager();
          m_staticExportManager = importExportConfiguration.getStaticExportManager();
          m_repositoryManager = importExportConfiguration.getRepositoryManager();
  
          // get the search configuration
          CmsSearchConfiguration searchConfiguration = (CmsSearchConfiguration)m_configurationManager.getConfiguration(
              CmsSearchConfiguration.class);
          m_searchManager = searchConfiguration.getSearchManager();
  
          // get the workplace configuration
          CmsWorkplaceConfiguration workplaceConfiguration = (CmsWorkplaceConfiguration)m_configurationManager.getConfiguration(
              CmsWorkplaceConfiguration.class);
          m_workplaceManager = workplaceConfiguration.getWorkplaceManager();
          // add the export points from the workplace
          addExportPoints(m_workplaceManager.getExportPoints());
          addExportPoints(m_staticExportManager.getExportPoints());
  
          // get the module configuration
          CmsModuleConfiguration moduleConfiguration = (CmsModuleConfiguration)m_configurationManager.getConfiguration(
              CmsModuleConfiguration.class);
          m_moduleManager = moduleConfiguration.getModuleManager();
  
          // get the password handler
          m_passwordHandler = systemConfiguration.getPasswordHandler();
  
          // get the validation handler
          m_validationHandler = systemConfiguration.getValidationHandler();
  
          // get the authorization handler
          m_authorizationHandler = systemConfiguration.getAuthorizationHandler();
  
          // get the login manager
          m_loginManager = systemConfiguration.getLoginManager();
          // set the login message
          try {
              m_loginManager.setLoginMessage(null, variablesConfiguration.getLoginMessage());
              m_loginManager.setBeforeLoginMessage(null, variablesConfiguration.getBeforeLoginMessage());
          } catch (CmsRoleViolationException e1) {
              CmsLog.INIT.error(e1.getLocalizedMessage(), e1);
          }
  
          // initialize the publish engine
          m_publishEngine = new CmsPublishEngine(systemConfiguration.getRuntimeInfoFactory());
  
          // Credentials resolver - needs to be set before the driver manager is initialized
          m_credentialsResolver = systemConfiguration.getCredentialsResolver();
  
          // init the OpenCms security manager
          m_securityManager = CmsSecurityManager.newInstance(
              m_configurationManager,
              systemConfiguration.getRuntimeInfoFactory(),
              m_publishEngine);
  
          // get the publish manager
          m_publishManager = systemConfiguration.getPublishManager();
  
          // get the subscription manager
          m_subscriptionManager = systemConfiguration.getSubscriptionManager();
  
          // initialize the role manager
          m_roleManager = new CmsRoleManager(m_securityManager);
  
          // initialize the organizational unit manager
          m_orgUnitManager = new CmsOrgUnitManager(m_securityManager);
  
          // initialize the Thread store
          m_threadStore = new CmsThreadStore(m_securityManager);
  
          // initialize the link manager
          m_linkManager = new CmsLinkManager(m_staticExportManager.getLinkSubstitutionHandler());
  
          m_aliasManager = new CmsAliasManager(m_securityManager);
  
          // store the runtime properties
          m_runtimeProperties.putAll(systemConfiguration.getRuntimeProperties());
  
          // initialize the session storage provider
          I_CmsSessionStorageProvider sessionStorageProvider = systemConfiguration.getSessionStorageProvider();
  
          // get an Admin cms context object with site root set to "/"
          CmsObject adminCms;
          try {
              adminCms = initCmsObject(null, null, getDefaultUsers().getUserAdmin(), (String)null, (String)null);
          } catch (CmsException e) {
              throw new CmsInitException(Messages.get().container(Messages.ERR_CRITICAL_INIT_ADMINCMS_0), e);
          }
  
          m_repositoryManager.initializeCms(adminCms);
          // now initialize the other managers
          try {
              if (flexCache != null) {
                  flexCache.initializeCms(initCmsObject(adminCms));
              }
  
              m_configurationManager.setAdminCms(adminCms);
  
              // initialize the scheduler
              m_scheduleManager.initialize(initCmsObject(adminCms));
  
              // initialize the locale manager
              m_localeManager = systemConfiguration.getLocaleManager();
              m_localeManager.initialize(initCmsObject(adminCms));
  
              // initialize the site manager
              m_siteManager.initialize(initCmsObject(adminCms));
  
              // initialize the static export manager
              m_staticExportManager.initialize(initCmsObject(adminCms));
  
              // initialize the XML content type manager
              m_xmlContentTypeManager.initialize(initCmsObject(adminCms));
  
              m_orgUnitManager.initialize(initCmsObject(adminCms));
  
              // initialize the module manager
              m_moduleManager.initialize(initCmsObject(adminCms), m_configurationManager);
  
              // initialize the resource manager
              m_resourceManager.initialize(initCmsObject(adminCms));
  
              // initialize the publish manager
              m_publishManager.setPublishEngine(m_publishEngine);
              m_publishManager.setSecurityManager(m_securityManager);
              m_publishManager.setPublishListRemoveMode(systemConfiguration.getPublishListRemoveMode());
              m_publishManager.initialize(initCmsObject(adminCms));
  
              // initialize the search manager
              m_searchManager.initialize(initCmsObject(adminCms));
  
              // initialize the VFS bundle manager
              m_vfsBundleManager = new CmsVfsBundleManager(adminCms);
  
              // initialize the workplace manager
              m_workplaceManager.initialize(initCmsObject(adminCms));
  
              // initialize the session manager
              m_sessionManager.initialize(sessionStorageProvider);
              m_sessionManager.setUserSessionMode(systemConfiguration.getUserSessionMode(true));
  
              // initialize the subscription manager
              m_subscriptionManager.setSecurityManager(m_securityManager);
              m_subscriptionManager.initialize(adminCms);
  
              CmsUgcSessionFactory.setAdminCms(adminCms);
  
              // initialize the formatter configuration
              CmsFormatterConfiguration.initialize(adminCms);
              CmsPersistentLoginTokenHandler.setAdminCms(initCmsObject(adminCms));
              CmsLoginUI.setAdminCmsObject(initCmsObject(adminCms));
  
              // initialize ade manager
              m_adeManager = new CmsADEManager(initCmsObject(adminCms), m_memoryMonitor, systemConfiguration);
              m_workplaceAppManager = new CmsWorkplaceAppManager(initCmsObject(adminCms));
              m_workplaceAppManager.loadApps();
              m_workplaceAppManager.initWorkplaceCssUris(m_moduleManager);
  
              m_templateContextManager = new CmsTemplateContextManager(initCmsObject(adminCms));
              m_workflowManager = systemConfiguration.getWorkflowManager();
              m_letsEncryptConfig = systemConfiguration.getLetsEncryptConfig();
              if (m_workflowManager == null) {
                  m_workflowManager = new CmsDefaultWorkflowManager();
                  m_workflowManager.setParameters(new HashMap<String, String>());
              }
              m_workflowManager.initialize(adminCms);
  
              m_remoteShellServer = CmsRemoteShellServer.initialize(systemConfiguration);
  
          } catch (CmsException e) {
              throw new CmsInitException(Messages.get().container(Messages.ERR_CRITICAL_INIT_MANAGERS_0), e);
          }
  
          try {
              // mitigate potential stringtemplate 3 class loading deadlock by making sure the class is loaded on startup
              @SuppressWarnings("unused")
              StringTemplate stringTemplate = new org.antlr.stringtemplate.StringTemplate();
          } catch (Exception e) {
              CmsLog.INIT.error("Problem with initializing stringtemplate class: " + e.getLocalizedMessage(), e);
          }
  
          try {
              getEventManager().fireEvent(I_CmsEventListener.EVENT_CLEAR_CACHES);
          } catch (Exception e) {
              CmsLog.INIT.error("Problem with clearing caches after initialization: " + e.getLocalizedMessage(), e);
          }
      }