diff -u eclipse-3.5.1+repack~1/debian/changelog eclipse-3.5.1+repack~1/debian/changelog --- eclipse-3.5.1+repack~1/debian/changelog +++ eclipse-3.5.1+repack~1/debian/changelog @@ -1,3 +1,23 @@ +eclipse (3.5.1+repack~1-0ubuntu4) karmic-proposed; urgency=low + + * Backported patch from upstream to fix libpango crashes. (LP: #531376) + * Backported fix for ClassCastException in the "Quick Assistant". + [quick-ass-cce.patch] + * Backported fix for ClassCastException in the jdt compiler. + * Backported fix for Out-Of-Memory issues during searches. + [indexing-oom.patch] + * Backported fix for behavior difference between javac and jdt + * Backported fix for slow content assists [java-proposal-hangs.patch]. + * Backported patch to correct issue in the jdt compiler with generics + * Backported patch to speed-up source looks up. + [speedup-source-lookup.patch] + * Backported fix to prevent eclipse from hiding errors. + [prevent-error-hiding.patch] + * Backported fix for a concurrency issue in JDT's preview calculation. + * Backported update site injection. + + -- Niels Thykier Sat, 27 Mar 2010 23:21:55 +0100 + eclipse (3.5.1+repack~1-0ubuntu3) karmic-proposed; urgency=low * Add build-dependency on libxt-dev (now exposed by correct diff -u eclipse-3.5.1+repack~1/debian/rules eclipse-3.5.1+repack~1/debian/rules --- eclipse-3.5.1+repack~1/debian/rules +++ eclipse-3.5.1+repack~1/debian/rules @@ -1,5 +1,8 @@ #!/usr/bin/make -f +# No - we are not building cdbs, quit parsing tarballs! +DEB_TARBALL := $(NULL) + include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/ant.mk include /usr/share/cdbs/1/rules/patchsys-quilt.mk diff -u eclipse-3.5.1+repack~1/debian/control eclipse-3.5.1+repack~1/debian/control --- eclipse-3.5.1+repack~1/debian/control +++ eclipse-3.5.1+repack~1/debian/control @@ -1,7 +1,8 @@ Source: eclipse Section: java Priority: optional -Maintainer: Debian Java Maintainers +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Debian Java Maintainers Uploaders: Niels Thykier , Benjamin Drung , Adrian Perez diff -u eclipse-3.5.1+repack~1/debian/patches/series eclipse-3.5.1+repack~1/debian/patches/series --- eclipse-3.5.1+repack~1/debian/patches/series +++ eclipse-3.5.1+repack~1/debian/patches/series @@ -4,0 +5,10 @@ +libpango.patch +quick-ass-cce.patch +jdt-compiler-cce.patch +indexing-oom.patch +align-jdt-with-javac.patch +java-proposal-hangs.patch +jdt-compiler-gen-bug.patch +speedup-source-lookup.patch +prevent-error-hiding.patch +jdt-proposal-concurrency-issue.patch diff -u eclipse-3.5.1+repack~1/debian/patches/preserve-perms-on-install.patch eclipse-3.5.1+repack~1/debian/patches/preserve-perms-on-install.patch --- eclipse-3.5.1+repack~1/debian/patches/preserve-perms-on-install.patch +++ eclipse-3.5.1+repack~1/debian/patches/preserve-perms-on-install.patch @@ -1,9 +1,9 @@ Description: preserve the execution permission when installing files Author: Benjamin Drung ---- a/build.xml (Revision 23484) -+++ b/build.xml (Arbeitskopie) -@@ -685,9 +685,12 @@ +--- a/build.xml ++++ b/build.xml +@@ -696,9 +696,12 @@ diff -u eclipse-3.5.1+repack~1/debian/patches/fix-shell-script-perm.patch eclipse-3.5.1+repack~1/debian/patches/fix-shell-script-perm.patch --- eclipse-3.5.1+repack~1/debian/patches/fix-shell-script-perm.patch +++ eclipse-3.5.1+repack~1/debian/patches/fix-shell-script-perm.patch @@ -1,10 +1,9 @@ Description: correct permission after applying patch Author: Benjamin Drung -diff -pruN a/build.xml b/build.xml ---- a/build.xml 2009-10-17 21:15:16.105935633 +0200 -+++ b/build.xml 2009-10-17 21:16:49.372586004 +0200 -@@ -211,6 +211,7 @@ +--- a/build.xml ++++ b/build.xml +@@ -216,6 +216,7 @@ diff -u eclipse-3.5.1+repack~1/debian/patches/support-extracted-source.patch eclipse-3.5.1+repack~1/debian/patches/support-extracted-source.patch --- eclipse-3.5.1+repack~1/debian/patches/support-extracted-source.patch +++ eclipse-3.5.1+repack~1/debian/patches/support-extracted-source.patch @@ -2,8 +2,6 @@ Bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=292475 Author: Benjamin Drung -diff --git a/build.xml b/build.xml -index 9fe198e..126c7b4 100644 --- a/build.xml +++ b/build.xml @@ -6,12 +6,27 @@ @@ -35,7 +33,7 @@ -@@ -77,7 +92,7 @@ +@@ -80,7 +95,7 @@ @@ -44,7 +42,7 @@ -@@ -96,6 +111,21 @@ +@@ -99,6 +114,21 @@ --> @@ -66,7 +64,7 @@ -@@ -110,8 +140,8 @@ +@@ -113,8 +143,8 @@ diff -u eclipse-3.5.1+repack~1/debian/patches/fix-perm.patch eclipse-3.5.1+repack~1/debian/patches/fix-perm.patch --- eclipse-3.5.1+repack~1/debian/patches/fix-perm.patch +++ eclipse-3.5.1+repack~1/debian/patches/fix-perm.patch @@ -1,10 +1,9 @@ Description: fix permission for ant executable files Author: Benjamin Drung -diff -pruN a/build.xml b/build.xml ---- a/build.xml 2009-10-12 21:46:39.598436279 +0200 -+++ b/build.xml 2009-10-12 21:59:14.677936277 +0200 -@@ -708,6 +708,10 @@ +--- a/build.xml ++++ b/build.xml +@@ -751,6 +751,10 @@ diff -u eclipse-3.5.1+repack~1/debian/extra/eclipse eclipse-3.5.1+repack~1/debian/extra/eclipse --- eclipse-3.5.1+repack~1/debian/extra/eclipse +++ eclipse-3.5.1+repack~1/debian/extra/eclipse @@ -4,4 +4,33 @@ export GDK_NATIVE_WINDOWS=true +ECLIPSE=/usr/lib/eclipse/eclipse + +inject_update_site(){ + if [ ! -e "$1" ] ; then + echo "W: Cannot find $1" 2>&1 + return 1 + fi + cat - >>"$1" <&1 + else + ( inject_update_site "$settings/org.eclipse.equinox.p2.metadata.repository.prefs" && \ + inject_update_site "$settings/org.eclipse.equinox.p2.artifact.repository.prefs" && \ + echo "I: Injected update sites" ) || echo "W: Could not inject update sites." 2>&1 + fi +fi + xuldir=/usr/lib/xulrunner-$(/usr/bin/xulrunner-1.9.1 --gre-version) LD_LIBRARY_PATH=$xuldir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} /usr/lib/eclipse/eclipse "$@" only in patch2: unchanged: --- eclipse-3.5.1+repack~1.orig/debian/patches/jdt-compiler-gen-bug.patch +++ eclipse-3.5.1+repack~1/debian/patches/jdt-compiler-gen-bug.patch @@ -0,0 +1,119 @@ +Description: Backported fix for a compiler error with generics. +Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=284280 + +--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java ++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java +@@ -426,6 +426,21 @@ + return this.selector; + } + ++public MethodBinding findOriginalInheritedMethod(MethodBinding inheritedMethod) { ++ MethodBinding inheritedOriginal = inheritedMethod.original(); ++ TypeBinding superType = this.declaringClass.findSuperTypeOriginatingFrom(inheritedOriginal.declaringClass); ++ if (superType == null || !(superType instanceof ReferenceBinding)) return null; ++ ++ if (inheritedOriginal.declaringClass != superType) { ++ // must find inherited method with the same substituted variables ++ MethodBinding[] superMethods = ((ReferenceBinding) superType).getMethods(inheritedOriginal.selector, inheritedOriginal.parameters.length); ++ for (int m = 0, l = superMethods.length; m < l; m++) ++ if (superMethods[m].original() == inheritedOriginal) ++ return superMethods[m]; ++ } ++ return inheritedOriginal; ++} ++ + /** + *
+  *(param1 ... paramN)returnType thrownException1 ... thrownExceptionP
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier15.java
+@@ -23,19 +23,11 @@
+ boolean areMethodsCompatible(MethodBinding one, MethodBinding two) {
+ 	// use the original methods to test compatibility, but do not check visibility, etc
+ 	one = one.original();
+-	two = two.original();
++	two = one.findOriginalInheritedMethod(two);
+ 
+-	TypeBinding match = one.declaringClass.findSuperTypeOriginatingFrom(two.declaringClass);
+-	if (!(match instanceof ReferenceBinding))
++	if (two == null)
+ 		return false; // method's declaringClass does not inherit from inheritedMethod's
+ 
+-	if (match != two.declaringClass) {
+-		MethodBinding[] superMethods = ((ReferenceBinding) match).getMethods(two.selector);
+-		for (int i = 0, length = superMethods.length; i < length; i++)
+-			if (superMethods[i].original() == two)
+-				return isParameterSubsignature(one, superMethods[i]);
+-	}
+-
+ 	return isParameterSubsignature(one, two);
+ }
+ boolean areParametersEqual(MethodBinding one, MethodBinding two) {
+@@ -712,16 +704,8 @@
+ 	if (method.declaringClass.isParameterizedType())
+ 		method = method.original();
+ 
+-	inheritedMethod = inheritedMethod.original();
+-	TypeBinding match = method.declaringClass.findSuperTypeOriginatingFrom(inheritedMethod.declaringClass);
+-	if ((match instanceof ReferenceBinding) && match != inheritedMethod.declaringClass) {
+-		MethodBinding[] superMethods = ((ReferenceBinding) match).getMethods(inheritedMethod.selector);
+-		for (int i = 0, length = superMethods.length; i < length; i++)
+-			if (superMethods[i].original() == inheritedMethod.original())
+-				return isParameterSubsignature(method, superMethods[i]);
+-	}
+-
+-	return isParameterSubsignature(method, inheritedMethod);
++	MethodBinding inheritedOriginal = method.findOriginalInheritedMethod(inheritedMethod);
++	return isParameterSubsignature(method, inheritedOriginal == null ? inheritedMethod : inheritedOriginal);
+ }
+ boolean isParameterSubsignature(MethodBinding method, MethodBinding inheritedMethod) {
+ 	MethodBinding substitute = computeSubstituteMethod(inheritedMethod, method);
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
+@@ -835,9 +835,8 @@
+ 				MethodBinding compatibleMethod = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite);
+ 				if (compatibleMethod != null) {
+ 					if (compatibleMethod.isValidBinding()) {
+-						if (concreteMatch != null && concreteMatch.declaringClass.findSuperTypeOriginatingFrom(compatibleMethod.declaringClass) != null)
+-							if (environment().methodVerifier().isParameterSubsignature(concreteMatch.original(), compatibleMethod.original()))
+-								continue; // can skip this method since concreteMatch overrides it
++						if (concreteMatch != null && environment().methodVerifier().doesMethodOverride(concreteMatch, compatibleMethod))
++							continue; // can skip this method since concreteMatch overrides it
+ 						if (candidatesCount == 0) {
+ 							candidates = new MethodBinding[foundSize - startFoundSize + 1];
+ 							if (concreteMatch != null)
+@@ -1227,7 +1226,9 @@
+ 						// BUT we can also ignore any overridden method since we already know the better match (fixes 80028)
+ 						for (int j = 0, max = found.size; j < max; j++) {
+ 							MethodBinding matchingMethod = (MethodBinding) found.elementAt(j);
+-							if (verifier.isParameterSubsignature(matchingMethod.original(), currentMethod.original())) {
++							MethodBinding matchingOriginal = matchingMethod.original();
++							MethodBinding currentOriginal = matchingOriginal.findOriginalInheritedMethod(currentMethod);
++							if (currentOriginal != null && verifier.isParameterSubsignature(matchingOriginal, currentOriginal)) {
+ 								if (isCompliant15) {
+ 									if (matchingMethod.isBridge() && !currentMethod.isBridge())
+ 										continue nextMethod; // keep inherited methods to find concrete method over a bridge method
+@@ -3679,20 +3680,11 @@
+ 					if (!original.isAbstract()) {
+ 						if (original2.isAbstract())
+ 							continue; // only compare current against other concrete methods
+-						TypeBinding superType = original.declaringClass.findSuperTypeOriginatingFrom(original2.declaringClass.erasure());
+-						if (superType == null)
++
++						original2 = original.findOriginalInheritedMethod(original2);
++						if (original2 == null)
+ 							continue nextSpecific; // current's declaringClass is not a subtype of next's declaringClass
+ 						if (current.hasSubstitutedParameters() || original.typeVariables != Binding.NO_TYPE_VARIABLES) {
+-							if (original2.declaringClass != superType) {
+-								// must find inherited method with the same substituted variables
+-								MethodBinding[] superMethods = ((ReferenceBinding) superType).getMethods(original2.selector, argumentTypes.length);
+-								for (int m = 0, l = superMethods.length; m < l; m++) {
+-									if (superMethods[m].original() == original2) {
+-										original2 = superMethods[m];
+-										break;
+-									}
+-								}
+-							}
+ 							if (!environment().methodVerifier().isParameterSubsignature(original, original2))
+ 								continue nextSpecific; // current does not override next
+ 						}
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/align-jdt-with-javac.patch
+++ eclipse-3.5.1+repack~1/debian/patches/align-jdt-with-javac.patch
@@ -0,0 +1,74 @@
+Description: Backported fix for making jdt behave more like javac.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
+@@ -393,8 +393,9 @@
+ 	}
+ 
+ 	//============BINDING UPDATE==========================
++	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643, align with javac on JLS 15.12.2.6
+ 	ReferenceBinding[] thrownExceptions = eraseThrownExceptions
+-			? this.scope.environment().convertToRawTypes(inheritedConstructorBinding.original().thrownExceptions, true, true)
++			? this.scope.environment().convertToRawTypes(inheritedConstructorBinding.thrownExceptions, true, true)
+ 			: inheritedConstructorBinding.thrownExceptions;
+ 
+ 	SourceTypeBinding sourceType = this.binding;
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
+@@ -83,7 +83,8 @@
+ 		ReferenceBinding[] thrownExceptions;
+ 		if (((thrownExceptions = this.binding.thrownExceptions).length) != 0) {
+ 			if ((this.bits & ASTNode.Unchecked) != 0 && this.genericTypeArguments == null) {
+-				thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.original().thrownExceptions, true, true);
++				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643, align with javac on JLS 15.12.2.6
++				thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.thrownExceptions, true, true);
+ 			}			
+ 			// check exception handling
+ 			flowContext.checkExceptionHandlers(
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
+@@ -82,7 +82,8 @@
+ 			ReferenceBinding[] thrownExceptions;
+ 			if ((thrownExceptions = this.binding.thrownExceptions) != Binding.NO_EXCEPTIONS) {
+ 				if ((this.bits & ASTNode.Unchecked) != 0 && this.genericTypeArguments == null) {
+-					thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.original().thrownExceptions, true, true);
++					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643, align with javac on JLS 15.12.2.6
++					thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.thrownExceptions, true, true);
+ 				}				
+ 				// check exceptions
+ 				flowContext.checkExceptionHandlers(
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
+@@ -44,7 +44,8 @@
+ 	ReferenceBinding[] thrownExceptions;
+ 	if (((thrownExceptions = this.binding.thrownExceptions).length) != 0) {
+ 		if ((this.bits & ASTNode.Unchecked) != 0 && this.genericTypeArguments == null) {
+-			thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.original().thrownExceptions, true, true);
++			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643, align with javac on JLS 15.12.2.6
++			thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.thrownExceptions, true, true);
+ 		}		
+ 		// check exception handling
+ 		flowContext.checkExceptionHandlers(
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
+@@ -70,7 +70,8 @@
+ 	ReferenceBinding[] thrownExceptions;
+ 	if ((thrownExceptions = this.binding.thrownExceptions) != Binding.NO_EXCEPTIONS) {
+ 		if ((this.bits & ASTNode.Unchecked) != 0 && this.genericTypeArguments == null) {
+-			thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.original().thrownExceptions, true, true);
++			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643, align with javac on JLS 15.12.2.6
++			thrownExceptions = currentScope.environment().convertToRawTypes(this.binding.thrownExceptions, true, true);
+ 		}
+ 		// must verify that exceptions potentially thrown by this expression are caught in the method
+ 		flowContext.checkExceptionHandlers(thrownExceptions, this, flowInfo.copy(), currentScope);
+@@ -487,7 +488,8 @@
+ 	} else {
+ 		TypeBinding returnType;
+ 		if ((this.bits & ASTNode.Unchecked) != 0 && this.genericTypeArguments == null) {
+-			returnType = this.binding.original().returnType;
++			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643, align with javac on JLS 15.12.2.6
++			returnType = this.binding.returnType;
+ 			if (returnType != null) {
+ 				returnType = scope.environment().convertToRawType(returnType.erasure(), true);
+ 			}
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/jdt-compiler-cce.patch
+++ eclipse-3.5.1+repack~1/debian/patches/jdt-compiler-cce.patch
@@ -0,0 +1,32 @@
+Description: Backport fix for ClassCastException in the jdt compiler.
+ .
+ Note the regression test, which was in the original patch, has been
+ excluded.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=295698
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+@@ -6730,12 +6730,12 @@
+ 				methodName,
+ 		        typesAsString(method.isVarargs(), method.parameters, false),
+ 		        new String(method.declaringClass.readableName()),
+-		        typesAsString(method.isVarargs(), genericTypeArguments, false) },
++		        typesAsString(false, genericTypeArguments, false) },
+ 		new String[] {
+ 				methodName,
+ 		        typesAsString(method.isVarargs(), method.parameters, true),
+ 		        new String(method.declaringClass.shortReadableName()),
+-		        typesAsString(method.isVarargs(), genericTypeArguments, true) },
++		        typesAsString(false, genericTypeArguments, true) },
+ 		typeArguments[0].sourceStart,
+ 		typeArguments[typeArguments.length-1].sourceEnd);
+ }
+@@ -6872,7 +6872,7 @@
+ 				new String(rawMethod.declaringClass.sourceName()),
+ 				typesAsString(rawMethod.original().isVarargs(), rawMethod.original().parameters, false),
+ 				new String(rawMethod.declaringClass.readableName()),
+-				typesAsString(rawMethod.original().isVarargs(), argumentTypes, false),
++				typesAsString(false, argumentTypes, false),
+ 			 },
+ 			new String[] {
+ 				new String(rawMethod.declaringClass.sourceName()),
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/indexing-oom.patch
+++ eclipse-3.5.1+repack~1/debian/patches/indexing-oom.patch
@@ -0,0 +1,22 @@
+Description: Backport fix for Out-Of-Memory issues during indexing.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=296343
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/processing/JobManager.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/processing/JobManager.java
+@@ -1,5 +1,5 @@
+ /*******************************************************************************
+- * Copyright (c) 2000, 2009 IBM Corporation and others.
++ * Copyright (c) 2000, 2010 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
+@@ -324,6 +324,9 @@
+ 			this.processingThread.setDaemon(true);
+ 			// less prioritary by default, priority is raised if clients are actively waiting on it
+ 			this.processingThread.setPriority(Thread.NORM_PRIORITY-1);
++			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=296343
++			// set the context loader to avoid leaking the current context loader
++			this.processingThread.setContextClassLoader(this.getClass().getClassLoader());
+ 			this.processingThread.start();
+ 		}
+ 	}
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/jdt-proposal-concurrency-issue.patch
+++ eclipse-3.5.1+repack~1/debian/patches/jdt-proposal-concurrency-issue.patch
@@ -0,0 +1,21 @@
+Description: Backported a fix for a concurrentcy issue in JDT's preview calculation.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=290805
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeCorrectionProposal.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeCorrectionProposal.java
+@@ -1,5 +1,5 @@
+ /*******************************************************************************
+- * Copyright (c) 2000, 2009 IBM Corporation and others.
++ * Copyright (c) 2000, 2010 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
+@@ -259,7 +259,7 @@
+ 	 * @return returns the change for this proposal.
+ 	 * @throws CoreException thrown when the change could not be created
+ 	 */
+-	public final Change getChange() throws CoreException {
++	public synchronized final Change getChange() throws CoreException {
+ 		if (fChange == null) {
+ 			fChange= createChange();
+ 		}
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/quick-ass-cce.patch
+++ eclipse-3.5.1+repack~1/debian/patches/quick-ass-cce.patch
@@ -0,0 +1,38 @@
+Description: Backport of patch to fix ClassCastException in
+ "Quick Assistant".
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=294662
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
+@@ -1307,10 +1307,12 @@
+ 	 * Return the java element corresponding to the given compiler binding.
+ 	 */
+ 	public static JavaElement getUnresolvedJavaElement(FieldBinding binding, WorkingCopyOwner workingCopyOwner, BindingsToNodesMap bindingsToNodes) {
+-		if (binding.declaringClass == null) return null; // arraylength
+-		IType declaringType = (IType) getUnresolvedJavaElement(binding.declaringClass, workingCopyOwner, bindingsToNodes);
+-		if (declaringType == null) return null;
+-		return (JavaElement) declaringType.getField(String.valueOf(binding.name));
++		if (binding.declaringClass == null) return null; // array length
++		JavaElement unresolvedJavaElement = getUnresolvedJavaElement(binding.declaringClass, workingCopyOwner, bindingsToNodes);
++		if (unresolvedJavaElement == null || unresolvedJavaElement.getElementType() != IJavaElement.TYPE) {
++			return null;
++		}
++		return (JavaElement) ((IType) unresolvedJavaElement).getField(String.valueOf(binding.name));
+ 	}
+ 
+ 	/**
+@@ -1342,9 +1344,11 @@
+ 	 * Return the java element corresponding to the given compiler binding.
+ 	 */
+ 	public static JavaElement getUnresolvedJavaElement(MethodBinding methodBinding, WorkingCopyOwner workingCopyOwner, BindingsToNodesMap bindingsToNodes) {
+-		IType declaringType = (IType) getUnresolvedJavaElement(methodBinding.declaringClass, workingCopyOwner, bindingsToNodes);
+-
+-		if (declaringType == null) return null;
++		JavaElement unresolvedJavaElement = getUnresolvedJavaElement(methodBinding.declaringClass, workingCopyOwner, bindingsToNodes);
++		if (unresolvedJavaElement == null || unresolvedJavaElement.getElementType() != IJavaElement.TYPE) {
++			return null;
++		}
++		IType declaringType = (IType) unresolvedJavaElement;
+ 
+ 		org.eclipse.jdt.internal.compiler.ast.ASTNode node = bindingsToNodes == null ? null : bindingsToNodes.get(methodBinding);
+ 		if (node != null && !declaringType.isBinary()) {
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/libpango.patch
+++ eclipse-3.5.1+repack~1/debian/patches/libpango.patch
@@ -0,0 +1,33 @@
+Description: Backport fix for libpango crashes.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=291128
+
+Index: Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java
+===================================================================
+RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java,v
+retrieving revision 1.46
+diff -u -r1.46 AccessibleObject.java
+--- a/eclipse-3.5.1/plugins/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java	29 May 2009 21:30:30 -0000	1.46
++++ b/eclipse-3.5.1/plugins/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java	14 Jan 2010 19:11:16 -0000
+@@ -1176,7 +1176,12 @@
+ 	}
+ 
+ 	static AccessibleObject getAccessibleObject (int /*long*/ atkObject) {
+-		return (AccessibleObject)AccessibleObjects.get (new LONG (atkObject));
++		AccessibleObject object = (AccessibleObject)AccessibleObjects.get (new LONG (atkObject));
++		if (object == null) return null;
++		if (object.accessible == null) return null;
++		Control control = object.accessible.control;
++		if (control == null || control.isDisposed()) return null;
++		return object;
+ 	}
+ 	
+ 	AccessibleObject getChildByHandle (int /*long*/ handle) {
+@@ -1252,7 +1257,7 @@
+ 		GObjectClass objectClassStruct = new GObjectClass ();
+ 		ATK.memmove (objectClassStruct, gObjectClass);
+ 		ATK.call (objectClassStruct.finalize, atkObject);
+-		AccessibleObject object = getAccessibleObject (atkObject);
++		AccessibleObject object = (AccessibleObject)AccessibleObjects.get (new LONG (atkObject));
+ 		if (object != null) {
+ 			AccessibleObjects.remove (new LONG (atkObject));
+ 			object.release ();
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/java-proposal-hangs.patch
+++ eclipse-3.5.1+repack~1/debian/patches/java-proposal-hangs.patch
@@ -0,0 +1,278 @@
+Description: Backported fix for long delays in code assistant.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=281575
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
+@@ -11581,7 +11581,7 @@
+ 	
+ 	private INameEnvironment getNoCacheNameEnvironment() {
+ 		if (this.noCacheNameEnvironment == null) {
+-			JavaModelManager.getJavaModelManager().cacheZipFiles();
++			JavaModelManager.getJavaModelManager().cacheZipFiles(this);
+ 			this.noCacheNameEnvironment = new JavaSearchNameEnvironment(this.javaProject, this.owner == null ? null : JavaModelManager.getJavaModelManager().getWorkingCopies(this.owner, true/*add primary WCs*/));
+ 		}
+ 		return this.noCacheNameEnvironment;
+@@ -12356,7 +12356,7 @@
+ 		if (this.noCacheNameEnvironment != null) {
+ 			this.noCacheNameEnvironment.cleanup();
+ 			this.noCacheNameEnvironment = null;
+-			JavaModelManager.getJavaModelManager().flushZipFiles();
++			JavaModelManager.getJavaModelManager().flushZipFiles(this);
+ 		}
+ 	}
+ 
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java
+@@ -1238,10 +1238,10 @@
+ 	ReconcileWorkingCopyOperation op = new ReconcileWorkingCopyOperation(this, astLevel, reconcileFlags, workingCopyOwner);
+ 	JavaModelManager manager = JavaModelManager.getJavaModelManager();
+ 	try {
+-		manager.cacheZipFiles(); // cache zip files for performance (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=134172)
++		manager.cacheZipFiles(this); // cache zip files for performance (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=134172)
+ 		op.runOperation(monitor);
+ 	} finally {
+-		manager.flushZipFiles();
++		manager.flushZipFiles(this);
+ 	}
+ 	if(ReconcileWorkingCopyOperation.PERF) {
+ 		stats.endRun();
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java
+@@ -83,6 +83,42 @@
+ public class JavaModelManager implements ISaveParticipant, IContentTypeChangeListener {
+ 
+ 	/**
++	 * Define a zip cache object.
++	 */
++	static class ZipCache {
++		private Map map;
++		Object owner;
++
++		ZipCache(Object owner) {
++			this.map = new HashMap();
++			this.owner = owner;
++		}
++
++		public void flush() {
++			Thread currentThread = Thread.currentThread();
++			Iterator iterator = this.map.values().iterator();
++			while (iterator.hasNext()) {
++				try {
++					ZipFile zipFile = (ZipFile)iterator.next();
++					if (JavaModelManager.ZIP_ACCESS_VERBOSE) {
++						System.out.println("(" + currentThread + ") [JavaModelManager.flushZipFiles()] Closing ZipFile on " +zipFile.getName()); //$NON-NLS-1$//$NON-NLS-2$
++					}
++					zipFile.close();
++				} catch (IOException e) {
++					// problem occured closing zip file: cannot do much more
++				}
++			}
++		}
++
++		public ZipFile getCache(IPath path) {
++			return (ZipFile) this.map.get(path);
++		}
++
++		public void setCache(IPath path, ZipFile zipFile) {
++			this.map.put(path, zipFile);
++		}
++	}
++	/**
+ 	 * Unique handle onto the JavaModel
+ 	 */
+ 	final JavaModel javaModel = new JavaModel();
+@@ -1496,10 +1532,15 @@
+ 	 * Starts caching ZipFiles.
+ 	 * Ignores if there are already clients.
+ 	 */
+-	public void cacheZipFiles() {
+-		if (this.zipFiles.get() != null) return;
+-		this.zipFiles.set(new HashMap());
++	public void cacheZipFiles(Object owner) {
++		ZipCache zipCache = (ZipCache) this.zipFiles.get();
++		if (zipCache != null) {
++			return;
++		}
++		// the owner will be responsible for flushing the cache
++		this.zipFiles.set(new ZipCache(owner));
+ 	}
++
+ 	public void closeZipFile(ZipFile zipFile) {
+ 		if (zipFile == null) return;
+ 		if (this.zipFiles.get() != null) {
+@@ -1709,22 +1750,16 @@
+ 	/**
+ 	 * Flushes ZipFiles cache if there are no more clients.
+ 	 */
+-	public void flushZipFiles() {
+-		Thread currentThread = Thread.currentThread();
+-		HashMap map = (HashMap)this.zipFiles.get();
+-		if (map == null) return;
+-		this.zipFiles.set(null);
+-		Iterator iterator = map.values().iterator();
+-		while (iterator.hasNext()) {
+-			try {
+-				ZipFile zipFile = (ZipFile)iterator.next();
+-				if (JavaModelManager.ZIP_ACCESS_VERBOSE) {
+-					System.out.println("(" + currentThread + ") [JavaModelManager.flushZipFiles()] Closing ZipFile on " +zipFile.getName()); //$NON-NLS-1$//$NON-NLS-2$
+-				}
+-				zipFile.close();
+-			} catch (IOException e) {
+-				// problem occured closing zip file: cannot do much more
+-			}
++	public void flushZipFiles(Object owner) {
++		ZipCache zipCache = (ZipCache)this.zipFiles.get();
++		if (zipCache == null) {
++			return;
++		}
++		// the owner will be responsible for flushing the cache
++		// we want to check object identity to make sure this is the owner that created the cache
++		if (zipCache.owner == owner) {
++			this.zipFiles.set(null);
++			zipCache.flush();
+ 		}
+ 	}
+ 
+@@ -2388,11 +2423,10 @@
+ 	 */
+ 	public ZipFile getZipFile(IPath path) throws CoreException {
+ 
+-		HashMap map;
++		ZipCache zipCache;
+ 		ZipFile zipFile;
+-		if ((map = (HashMap)this.zipFiles.get()) != null
+-				&& (zipFile = (ZipFile)map.get(path)) != null) {
+-
++		if ((zipCache = (ZipCache)this.zipFiles.get()) != null
++				&& (zipFile = zipCache.getCache(path)) != null) {
+ 			return zipFile;
+ 		}
+ 		File localFile = null;
+@@ -2417,8 +2451,8 @@
+ 				System.out.println("(" + Thread.currentThread() + ") [JavaModelManager.getZipFile(IPath)] Creating ZipFile on " + localFile ); //$NON-NLS-1$ //$NON-NLS-2$
+ 			}
+ 			zipFile = new ZipFile(localFile);
+-			if (map != null) {
+-				map.put(path, zipFile);
++			if (zipCache != null) {
++				zipCache.setCache(path, zipFile);
+ 			}
+ 			return zipFile;
+ 		} catch (IOException e) {
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java
+@@ -7,6 +7,7 @@
+  *
+  * Contributors:
+  *     IBM Corporation - initial API and implementation
++ *     Kelly Campbell  - Hangs in SourceMapper during java proposals - https://bugs.eclipse.org/bugs/show_bug.cgi?id=281575
+  *******************************************************************************/
+ package org.eclipse.jdt.internal.core;
+ 
+@@ -860,25 +861,32 @@
+ 
+ 		char[] source = null;
+ 
+-		if (this.rootPath != null) {
+-			source = getSourceForRootPath(this.rootPath, name);
+-		}
++		JavaModelManager javaModelManager = JavaModelManager.getJavaModelManager();
++		try {
++			javaModelManager.cacheZipFiles(this); // Cache any zip files we open during this operation
+ 
+-		if (source == null) {
+-			computeAllRootPaths(type);
+-			if (this.rootPaths != null) {
+-				loop: for (Iterator iterator = this.rootPaths.iterator(); iterator.hasNext(); ) {
+-					String currentRootPath = (String) iterator.next();
+-					if (!currentRootPath.equals(this.rootPath)) {
+-						source = getSourceForRootPath(currentRootPath, name);
+-						if (source != null) {
+-							// remember right root path
+-							this.rootPath = currentRootPath;
+-							break loop;
++			if (this.rootPath != null) {
++				source = getSourceForRootPath(this.rootPath, name);
++			}
++	
++			if (source == null) {
++				computeAllRootPaths(type);
++				if (this.rootPaths != null) {
++					loop: for (Iterator iterator = this.rootPaths.iterator(); iterator.hasNext(); ) {
++						String currentRootPath = (String) iterator.next();
++						if (!currentRootPath.equals(this.rootPath)) {
++							source = getSourceForRootPath(currentRootPath, name);
++							if (source != null) {
++								// remember right root path
++								this.rootPath = currentRootPath;
++								break loop;
++							}
+ 						}
+ 					}
+ 				}
+ 			}
++		} finally {
++			javaModelManager.flushZipFiles(this); // clean up cached zip files.
+ 		}
+ 		if (VERBOSE) {
+ 			System.out.println("spent " + (System.currentTimeMillis() - time) + "ms for " + type.getElementName()); //$NON-NLS-1$ //$NON-NLS-2$
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java
+@@ -102,7 +102,7 @@
+ 	JavaModelManager manager = JavaModelManager.getJavaModelManager();
+ 	try {
+ 		// optimize access to zip files while building hierarchy
+-		manager.cacheZipFiles();
++		manager.cacheZipFiles(this);
+ 
+ 		if (computeSubtypes) {
+ 			// Note by construction there always is a focus type here
+@@ -135,7 +135,7 @@
+ 			buildSupertypes();
+ 		}
+ 	} finally {
+-		manager.flushZipFiles();
++		manager.flushZipFiles(this);
+ 	}
+ }
+ private void buildForProject(JavaProject project, ArrayList potentialSubtypes, org.eclipse.jdt.core.ICompilationUnit[] workingCopies, HashSet localTypes, IProgressMonitor monitor) throws JavaModelException {
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedHierarchyBuilder.java
+@@ -43,7 +43,7 @@
+ 	JavaModelManager manager = JavaModelManager.getJavaModelManager();
+ 	try {
+ 		// optimize access to zip files while building hierarchy
+-		manager.cacheZipFiles();
++		manager.cacheZipFiles(this);
+ 
+ 		if (this.hierarchy.focusType == null || computeSubtypes) {
+ 			IProgressMonitor typeInRegionMonitor =
+@@ -63,7 +63,7 @@
+ 			buildSupertypes();
+ 		}
+ 	} finally {
+-		manager.flushZipFiles();
++		manager.flushZipFiles(this);
+ 	}
+ }
+ /**
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
+@@ -1120,7 +1120,7 @@
+ 	this.bindings = new SimpleLookupTable();
+ 	try {
+ 		// optimize access to zip files during search operation
+-		manager.cacheZipFiles();
++		manager.cacheZipFiles(this);
+ 
+ 		// initialize handle factory (used as a cache of handles so as to optimize space)
+ 		if (this.handleFactory == null)
+@@ -1222,7 +1222,7 @@
+ 			this.progressMonitor.done();
+ 		if (this.nameEnvironment != null)
+ 			this.nameEnvironment.cleanup();
+-		manager.flushZipFiles();
++		manager.flushZipFiles(this);
+ 		this.bindings = null;
+ 	}
+ }
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/prevent-error-hiding.patch
+++ eclipse-3.5.1+repack~1/debian/patches/prevent-error-hiding.patch
@@ -0,0 +1,80 @@
+Description: Backported fix to prevent eclipse from hiding errors.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=283283
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkingSetManager.java	24 Nov 2006 16:41:35 -0000	1.19
++++ b/eclipse-3.5.1/plugins/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkingSetManager.java	22 Jul 2009 13:06:15 -0000
+@@ -15,16 +15,17 @@
+ import java.io.FileInputStream;
+ import java.io.IOException;
+ import java.io.InputStreamReader;
+-
+ import org.eclipse.core.runtime.IPath;
+-import org.eclipse.jface.dialogs.ErrorDialog;
+-import org.eclipse.jface.dialogs.MessageDialog;
+-import org.eclipse.swt.widgets.Shell;
++import org.eclipse.core.runtime.IStatus;
++import org.eclipse.core.runtime.Status;
+ import org.eclipse.ui.IMemento;
+ import org.eclipse.ui.IWorkingSet;
+ import org.eclipse.ui.IWorkingSetManager;
+ import org.eclipse.ui.WorkbenchException;
+ import org.eclipse.ui.XMLMemento;
++import org.eclipse.ui.statushandlers.IStatusAdapterConstants;
++import org.eclipse.ui.statushandlers.StatusAdapter;
++import org.eclipse.ui.statushandlers.StatusManager;
+ import org.osgi.framework.BundleContext;
+ import org.osgi.framework.BundleListener;
+ 
+@@ -109,18 +110,15 @@
+ 				restoreMruList(memento);
+ 				reader.close();
+ 			} catch (IOException e) {
+-				MessageDialog
+-						.openError(
+-								(Shell) null,
+-								WorkbenchMessages.ProblemRestoringWorkingSetState_title,
+-								WorkbenchMessages.ProblemRestoringWorkingSetState_message);
++				handleInternalError(
++						e,
++						WorkbenchMessages.ProblemRestoringWorkingSetState_title,
++						WorkbenchMessages.ProblemRestoringWorkingSetState_message);
+ 			} catch (WorkbenchException e) {
+-				ErrorDialog
+-						.openError(
+-								(Shell) null,
+-								WorkbenchMessages.ProblemRestoringWorkingSetState_title,
+-								WorkbenchMessages.ProblemRestoringWorkingSetState_message,
+-								e.getStatus());
++				handleInternalError(
++						e,
++						WorkbenchMessages.ProblemRestoringWorkingSetState_title,
++						WorkbenchMessages.ProblemRestoringWorkingSetState_message);
+ 			}
+ 		}
+ 	}
+@@ -138,7 +136,7 @@
+ 			saveState(stateFile);
+ 		} catch (IOException e) {
+ 			stateFile.delete();
+-			MessageDialog.openError((Shell) null,
++			handleInternalError(e,
+ 					WorkbenchMessages.ProblemSavingWorkingSetState_title,
+ 					WorkbenchMessages.ProblemSavingWorkingSetState_message);
+ 		}
+@@ -160,4 +158,16 @@
+ 		saveState();
+ 		super.workingSetChanged(changedWorkingSet, propertyChangeId, oldValue);
+ 	}
++
++	/**
++	 * Show and Log the exception using StatusManager.
++	 */
++	private void handleInternalError(Exception exp, String title, String message) {
++		Status status = new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH,
++				message, exp);
++		StatusAdapter sa = new StatusAdapter(status);
++		sa.setProperty(IStatusAdapterConstants.TITLE_PROPERTY, title);
++		StatusManager.getManager().handle(sa,
++				StatusManager.SHOW | StatusManager.LOG);
++	}
+ }
only in patch2:
unchanged:
--- eclipse-3.5.1+repack~1.orig/debian/patches/speedup-source-lookup.patch
+++ eclipse-3.5.1+repack~1/debian/patches/speedup-source-lookup.patch
@@ -0,0 +1,22 @@
+Description: Backported patch to speed-up JavaSourceLookupUtil.
+Origin: backport, https://bugs.eclipse.org/bugs/show_bug.cgi?id=285607
+
+--- a/eclipse-3.5.1/plugins/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
++++ b/eclipse-3.5.1/plugins/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
+@@ -154,6 +154,7 @@
+ 			// External jars are shared, so it does not matter which project it
+ 			// originates from
+ 			IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
++			Path entryPath = new Path(entry.getLocation());
+ 			try {
+ 				IJavaProject[] jps = model.getJavaProjects();
+ 				for (int i = 0; i < jps.length; i++) {
+@@ -163,7 +164,7 @@
+ 						IPackageFragmentRoot[] allRoots = jp.getPackageFragmentRoots();
+ 						for (int j = 0; j < allRoots.length; j++) {
+ 							IPackageFragmentRoot root = allRoots[j];
+-							if (root.isExternal() && root.getPath().equals(new Path(entry.getLocation()))) {
++							if (root.isExternal() && root.getPath().equals(entryPath)) {
+ 								if (isSourceAttachmentEqual(root, entry)) {
+ 									// use package fragment root
+ 									return root;