[501890] Improving performance of distinguishable name validation.
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java
index 75ff673..050de36 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamespaceOperations.java
@@ -9,12 +9,17 @@
* IBM - initial API and implementation
* Kenn Hussey - 323181
* Kenn Hussey (CEA) - 327039, 418466, 451350, 459651, 433768, 485756, 464427
+ * Patrick Konemann (itemis) - 501890
*
*/
package org.eclipse.uml2.uml.internal.operations;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
@@ -93,27 +98,52 @@
boolean result = true;
if (diagnostics != null) {
- EList<NamedElement> namespaceMembers = namespace.getMembers();
- for (NamedElement member : namespaceMembers) {
+ // get all name conflicts first in O(n log(n))
+ final Set<String> nameClashes = new HashSet<String>();
+ final Map<String, List<NamedElement>> elementsByName = new HashMap<String, List<NamedElement>>();
- for (NamedElement otherMember : namespaceMembers) {
+ for (NamedElement member : namespace.getMembers()) {
- if (member != otherMember && !member
- .isDistinguishableFrom(otherMember, namespace)) {
+ for (String name : namespace.getNamesOfMember(member)) {
+ List<NamedElement> elements = elementsByName.get(name);
- result = false;
+ if (elements == null) {
+ elements = new ArrayList<NamedElement>();
+ elementsByName.put(name, elements);
+ } else {
+ nameClashes.add(name); // name was already added!
+ }
- diagnostics.add(new BasicDiagnostic(Diagnostic.WARNING,
- UMLValidator.DIAGNOSTIC_SOURCE,
- UMLValidator.NAMESPACE__MEMBERS_DISTINGUISHABLE,
- UMLPlugin.INSTANCE.getString(
- "_UI_Namespace_MemberDistinguishable_diagnostic", //$NON-NLS-1$
- getMessageSubstitutions(context, member,
- namespace)),
- new Object[]{member}));
+ elements.add(member);
+ }
+ }
- break;
+ // now we can also check for type compatibility
+ for (String name : nameClashes) {
+ final List<NamedElement> elements = elementsByName.get(name);
+
+ for (NamedElement member : elements) {
+
+ for (NamedElement otherMember : elements) {
+
+ if (member != otherMember && !member
+ .isDistinguishableFrom(otherMember, namespace)) {
+
+ result = false;
+
+ diagnostics.add(new BasicDiagnostic(
+ Diagnostic.WARNING,
+ UMLValidator.DIAGNOSTIC_SOURCE,
+ UMLValidator.NAMESPACE__MEMBERS_DISTINGUISHABLE,
+ UMLPlugin.INSTANCE.getString(
+ "_UI_Namespace_MemberDistinguishable_diagnostic", //$NON-NLS-1$
+ getMessageSubstitutions(context, member,
+ namespace)),
+ new Object[]{member}));
+
+ break;
+ }
}
}
}