docs: public void addDynamicServlet(String servletName, String servletClass, String mappingURI, Properties initParameters) throws ServletException,
              SecurityException {
  
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINE)) {
              logger.entering(CLASS_NAME, "addDyanamicServlet");
              logger.logp(Level.FINE, CLASS_NAME, "addDynamicServlet", " servletName[" + servletName + "] servletClass [" + servletClass
                      + "] mappingURI [" + mappingURI + "]");
          }
  
          SecurityManager sm = System.getSecurityManager();
          if (sm != null) {
              sm.checkPermission(perm);
          }
          // make sure the servlet doesn't already exist
          IServletConfig sconfig = config.getServletInfo(servletName);
  
          if (sconfig == null) {
              // Adding a brand new servlet to the container
              if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINE)) {
                  logger.logp(Level.FINE, CLASS_NAME, "addDynamicServlet",
                          "Servlet not found in the web application configuration. Creating new config.");
              }
              sconfig = this.webExtensionProcessor.createConfig("DYN_" + servletName + "_" + System.currentTimeMillis()); // PK63920
              sconfig.setServletName(servletName);
              sconfig.setDisplayName(servletName);
              sconfig.setDescription("dynamic servlet " + servletName);
              sconfig.setClassName(servletClass);
              sconfig.setStartUpWeight(new Integer(1));
              sconfig.setServletContext(getFacade());
  
              // check the parameters
              if (initParameters == null) {
                  initParameters = new Properties();
              } else
                  sconfig.setInitParams(initParameters);
  
              // add to the config
              config.addServletInfo(servletName, sconfig);
          }
  
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINE)) {
              logger.logp(Level.FINE, CLASS_NAME, "addDynamicServlet", " added servletMapping to config for [" + servletName + "] sconfig [" + sconfig
                      + "]");
          }
  
          IServletWrapper s = null;
          try {
              s = getServletWrapper(servletName);
          } catch (Exception e) {
              com.ibm.wsspi.webcontainer.util.FFDCWrapper.processException(e, CLASS_NAME + ".addDynamicServlet", "3084", this);
              // pk435011
              logger.logp(Level.SEVERE, CLASS_NAME, "addDynamicServlet", "exception.occured.while.creating.wrapper.for.servlet", new Object[] {
                      servletName, e }); /* 283348.1 */
              throw new ServletException(e);
          }
  
          if (s == null) {
              // pk435011
              logger.logp(Level.SEVERE, CLASS_NAME, "addDynamicServlet", "could.not.create.wrapper.for.servlet", servletName);
              throw new ServletException("Could not create wrapper for the dynamic servlet " + servletName);
          }
  
          try {
              sconfig.setServletWrapper(s);
              sconfig.addMapping(ServletConfig.CheckContextInitialized.FALSE, mappingURI);
              config.addServletMapping(servletName, mappingURI);
          } catch (Exception e) {
              com.ibm.wsspi.webcontainer.util.FFDCWrapper.processException(e, CLASS_NAME + ".addDynamicServlet", "3095", this);
              // pk435011
              logger
                      .logp(Level.SEVERE, CLASS_NAME, "addDynamicServlet", "mapping.already.exists",
                              new Object[] { mappingURI, getApplicationName(), e }); /* 283348.1 */
              throw new ServletException(e);
          }
          if (com.ibm.ejs.ras.TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINE))
              logger.exiting(CLASS_NAME, "addDyanamicServlet");
      }