Bug 406518 - migrate OT/Equinox to the standard OSGi WeavingHook
- better recording of base classes:
- avoid double scanning
- avoid incomplete search for TeamBinding if we already have it
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 8b32cb0..ae40b02 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
@@ -67,6 +67,7 @@
Set<TeamBinding> equivalenceSet = new HashSet<>();
ActivationKind activation;
+ boolean hasScannedBases;
boolean isActivated;
boolean importsAdded;
@@ -287,11 +288,15 @@
public synchronized void scanTeamClasses(Bundle bundle) {
ClassScanner scanner = new ClassScanner();
for (@SuppressWarnings("null")@NonNull TeamBinding team : getAllTeamBindings()) {
+ if (team.hasScannedBases) continue; // not a surprise for members of equivalentSet
+ team.hasScannedBases = true;
try {
String teamName = scanner.readOTAttributes(bundle, team.teamName);
Collection<String> baseClassNames = scanner.getCollectedBaseClassNames();
- if (team.baseClassNames.isEmpty())
- addBaseClassNames(teamName, baseClassNames);
+ if (team.baseClassNames.isEmpty()) {
+ for (TeamBinding equivalent : team.equivalenceSet)
+ equivalent.addBaseClassNames(baseClassNames);
+ }
log(IStatus.INFO, "Scanned team class "+teamName+", found "+baseClassNames.size()+" base classes");
} catch (Exception e) {
log(e, "Failed to scan team class "+team.teamName);
@@ -311,27 +316,6 @@
return all;
}
- private void addBaseClassNames(String teamName, Collection<String> baseClassNames) {
- for (int i = 0; i < teams.length; i++) {
- TeamBinding team = teams[i];
- if (team.teamName.equals(teamName)) {
- for (TeamBinding equivalent : team.equivalenceSet)
- equivalent.addBaseClassNames(baseClassNames);
- return;
- }
- }
- // try super:
- for (int i = 0; i < teams.length; i++) {
- TeamBinding team = teams[i];
- TeamBinding superTeam = team.superTeam;
- if (superTeam != null && superTeam.teamName.equals(teamName)) {
- for (TeamBinding equivalentSuper : superTeam.equivalenceSet)
- equivalentSuper.addBaseClassNames(baseClassNames);
- return;
- }
- }
- }
-
/** Add all require imports to match the hidden reverse dependency created by any team binding to this base class. */
public void addImports(WovenClass baseClass) {
String baseClassName = baseClass.getClassName();