private static void checkJmxScript()

in dmServer/src/main/java/com/intellij/dmserver/run/DMServerStartupPolicy.java [126:258]


  private static void checkJmxScript(final File script, String jmxPortEnvVar) throws RuntimeConfigurationError {
    try {
      String scriptContent = FileUtil.loadFile(script);
      final List<String> scriptLines = StringUtil.split(scriptContent, "\n", true, false);

      final List<String> fixedLines = new ArrayList<>();

      boolean hasWrongArgs = false;

      Set<String> requiredArgs = new LinkedHashSet<>();
      requiredArgs.add("-Dcom.sun.management.jmxremote=");
      requiredArgs.add("-Dcom.sun.management.jmxremote.port=" + getEnvVarRef(jmxPortEnvVar));
      requiredArgs.add("-Dcom.sun.management.jmxremote.ssl=false");
      requiredArgs.add("-Dcom.sun.management.jmxremote.authenticate=false");

      final String comment = isWindows ? "rem" : "#";

      final String jmxOptsRef = getEnvVarRef(JMX_OPTS_ENV_VAR);
      final String jmxOptsSet = JMX_OPTS_ENV_VAR + "=";

      Iterator<String> itLine = scriptLines.iterator();

      int insertLineIndex = 0;
      int lineIndex = 0;

      while (itLine.hasNext()) {
        lineIndex++;
        String line = itLine.next();
        String trimmedLine = line.trim();

        boolean setCandidate = true;
        if (isWindows) {
          if (StringUtil.startsWithIgnoreCase(trimmedLine, BAT_SET)) {
            trimmedLine = trimmedLine.substring(BAT_SET.length()).trim();
          }
          else {
            setCandidate = false;
          }
        }

        if (setCandidate && trimmedLine.startsWith(jmxOptsSet)) {
          List<String> partLines = new ArrayList<>();
          partLines.add(line);

          trimmedLine = StringUtil.trimStart(trimmedLine, jmxOptsSet).trim();

          String part;
          if (isWindows) {
            part = trimmedLine;
          }
          else {
            StringBuilder concatenatedLine = new StringBuilder();
            while (trimmedLine.endsWith(SH_LINE_CONCAT)) {
              concatenatedLine.append(StringUtil.trimEnd(trimmedLine, SH_LINE_CONCAT));
              lineIndex++;
              line = itLine.next();
              trimmedLine = line.trim();
              partLines.add(line);
            }
            concatenatedLine.append(trimmedLine);
            part = concatenatedLine.toString();

            if (part.startsWith(SH_QUOTE)) {
              part = StringUtil.trimEnd(StringUtil.trimStart(part, SH_QUOTE), SH_QUOTE).trim();
            }
          }

          if (insertLineIndex == 0) {
            insertLineIndex = lineIndex;
          }

          part = StringUtil.trimStart(part, jmxOptsRef).trim();
          String[] args = part.split("\\s+");
          List<String> partRequiredArgs = new ArrayList<>();
          boolean partHasWrongArgs = false;
          for (String arg : args) {
            if (requiredArgs.contains(arg)) {
              partRequiredArgs.add(arg);
            }
            else {
              partHasWrongArgs = true;
              hasWrongArgs = true;
            }
          }

          for (String partLine : partLines) {
            if (partHasWrongArgs) {
              fixedLines.add(comment + " " + partLine);
            }
            else {
              fixedLines.add(partLine);
            }
          }

          if (!partHasWrongArgs) {
            requiredArgs.removeAll(partRequiredArgs);
          }
        }
        else {
          fixedLines.add(line);
        }
      }

      if (!requiredArgs.isEmpty()) {
        for (String requiredArg : requiredArgs) {
          String value = jmxOptsRef + " " + requiredArg;
          if (!isWindows) {
            value = SH_QUOTE + value + SH_QUOTE;
          }
          String line = jmxOptsSet + value;
          if (isWindows) {
            line = BAT_SET + " " + line;
          }
          fixedLines.add(insertLineIndex, line);
        }
      }

      if (hasWrongArgs || !requiredArgs.isEmpty()) {
        throw new RuntimeConfigurationError(DmServerBundle.message("DMServerStartupPolicy.jmx.arguments.are.incompatible"), () -> {
          try {
            final String fixedScriptContent = StringUtil.join(ArrayUtilRt.toStringArray(fixedLines), "\n");
            FileUtil.writeToFile(script, fixedScriptContent.getBytes(Charset.defaultCharset()));
          }
          catch (IOException e) {
            LOG.warn(e);
          }
        });
      }
    }
    catch (IOException e) {
      LOG.debug(e);
    }
  }