code: public Map<String, CmsModule> getAvailableModules() {
  
          if ((m_availableModules == null) || m_availableModules.isEmpty()) {
              m_availableModules = new HashMap<String, CmsModule>();
              m_moduleDependencies = new HashMap<String, List<String>>();
              m_moduleFilenames = new HashMap<String, String>();
              m_components = new CmsIdentifiableObjectContainer<CmsSetupComponent>(true, true);
  
              try {
                  addComponentsFromPath(m_webAppRfsPath + FOLDER_SETUP);
                  Map<CmsModule, String> modules = CmsModuleManager.getAllModulesFromPath(getModuleFolder());
                  Iterator<Map.Entry<CmsModule, String>> itMods = modules.entrySet().iterator();
                  while (itMods.hasNext()) {
                      Map.Entry<CmsModule, String> entry = itMods.next();
                      CmsModule module = entry.getKey();
                      // put the module information into a map keyed by the module packages names
                      m_availableModules.put(module.getName(), module);
                      m_moduleFilenames.put(module.getName(), entry.getValue());
                      addComponentsFromPath(getModuleFolder() + entry.getValue());
                  }
              } catch (CmsConfigurationException e) {
                  throw new CmsRuntimeException(e.getMessageContainer());
              }
              initializeComponents(new HashSet<String>(m_availableModules.keySet()));
          }
          return m_availableModules;
      }
docs: Returns a map with all available modules.<p>
  
  The map contains maps keyed by module package names. Each of these maps contains various
  information about the module such as the module name, version, description, and a list of
  it's dependencies. You should refer to the source code of this method to understand the data
  structure of the map returned by this method!<p>
  
  @return a map with all available modules