docs: public void execute() throws Exception {
          // Read the properties file, if it exists.
          properties = new Properties();
          if (propertiesFile != null) {
              FileInputStream propertiesStream = null;
              try {
                  propertiesStream = new FileInputStream(propertiesFile);
                  properties.load(propertiesStream);
              } catch (final Exception e) {
                  throw new RuntimeException(e);
              } finally {
                  if (propertiesStream != null) {
                      try {
                          propertiesStream.close();
                      } catch (final IOException e) {
                          logger.error(e.getMessage(), e) ;
                      }
                  }
              }
          } else {
              properties.putAll(Configuration.configuration);
          }
          if (!properties.containsKey(CONF_PLUGIN_DIRS)) {
              properties.setProperty(CONF_PLUGIN_DIRS, configuration.getOrDefault(CONF_PLUGIN_DIRS, "plugins;demo"));
          }
          if (!properties.containsKey(CONF_PLUGIN_IGNORES)) {
              properties.setProperty(CONF_PLUGIN_IGNORES, configuration.getOrDefault(CONF_PLUGIN_IGNORES, ""));
          }
  
          // Get the list of plugin directories from the properties.
          final String[] pluginDirs = properties.getProperty(CONF_PLUGIN_DIRS).split(PARAM_VALUE_SEPARATOR);
  
          final Set<String> pluginIgnores = new HashSet<>();
          if (properties.getProperty(CONF_PLUGIN_IGNORES) != null) {
              pluginIgnores.addAll(Arrays.asList(properties.getProperty(CONF_PLUGIN_IGNORES).split(PARAM_VALUE_SEPARATOR)));
          }
  
          final String pluginOrderProperty = properties.getProperty(CONF_PLUGIN_ORDER);
          if (pluginOrderProperty != null) {
              final List<String> plugins = asList(pluginOrderProperty.trim().split("\\s+"));
              Collections.reverse(plugins);
              int priority = 1;
              for (final String plugin: plugins) {
                  pluginOrder.put(plugin, priority++);
              }
          }
  
          for (final String tmpl : properties.getProperty(CONF_TEMPLATES, "").split(PARAM_VALUE_SEPARATOR)) {
              final String t = tmpl.trim();
              if (t.length() != 0) {
                  logger.warn(MessageUtils.getMessage("DOTJ080W", "templates", "template").toString());
                  templateSet.put(t, null);
              }
          }
  
          for (final String pluginDir2 : pluginDirs) {
              File pluginDir = new File(pluginDir2);
              if (!pluginDir.isAbsolute()) {
                  pluginDir = new File(ditaDir, pluginDir.getPath());
              }
              final File[] pluginFiles = pluginDir.listFiles();
  
              for (int i = 0; (pluginFiles != null) && (i < pluginFiles.length); i++) {
                  final File f = pluginFiles[i];
                  final File descFile = new File(pluginFiles[i], "plugin.xml");
                  if (pluginFiles[i].isDirectory() && !pluginIgnores.contains(f.getName()) && descFile.exists()) {
                      descSet.add(descFile);
                  }
              }
          }
  
          mergePlugins();
          integrate();
          logChanges(pluginList, getPluginIds(pluginsDoc));
      }