[229338] Package merge could result in infinite looping
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 0cc8fef..31bdb02 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
@@ -9,7 +9,7 @@
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 199624, 184249, 204406, 208125, 204200, 213218, 213903, 220669, 208016, 226396
  *
- * $Id: UMLUtil.java,v 1.74 2008/04/10 00:18:36 khussey Exp $
+ * $Id: UMLUtil.java,v 1.75 2008/04/29 19:40:41 jbruck Exp $
  */
 package org.eclipse.uml2.uml.util;
 
@@ -1135,13 +1135,23 @@
 				org.eclipse.uml2.uml.Package package_,
 				Collection<org.eclipse.uml2.uml.Package> allMergedPackages) {
 
+			return getAllMergedPackages(package_, allMergedPackages,
+				new UniqueEList.FastCompare<org.eclipse.uml2.uml.Package>());
+		}
+
+		private Collection<org.eclipse.uml2.uml.Package> getAllMergedPackages(
+				org.eclipse.uml2.uml.Package package_,
+				Collection<org.eclipse.uml2.uml.Package> allMergedPackages,
+				Collection<org.eclipse.uml2.uml.Package> visitedPackages) {
+
 			for (PackageMerge packageMerge : package_.getPackageMerges()) {
 				org.eclipse.uml2.uml.Package mergedPackage = packageMerge
 					.getMergedPackage();
 
-				if (mergedPackage != null) {
-					getAllMergedPackages(mergedPackage, allMergedPackages);
+				if (mergedPackage != null && visitedPackages.add(mergedPackage)) {
 
+					getAllMergedPackages(mergedPackage, allMergedPackages,
+						visitedPackages);
 					allMergedPackages.add(mergedPackage);
 				}
 			}
@@ -9193,6 +9203,31 @@
 	protected static <F extends Feature> Collection<F> findValidRedefinitions(
 			Collection<F> redefinedFeatures, F redefiningFeature,
 			final String name, Classifier redefinitionContext) {
+
+		F redefinedFeature = findValidRedefinition(redefiningFeature, name,
+			redefinitionContext);
+
+		if (redefinedFeature == null) {
+
+			for (Classifier general : redefinitionContext.allParents()) {
+				redefinedFeature = findValidRedefinition(redefiningFeature,
+					name, general);
+
+				if (redefinedFeature != null) {
+					redefinedFeatures.add(redefinedFeature);
+				}
+			}
+		} else {
+			redefinedFeatures.add(redefinedFeature);
+		}
+
+		return redefinedFeatures;
+	}
+
+	private static <F extends Feature> F findValidRedefinition(
+			F redefiningFeature, final String name,
+			Classifier redefinitionContext) {
+
 		@SuppressWarnings("unchecked")
 		F redefinedFeature = (F) findEObject(redefinitionContext.getFeatures(),
 			new EClassMatcher(redefiningFeature) {
@@ -9213,17 +9248,7 @@
 				}
 			});
 
-		if (redefinedFeature == null) {
-
-			for (Classifier general : redefinitionContext.getGenerals()) {
-				findValidRedefinitions(redefinedFeatures, redefiningFeature,
-					name, general);
-			}
-		} else {
-			redefinedFeatures.add(redefinedFeature);
-		}
-
-		return redefinedFeatures;
+		return redefinedFeature;
 	}
 
 	protected static boolean isSubsetValid(Property subsettingProperty,