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);
}
}