From e69c7e28464962a1e337c0a2cecac4df67c2aff0 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Tue, 1 Sep 2009 22:06:53 +0000 Subject: [PATCH] bug 279844: Slow algorithm for checking duplicate path entries --- .../cdt/internal/core/model/APathEntry.java | 21 ++++++++++--------- .../cdt/internal/core/model/IncludeEntry.java | 10 +++++++++ .../internal/core/model/IncludeFileEntry.java | 10 +++++++++ .../cdt/internal/core/model/LibraryEntry.java | 10 +++++++++ .../cdt/internal/core/model/MacroEntry.java | 16 +++++++++----- .../internal/core/model/MacroFileEntry.java | 9 ++++++++ .../cdt/internal/core/model/PathEntry.java | 15 ++++++++----- .../internal/core/model/PathEntryUtil.java | 21 ++++++++++--------- .../core/CCorePluginResources.properties | 2 +- 9 files changed, 83 insertions(+), 31 deletions(-) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java index ffde394f52b..a6c01926170 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/APathEntry.java @@ -80,6 +80,16 @@ public abstract class APathEntry extends PathEntry { return this.fullCharExclusionPatterns; } + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((basePath == null) ? 0 : basePath.hashCode()); + result = prime * result + ((baseRef == null) ? 0 : baseRef.hashCode()); + result = prime * result + Arrays.hashCode(exclusionPatterns); + return result; + } + @Override public boolean equals(Object obj) { if (obj instanceof APathEntry) { @@ -125,16 +135,6 @@ public abstract class APathEntry extends PathEntry { return super.equals(obj); } - @Override - public int hashCode() { - int hashCode = Arrays.hashCode(exclusionPatterns); - if (basePath != null) - hashCode += basePath.hashCode(); - if (baseRef != null) - hashCode += baseRef.hashCode(); - return hashCode + super.hashCode(); - } - /* (non-Javadoc) * @see java.lang.Object#toString() */ @@ -150,4 +150,5 @@ public abstract class APathEntry extends PathEntry { } return sb.toString(); } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java index 0ddc10cfe2f..ef67870db4d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeEntry.java @@ -49,6 +49,16 @@ public class IncludeEntry extends APathEntry implements IIncludeEntry { return isSystemInclude; } +@Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + + ((includePath == null) ? 0 : includePath.hashCode()); + result = prime * result + (isSystemInclude ? 1231 : 1237); + return result; + } + @Override public boolean equals(Object obj) { if (obj instanceof IIncludeEntry) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeFileEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeFileEntry.java index 5e4cd59048e..e9faac88970 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeFileEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeFileEntry.java @@ -40,6 +40,16 @@ public class IncludeFileEntry extends APathEntry implements IIncludeFileEntry { return includeFilePath; } + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + + ((includeFilePath == null) ? 0 : includeFilePath.hashCode()); + return result; + } + + @Override public boolean equals(Object obj) { if (obj instanceof IIncludeFileEntry) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java index 489ea932bb1..927189b71a2 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryEntry.java @@ -90,6 +90,16 @@ public class LibraryEntry extends APathEntry implements ILibraryEntry { return sourceAttachmentPrefixMapping; } + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((libraryPath == null) ? 0 : libraryPath.hashCode()); + result = prime * result + ((sourceAttachmentPath == null) ? 0 : sourceAttachmentPath.hashCode()); + result = prime * result + + ((sourceAttachmentRootPath == null) ? 0 : sourceAttachmentRootPath.hashCode()); + return result; + } @Override public boolean equals(Object obj) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java index b72fde18733..0da03204445 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroEntry.java @@ -44,6 +44,17 @@ public class MacroEntry extends APathEntry implements IMacroEntry { return macroValue; } + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + + ((macroName == null) ? 0 : macroName.hashCode()); + result = prime * result + + ((macroValue == null) ? 0 : macroValue.hashCode()); + return result; + } + @Override public boolean equals(Object obj) { if (obj instanceof IMacroEntry) { @@ -74,11 +85,6 @@ public class MacroEntry extends APathEntry implements IMacroEntry { return super.equals(obj); } - @Override - public int hashCode() { - return macroName.hashCode() + macroValue.hashCode() + super.hashCode(); - } - /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroFileEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroFileEntry.java index 59f8466f2b5..822643da07d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroFileEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MacroFileEntry.java @@ -39,6 +39,15 @@ public class MacroFileEntry extends APathEntry implements IMacroFileEntry { return macroFilePath; } + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + + ((macroFilePath == null) ? 0 : macroFilePath.hashCode()); + return result; + } + @Override public boolean equals(Object obj) { if (obj instanceof IMacroFileEntry) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java index dbb6d3bb142..8cdb037fe61 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntry.java @@ -53,6 +53,16 @@ public class PathEntry implements IPathEntry { return isExported; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + entryKind; + result = prime * result + (isExported ? 1231 : 1237); + result = prime * result + ((path == null) ? 0 : path.hashCode()); + return result; + } + @Override public boolean equals(Object obj) { if (obj instanceof IPathEntry) { @@ -71,11 +81,6 @@ public class PathEntry implements IPathEntry { return super.equals(obj); } - @Override - public int hashCode() { - return path.hashCode() + entryKind * 17 + (isExported ? 3 : 2); - } - /** * Returns the kind from its String form. */ diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryUtil.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryUtil.java index 5ef070b713f..26299597bc2 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryUtil.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryUtil.java @@ -12,9 +12,12 @@ package org.eclipse.cdt.internal.core.model; import java.io.File; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CModelException; @@ -335,17 +338,15 @@ public class PathEntryUtil { public static ICModelStatus validatePathEntry(ICProject cProject, IPathEntry[] entries) { // Check duplication. + Set entrySet = new HashSet(entries.length); for (IPathEntry entry : entries) { - if (entry == null) { - continue; - } - for (IPathEntry otherEntry : entries) { - if (otherEntry == null) { - continue; - } - if (entry != otherEntry && otherEntry.equals(entry)) { - StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$ - return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString()); + if (entry != null) { + if (entrySet.contains(entry)) { + return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, + MessageFormat.format(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry"), //$NON-NLS-1$ + entry, entry.getPath())); + } else { + entrySet.add(entry); } } } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCorePluginResources.properties b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCorePluginResources.properties index 104221df17f..e187a76d9b0 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCorePluginResources.properties +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCorePluginResources.properties @@ -22,7 +22,7 @@ CoreModel.NullBinaryParser.Not_binary_file=not a binary file CoreModel.NullBinaryParser.Null_Format=Null Format CoreModel.PathEntry.IllegalContainerPath= Illegal container entry -CoreModel.PathEntry.DuplicateEntry= Duplicate path entries +CoreModel.PathEntry.DuplicateEntry= Duplicate path entries found ({0}), path: [{1}] CoreModel.PathEntry.NestedEntry= Nested path entries CoreModel.PathEntry.InvalidPathEntry= Invalid path