Bug 508852: [otre] Team causes ClassNotFoundException if roles bind to
different base plugins
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java
index 164e67b..cc6f1ef 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java
@@ -81,7 +81,7 @@
boolean importsAddedToSuper;
boolean importsAddedToSub;
- final List<String> baseClassNames = new ArrayList<>();
+ final Set<String> baseClassNames = new HashSet<>();
public final List<String> superBases = new ArrayList<>(); // logging / debugging only
@@ -98,23 +98,27 @@
/** After scanning class file attributes: add the names of all bound base classes. */
public void addBaseClassNames(Collection<String> baseClassNames) {
- this.baseClassNames.addAll(baseClassNames);
AspectBinding.this.allBaseClassNames.addAll(baseClassNames);
for (String baseClassName : baseClassNames) {
- Set<TeamBinding> teams = baseBundle.teamsPerBase.get(baseClassName);
- if (teams == null)
- baseBundle.teamsPerBase.put(baseClassName, teams = new HashSet<>());
- teams.add(this);
+ if (this.baseClassNames.add(baseClassName)) {
+ Set<TeamBinding> teams = baseBundle.teamsPerBase.get(baseClassName);
+ if (teams == null)
+ baseBundle.teamsPerBase.put(baseClassName, teams = new HashSet<>());
+ teams.add(this);
+ }
}
}
void connectEquivalent(TeamBinding equivalent) {
- this.equivalenceSet.add(equivalent);
+ if (this == equivalent)
+ return;
+ if (!this.equivalenceSet.add(equivalent))
+ return;
boolean locallyHaveBases = !this.baseClassNames.isEmpty();
if (!equivalent.baseClassNames.isEmpty())
- this.baseClassNames.addAll(equivalent.baseClassNames);
+ this.addBaseClassNames(equivalent.baseClassNames);
if (locallyHaveBases)
- equivalent.baseClassNames.addAll(this.baseClassNames);
+ equivalent.addBaseClassNames(this.baseClassNames);
}
@SuppressWarnings("unchecked")