Bug 575210 - [17-18] JEP 411-393: Deprecate the Security Manager for
Removal

Change-Id: I5e70d322f6827209714e92caf5fdbba1c63a81b3
Reviewed-on: https://git.eclipse.org/r/c/pde/eclipse.pde.ui/+/190770
Tested-by: PDE Bot <pde-bot@eclipse.org>
Tested-by: Vikas Chandra <Vikas.Chandra@in.ibm.com>
Reviewed-by: Vikas Chandra <Vikas.Chandra@in.ibm.com>
diff --git a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/AbstractPDELaunchConfiguration.java b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/AbstractPDELaunchConfiguration.java
index 32579fd..ec57649 100644
--- a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/AbstractPDELaunchConfiguration.java
+++ b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/AbstractPDELaunchConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- *  Copyright (c) 2005, 2018, 2020 IBM Corporation and others.
+ *  Copyright (c) 2005, 2018, 2022 IBM Corporation and others.
  *
  *  This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License 2.0
@@ -22,6 +22,7 @@
 import org.eclipse.debug.core.*;
 import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
 import org.eclipse.jdt.core.IJavaModelMarker;
+import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.launching.*;
 import org.eclipse.pde.core.plugin.TargetPlatform;
 import org.eclipse.pde.internal.core.ICoreConstants;
@@ -82,7 +83,7 @@
 			VMRunnerConfiguration runnerConfig = new VMRunnerConfiguration(getMainClass(), getClasspath(configuration));
 			IVMInstall launcher = VMHelper.createLauncher(configuration);
 			boolean isModular = JavaRuntime.isModularJava(launcher);
-			runnerConfig.setVMArguments(updateVMArgumentWithAddModuleSystem(getVMArguments(configuration), isModular));
+			runnerConfig.setVMArguments(updateVMArgumentWithAdditionalArguments(getVMArguments(configuration), isModular, configuration));
 			runnerConfig.setProgramArguments(getProgramArguments(configuration));
 			runnerConfig.setWorkingDirectory(getWorkingDirectory(configuration).getAbsolutePath());
 			runnerConfig.setEnvironment(getEnvironment(configuration));
@@ -122,7 +123,7 @@
 			VMRunnerConfiguration runnerConfig = new VMRunnerConfiguration(getMainClass(), getClasspath(configuration));
 			IVMInstall launcher = VMHelper.createLauncher(configuration);
 			boolean isModular = JavaRuntime.isModularJava(launcher);
-			runnerConfig.setVMArguments(updateVMArgumentWithAddModuleSystem(getVMArguments(configuration), isModular));
+			runnerConfig.setVMArguments(updateVMArgumentWithAdditionalArguments(getVMArguments(configuration), isModular, configuration));
 			runnerConfig.setProgramArguments(getProgramArguments(configuration));
 			runnerConfig.setWorkingDirectory(getWorkingDirectory(configuration).getAbsolutePath());
 			runnerConfig.setEnvironment(getEnvironment(configuration));
@@ -143,11 +144,40 @@
 		}
 	}
 
-	private String[] updateVMArgumentWithAddModuleSystem(String[] args, boolean isModular) {
+	private String[] updateVMArgumentWithAdditionalArguments(String[] args, boolean isModular, ILaunchConfiguration configuration) {
 		String modAllSystem= "--add-modules=ALL-SYSTEM"; //$NON-NLS-1$
-		if (isModular && !argumentContainsModuleSystem(args, modAllSystem)) {
-			args = Arrays.copyOf(args, args.length + 1);
-			args[args.length - 1] = modAllSystem;
+		String allowSecurityManager = "-Djava.security.manager=allow"; //$NON-NLS-1$
+		boolean addModuleSystem = false;
+		boolean addAllowSecurityManager = false;
+		int argLength = args.length;
+		if (isModular && !argumentContainsAttribute(args, modAllSystem)) {
+			addModuleSystem = true;
+			argLength++; // Need to add the argument
+		}
+		IVMInstall vmInstall;
+		try {
+			vmInstall = VMHelper.getVMInstall(configuration);
+			if (vmInstall instanceof AbstractVMInstall) {
+				AbstractVMInstall install = (AbstractVMInstall) vmInstall;
+				String vmver = install.getJavaVersion();
+				if (vmver != null && JavaCore.compareJavaVersions(vmver, JavaCore.VERSION_17) >= 0) {
+					if (!argumentContainsAttribute(args, allowSecurityManager)) {
+						addAllowSecurityManager = true;
+						argLength++; // Need to add the argument
+					}
+				}
+			}
+		} catch (CoreException e) {
+			PDELaunchingPlugin.log(e);
+		}
+		if (addModuleSystem || addAllowSecurityManager) {
+			args = Arrays.copyOf(args, argLength);
+			if (addAllowSecurityManager) {
+				args[--argLength] = allowSecurityManager;
+			}
+			if (addModuleSystem) {
+				args[--argLength] = modAllSystem;
+			}
 		}
 		if (!isModular) {
 			ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(args));
@@ -158,7 +188,7 @@
 		return args;
 	}
 
-	private boolean argumentContainsModuleSystem(String[] args, String modAllSystem) {
+	private boolean argumentContainsAttribute(String[] args, String modAllSystem) {
 		for (String string : args) {
 			if (string.equals(modAllSystem))
 				return true;