Blob Blame History Raw
### Eclipse Workspace Patch 1.0
#P org.eclipse.jdt.core
Index: batch/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java,v
retrieving revision 1.45.2.1
diff -u -r1.45.2.1 ClasspathJar.java
--- batch/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java	10 Nov 2008 17:46:09 -0000	1.45.2.1
+++ batch/org/eclipse/jdt/internal/compiler/batch/ClasspathJar.java	4 Mar 2009 16:09:54 -0000
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Fabrice Matrat - fix for 265103
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.batch;
 
@@ -54,18 +55,20 @@
 		READING_JAR = 4,
 		CONTINUING = 5,
 		SKIP_LINE = 6;
-	private static final char[] CLASSPATH_HEADER_TOKEN = 
+	private static final char[] CLASSPATH_HEADER_TOKEN =
 		"Class-Path:".toCharArray(); //$NON-NLS-1$
-	private int ClasspathSectionsCount;
+	private int classpathSectionsCount;
 	private ArrayList calledFilesNames;
 	public boolean analyzeManifestContents(Reader reader) throws IOException {
 		int state = START, substate = 0;
 		StringBuffer currentJarToken = new StringBuffer();
 		int currentChar;
-		this.ClasspathSectionsCount = 0;
+		this.classpathSectionsCount = 0;
 		this.calledFilesNames = null;
 		for (;;) {
 			currentChar = reader.read();
+			if (currentChar == '\r')  // skip \r, will consider \n later (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=251079 )
+				currentChar = reader.read();
 			switch (state) {
 				case START:
 					if (currentChar == -1) {
@@ -91,50 +94,71 @@
 				case PAST_CLASSPATH_HEADER:
 					if (currentChar == ' ') {
 						state = SKIPPING_WHITESPACE;
-						this.ClasspathSectionsCount++;
+						this.classpathSectionsCount++;
 					} else {
 						return false;
 					}
 					break;
 				case SKIPPING_WHITESPACE:
 					if (currentChar == -1) {
+						// >>>>>>>>>>>>>>>>>> Add the latest jar read
+						addCurrentTokenJarWhenNecessary(currentJarToken);
 						return true;
 					} else if (currentChar == '\n') {
 						state = CONTINUING;
 					} else if (currentChar != ' ') {
 						currentJarToken.append((char) currentChar);
 						state = READING_JAR;
+					} else {
+						// >>>>>>>>>>>>>>>>>> Add the latest jar read
+						addCurrentTokenJarWhenNecessary(currentJarToken);
 					}
 					break;
 				case CONTINUING:
 					if (currentChar == -1) {
+						// >>>>>>>>>>>>>>>>>> Add the latest jar read
+						addCurrentTokenJarWhenNecessary(currentJarToken);
 						return true;
 					} else if (currentChar == '\n') {
+						addCurrentTokenJarWhenNecessary(currentJarToken);
 						state = START;
 					} else if (currentChar == ' ') {
 						state = SKIPPING_WHITESPACE;
 					} else if (currentChar == CLASSPATH_HEADER_TOKEN[0]) {
+						addCurrentTokenJarWhenNecessary(currentJarToken);
 						state = IN_CLASSPATH_HEADER;
 						substate = 1;
 					} else if (this.calledFilesNames == null) {
-						return false;
+						// >>>>>>>>>>>>>>>>>> Add the latest jar read
+						addCurrentTokenJarWhenNecessary(currentJarToken);
+						state = START;
 					} else {
+						// >>>>>>>>>>>>>>>>>> Add the latest jar read
+						addCurrentTokenJarWhenNecessary(currentJarToken);
 						state = SKIP_LINE;
 					}
 					break;
 				case SKIP_LINE:
 					if (currentChar == -1) {
+						if (this.classpathSectionsCount != 0) {
+							if (this.calledFilesNames == null) {
+								return false;
+							}
+						}
 						return true;
 					} else if (currentChar == '\n') {
 						state = START;
 					}
 					break;
-				case READING_JAR:	
+				case READING_JAR:
 					if (currentChar == -1) {
+						// >>>>>>>>>>>>>>>>>> Add the latest jar read
 						return false;
 					} else if (currentChar == '\n') {
 						// appends token below
 						state = CONTINUING;
+						// >>>>>>>>>>> Add a break to not add the jar yet as it can continue on the next line
+						break;
 					} else if (currentChar == ' ') {
 						// appends token below
 						state = SKIPPING_WHITESPACE;
@@ -142,17 +166,29 @@
 						currentJarToken.append((char) currentChar);
 						break;
 					}
-					if (this.calledFilesNames == null) {
-						this.calledFilesNames = new ArrayList();
-					}
-					this.calledFilesNames.add(currentJarToken.toString());
-					currentJarToken.setLength(0);
+					addCurrentTokenJarWhenNecessary(currentJarToken);
 					break;
 			}
-		}	
+		}
+	}	
+	
+	// >>>>>>>>>>>>>>>> Method Extracted from analyzeManifestContents in the READING_JAR Block
+	private boolean addCurrentTokenJarWhenNecessary(StringBuffer currentJarToken) {
+		if (currentJarToken != null && currentJarToken.length() > 0) {
+			if (this.calledFilesNames == null) {
+				this.calledFilesNames = new ArrayList();
+			}
+			this.calledFilesNames.add(currentJarToken.toString());
+			currentJarToken.setLength(0);
+			return true;
+		}
+		return false;
 	}
+	// <<<<<<<<<<<<<<<<<<<<<<
+	
+	
 	public int getClasspathSectionsCount() {
-		return this.ClasspathSectionsCount;
+		return this.classpathSectionsCount;
 	}
 	public List getCalledFileNames() {
 		return this.calledFilesNames;