[464427] Improving performance of Namespace::importMembers(...).
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 f41d972..a2c635e 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
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2016 IBM Corporation, CEA, 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
@@ -8,11 +8,12 @@
* Contributors:
* IBM - initial API and implementation
* Kenn Hussey - 323181
- * Kenn Hussey (CEA) - 327039, 418466, 451350, 459651, 433768
+ * Kenn Hussey (CEA) - 327039, 418466, 451350, 459651, 433768, 464427
*
*/
package org.eclipse.uml2.uml.internal.operations;
+import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -21,7 +22,7 @@
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.UniqueEList;
-
+import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.uml2.common.util.UnionEObjectEList;
@@ -494,19 +495,60 @@
EList<PackageableElement> importMembers = new UniqueEList.FastCompare<PackageableElement>();
EList<NamedElement> ownedMembers = namespace.getOwnedMembers();
- excludeCollisionsLoop : for (PackageableElement excludeCollision : namespace
- .excludeCollisions(imps)) {
+ Map<String, EList<NamedElement>> memberNames = new HashMap<String, EList<NamedElement>>();
- for (NamedElement ownedMember : ownedMembers) {
+ for (NamedElement ownedMember : ownedMembers) {
- if (!excludeCollision.isDistinguishableFrom(ownedMember,
- namespace)) {
+ for (String name : namespace.getNamesOfMember(ownedMember)) {
+ EList<NamedElement> members = memberNames.get(name);
- continue excludeCollisionsLoop;
+ if (members == null) {
+ memberNames.put(name,
+ members = new UniqueEList.FastCompare<NamedElement>());
+ }
+
+ members.add(ownedMember);
+ }
+ }
+
+ for (PackageableElement imp : imps) {
+
+ for (String name : namespace.getNamesOfMember(imp)) {
+ EList<NamedElement> members = memberNames.get(name);
+
+ if (members == null) {
+ memberNames.put(name,
+ members = new UniqueEList.FastCompare<NamedElement>());
+ }
+
+ members.add(imp);
+ }
+ }
+
+ impsLoop : for (PackageableElement imp : imps) {
+ EClass impEClass = imp.eClass();
+
+ for (String name : namespace.getNamesOfMember(imp)) {
+ EList<NamedElement> members = memberNames.get(name);
+
+ if (members.size() > 1) {
+
+ for (NamedElement member : members) {
+
+ if (member != imp) {
+ EClass memberEClass = member.eClass();
+
+ if (memberEClass.isSuperTypeOf(impEClass)
+ || impEClass.isSuperTypeOf(memberEClass)) {
+
+ continue impsLoop;
+ }
+ }
+ }
}
}
- importMembers.add(excludeCollision);
+ importMembers.add(imp);
}
return ECollections.unmodifiableEList(importMembers);
@@ -527,18 +569,46 @@
Namespace namespace, EList<PackageableElement> imps) {
EList<PackageableElement> excludeCollisions = new UniqueEList.FastCompare<PackageableElement>();
- imps1Loop : for (PackageableElement imp1 : imps) {
+ Map<String, EList<NamedElement>> memberNames = new HashMap<String, EList<NamedElement>>();
- for (PackageableElement imp2 : imps) {
+ for (PackageableElement imp : imps) {
- if (imp1 != imp2
- && !imp1.isDistinguishableFrom(imp2, namespace)) {
+ for (String name : namespace.getNamesOfMember(imp)) {
+ EList<NamedElement> members = memberNames.get(name);
- continue imps1Loop;
+ if (members == null) {
+ memberNames.put(name,
+ members = new UniqueEList.FastCompare<NamedElement>());
+ }
+
+ members.add(imp);
+ }
+ }
+
+ impsLoop : for (PackageableElement imp : imps) {
+ EClass impEClass = imp.eClass();
+
+ for (String name : namespace.getNamesOfMember(imp)) {
+ EList<NamedElement> members = memberNames.get(name);
+
+ if (members.size() > 1) {
+
+ for (NamedElement member : members) {
+
+ if (member != imp) {
+ EClass memberEClass = member.eClass();
+
+ if (memberEClass.isSuperTypeOf(impEClass)
+ || impEClass.isSuperTypeOf(memberEClass)) {
+
+ continue impsLoop;
+ }
+ }
+ }
}
}
- excludeCollisions.add(imp1);
+ excludeCollisions.add(imp);
}
return ECollections.unmodifiableEList(excludeCollisions);