[495564] Improving performance of NamedElement::getNamespace().
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java
index 045f43b..eb9bdc7 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/operations/NamedElementOperations.java
@@ -7,11 +7,12 @@
*
* Contributors:
* IBM - initial API and implementation
- * Kenn Hussey (CEA) - 327039, 351774, 374878, 418466, 433211, 451350, 485756
+ * Kenn Hussey (CEA) - 327039, 351774, 374878, 418466, 433211, 451350, 485756, 495564
*
*/
package org.eclipse.uml2.uml.internal.operations;
+import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.BasicDiagnostic;
@@ -379,6 +380,9 @@
return true;
}
+ protected static final List<EStructuralFeature> NAMESPACE__MEMBER__ALL_SUBSETS = getAllSubsetFeatures(
+ UMLPackage.Literals.NAMESPACE__MEMBER);
+
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -388,15 +392,11 @@
InternalEObject eInternalContainer = ((InternalEObject) namedElement)
.eInternalContainer();
- if (eInternalContainer instanceof Namespace) {
- Namespace namespace = (Namespace) eInternalContainer;
-
- if (namespace.getMembers().contains(namedElement)) {
- return namespace;
- }
- }
-
- return null;
+ return eInternalContainer instanceof Namespace
+ && NAMESPACE__MEMBER__ALL_SUBSETS
+ .contains(namedElement.eContainingFeature())
+ ? (Namespace) eInternalContainer
+ : null;
}
/**
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java
index 4db5369..bf3d401 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/util/UMLUtil.java
@@ -10,7 +10,7 @@
* Kenn Hussey (Embarcadero Technologies) - 199624, 184249, 204406, 208125, 204200, 213218, 213903, 220669, 208016, 226396, 271470
* Nicolas Rouquette (JPL) - 260120, 313837
* Kenn Hussey - 286329, 313601, 314971, 344907, 236184, 335125
- * Kenn Hussey (CEA) - 327039, 358792, 364419, 366350, 307343, 382637, 273949, 389542, 389495, 316165, 392833, 399544, 322715, 163556, 212765, 397324, 204658, 408612, 411731, 269598, 422000, 416833, 424568, 427167, 418466, 419324, 429994, 433157, 439915, 446388, 454864, 458906, 461374, 463066, 468230, 481712, 491587
+ * Kenn Hussey (CEA) - 327039, 358792, 364419, 366350, 307343, 382637, 273949, 389542, 389495, 316165, 392833, 399544, 322715, 163556, 212765, 397324, 204658, 408612, 411731, 269598, 422000, 416833, 424568, 427167, 418466, 419324, 429994, 433157, 439915, 446388, 454864, 458906, 461374, 463066, 468230, 481712, 491587, 495564
* Yann Tanguy (CEA) - 350402
* Christian W. Damus (CEA) - 392833, 251963, 405061, 409396, 176998, 180744, 403374, 416833, 420338, 405065, 431342
* E.D.Willink - 420338
@@ -13341,4 +13341,55 @@
return body;
}
+ protected static boolean isSubset(EStructuralFeature feature,
+ EStructuralFeature supersetFeature, boolean recurse) {
+ EAnnotation subsetsAnnotation = feature
+ .getEAnnotation(ANNOTATION__SUBSETS);
+
+ if (null != subsetsAnnotation) {
+
+ for (EObject reference : subsetsAnnotation.getReferences()) {
+
+ if (reference == supersetFeature
+ || recurse && isSubset((EStructuralFeature) reference,
+ supersetFeature, recurse)) {
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ protected static List<EStructuralFeature> getAllSubsetFeatures(
+ EStructuralFeature supersetFeature) {
+ List<EStructuralFeature> allSubsetFeatures = new UniqueEList.FastCompare<EStructuralFeature>();
+
+ EClass eContainingClass = supersetFeature.getEContainingClass();
+
+ for (EClassifier eClassifier : eContainingClass.getEPackage()
+ .getEClassifiers()) {
+
+ if (eClassifier instanceof EClass) {
+ EClass eClass = (EClass) eClassifier;
+
+ if (eContainingClass.isSuperTypeOf(eClass)) {
+
+ for (EStructuralFeature eStructuralFeature : eClass
+ .getEStructuralFeatures()) {
+
+ if (isSubset(eStructuralFeature, supersetFeature,
+ true)) {
+
+ allSubsetFeatures.add(eStructuralFeature);
+ }
+ }
+ }
+ }
+ }
+
+ return allSubsetFeatures;
+ }
+
}