[345778] Duplicate tld entries in taglib index
diff --git a/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF
index 929ba6d..298ab92 100644
--- a/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.jst.jsp.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jst.jsp.core; singleton:=true
-Bundle-Version: 1.2.305.qualifier
+Bundle-Version: 1.2.306.qualifier
 Bundle-Activator: org.eclipse.jst.jsp.core.internal.JSPCorePlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
index 24b3471..79c2261 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/ProjectDescription.java
@@ -239,7 +239,7 @@
 		boolean isMappedInWebXML;
 		boolean isConsistent = false;
 		IPath location;
-		List urlRecords;
+		Collection urlRecords;
 
 		public boolean equals(Object obj) {
 			if (!(obj instanceof JarRecord))
@@ -280,7 +280,7 @@
 			return info.uri;
 		}
 
-		public List getURLRecords() {
+		public Collection getURLRecords() {
 			return urlRecords;
 		}
 
@@ -289,8 +289,8 @@
 			s.append(location);
 			if (urlRecords.size() > 0) {
 				s.append('\n');//$NON-NLS-1$ 
-				for (int i = 0; i < urlRecords.size(); i++) {
-					s.append(urlRecords.get(i));
+				for (Iterator it = urlRecords.iterator(); it.hasNext();) {
+					s.append(it.next());
 					s.append('\n');//$NON-NLS-1$ 
 				}
 			}
@@ -361,7 +361,7 @@
 		public boolean equals(Object obj) {
 			if (!(obj instanceof TaglibInfo))
 				return false;
-			return ((TaglibInfo) obj).jspVersion == jspVersion && ((TaglibInfo) obj).description.equals(description) && ((TaglibInfo) obj).largeIcon.equals(largeIcon) && ((TaglibInfo) obj).shortName.equals(shortName) && ((TaglibInfo) obj).smallIcon.equals(smallIcon) && ((TaglibInfo) obj).tlibVersion.equals(tlibVersion) && ((TaglibInfo) obj).uri.equals(uri);
+			return ((TaglibInfo) obj).jspVersion.equals(jspVersion) && ((TaglibInfo) obj).description.equals(description) && ((TaglibInfo) obj).largeIcon.equals(largeIcon) && ((TaglibInfo) obj).shortName.equals(shortName) && ((TaglibInfo) obj).smallIcon.equals(smallIcon) && ((TaglibInfo) obj).tlibVersion.equals(tlibVersion) && ((TaglibInfo) obj).uri.equals(uri);
 		}
 
 		public String getDescription() {
@@ -459,6 +459,10 @@
 			return ((URLRecord) obj).baseLocation.equals(baseLocation) && ((URLRecord) obj).url.equals(url) && ((URLRecord) obj).info.equals(info);
 		}
 
+		public int hashCode() {
+			return baseLocation.hashCode() + url.hashCode() + (isExported ? 1 : 0);
+		}
+
 		public String getBaseLocation() {
 			return baseLocation;
 		}
@@ -902,7 +906,7 @@
 				record = new JarRecord();
 				record.info = new TaglibInfo();
 				record.location = new Path(fileLocation);
-				record.urlRecords = new ArrayList();
+				record.urlRecords = new HashSet(0);
 				fJarRecords.put(fileLocation, record);
 			}
 			return record;
@@ -2034,11 +2038,11 @@
 
 										InputStream tldStream = JarUtilities.getInputStream(urlRecord.url);
 										if(tldStream != null) {
-											libraryRecord.urlRecords.add(urlRecord);
 											TaglibInfo info = extractInfo(urlRecord.url.toString(), tldStream);
 											if (info != null) {
 												urlRecord.info = info;
 											}
+											libraryRecord.urlRecords.add(urlRecord);
 											try {
 												tldStream.close();
 											}