code: public void updateModulesFromUpdateBean() throws Exception {
  
          // read here how the list of modules to be installed is passed from the setup bean to the
          // setup thread, and finally to the shell process that executes the setup script:
          // 1) the list with the package names of the modules to be installed is saved by setInstallModules
          // 2) the setup thread gets initialized in a JSP of the setup wizard
          // 3) the instance of the setup bean is passed to the setup thread by setAdditionalShellCommand
          // 4) the setup bean is passed to the shell by startSetup
          // 5) because the setup bean implements I_CmsShellCommands, the shell constructor can pass the shell's CmsObject back to the setup bean
          // 6) thus, the setup bean can do things with the Cms
  
          if (m_cms != null) {
  
              I_CmsReport report = new CmsShellReport(m_cms.getRequestContext().getLocale());
  
              // remove obsolete modules in any case
              for (String moduleToRemove : getModulesToDelete()) {
                  removeModule(moduleToRemove, report);
              }
  
              // check if there are any modules to install
              if (m_installModules != null) {
                  Set<String> utdModules = new HashSet<String>(getUptodateModules());
                  List<String> installList = Lists.newArrayList(m_installModules);
                  for (String name : installList) {
                      if (!utdModules.contains(name)) {
                          String filename = m_moduleFilenames.get(name);
                          try {
                              updateModule(name, filename, report);
                          } catch (Exception e) {
                              // log a exception during module import, but make sure the next module is still imported
                              e.printStackTrace(System.err);
                          }
                      } else {
                          report.println(
                              Messages.get().container(Messages.RPT_MODULE_UPTODATE_1, name),
                              I_CmsReport.FORMAT_HEADLINE);
                      }
                  }
              }
          }
      }
docs: Installed all modules that have been set using {@link #setInstallModules(String)}.<p>
  
  This method is invoked as a shell command.<p>
  
  @throws Exception if something goes wrong