Bug 558495 - Fix for bug 552037 breaks the launcher when classpath is
very long

Change-Id: I8647f76171c592692b58111eb5a4d19383fe3b7b
diff --git a/org.eclipse.jdt.debug.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.debug.tests/META-INF/MANIFEST.MF
index 6856ddc..e663ad9 100644
--- a/org.eclipse.jdt.debug.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.debug.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.debug.tests; singleton:=true
-Bundle-Version: 3.11.700.qualifier
+Bundle-Version: 3.11.800.qualifier
 Bundle-ClassPath: javadebugtests.jar
 Bundle-Activator: org.eclipse.jdt.debug.testplugin.JavaTestPlugin
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.debug.tests/pom.xml b/org.eclipse.jdt.debug.tests/pom.xml
index ca4aa22..ea87994 100644
--- a/org.eclipse.jdt.debug.tests/pom.xml
+++ b/org.eclipse.jdt.debug.tests/pom.xml
@@ -18,7 +18,7 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.debug.tests</artifactId>
-  <version>3.11.700-SNAPSHOT</version>
+  <version>3.11.800-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
     <code.ignoredWarnings>${tests.ignoredWarnings}</code.ignoredWarnings>
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ClasspathShortenerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ClasspathShortenerTests.java
index d04b4ab..6c7a43d 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ClasspathShortenerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/launching/ClasspathShortenerTests.java
@@ -226,7 +226,7 @@
 		assertTrue(result);
 		assertEquals(0, classpathShortener.getProcessTempFiles().size());
 		assertArrayEquals(new String[] { "PATH=C:\\WINDOWS\\System32;C:\\WINDOWS",
-				"CLASSPATH=" + classpathShortener.quoteWindowsPath(classpath) }, classpathShortener.getEnvp());
+				"CLASSPATH=" + classpath }, classpathShortener.getEnvp());
 		assertArrayEquals(new String[] { JAVA_8_PATH, ENCODING_ARG, MAIN_CLASS, "-arg1", "arg2" }, classpathShortener.getCmdLine());
 	}
 
@@ -245,7 +245,7 @@
 		assertTrue(result);
 		assertEquals(0, classpathShortener.getProcessTempFiles().size());
 		assertArrayEquals(new String[] { "MYVAR1=value1", "MYVAR2=value2",
-				"CLASSPATH=" + classpathShortener.quoteWindowsPath(classpath) }, classpathShortener.getEnvp());
+				"CLASSPATH=" + classpath }, classpathShortener.getEnvp());
 		assertArrayEquals(new String[] { JAVA_8_PATH, ENCODING_ARG, MAIN_CLASS, "-arg1", "arg2" }, classpathShortener.getCmdLine());
 	}
 
@@ -267,7 +267,7 @@
 		assertTrue(result);
 		assertEquals(0, classpathShortener.getProcessTempFiles().size());
 		assertArrayEquals(new String[] { "PATH=C:\\WINDOWS\\System32;C:\\WINDOWS",
-				"CLASSPATH=" + classpathShortener.quoteWindowsPath(classpath) }, classpathShortener.getEnvp());
+				"CLASSPATH=" + classpath }, classpathShortener.getEnvp());
 		assertArrayEquals(new String[] { JAVA_8_PATH, ENCODING_ARG, MAIN_CLASS, "-arg1", "arg2" }, classpathShortener.getCmdLine());
 	}
 
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathShortener.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathShortener.java
index 76ae86b..9044af2 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathShortener.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/ClasspathShortener.java
@@ -440,7 +440,7 @@
 		if (envp == null) {
 			envp = getEnvpFromNativeEnvironment();
 		}
-		String classpathEnvVar = CLASSPATH_ENV_VAR_PREFIX + quoteWindowsPath(classpath);
+		String classpathEnvVar = CLASSPATH_ENV_VAR_PREFIX + classpath;
 		int index = getEnvClasspathIndex(envp);
 		if (index < 0) {
 			envp = Arrays.copyOf(envp, envp.length + 1);
@@ -483,7 +483,21 @@
 
 	public String quoteWindowsPath(String path) {
 		if (os.equals(Platform.OS_WIN32)) {
-			return "\"" + path + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+			int length = path.length();
+			StringBuilder newPath = new StringBuilder(length);
+			boolean insideQuote = false;
+			for (int i = 0; i < length; i++) {
+				char c = path.charAt(i);
+				if (c == ' ' && !insideQuote) {
+					newPath.append('"');
+					insideQuote = true;
+				} else if (insideQuote) {
+					newPath.append('"');
+					insideQuote = false;
+				}
+				newPath.append(c);
+			}
+			return newPath.toString();
 		}
 		return path;
 	}