Bug 493717: [otdre] inconsistent "weavability" of super class of woven
base class
diff --git a/plugins/org.eclipse.objectteams.otequinox/annotations/plugins/org/eclipse/core/runtime/IConfigurationElement.eea b/plugins/org.eclipse.objectteams.otequinox/annotations/plugins/org/eclipse/core/runtime/IConfigurationElement.eea
index 399e02f..8ce9d80 100644
--- a/plugins/org.eclipse.objectteams.otequinox/annotations/plugins/org/eclipse/core/runtime/IConfigurationElement.eea
+++ b/plugins/org.eclipse.objectteams.otequinox/annotations/plugins/org/eclipse/core/runtime/IConfigurationElement.eea
@@ -1,4 +1,4 @@
 class org/eclipse/core/runtime/IConfigurationElement
 getChildren
  (Ljava/lang/String;)[Lorg/eclipse/core/runtime/IConfigurationElement;
- (Ljava/lang/String;)[1Lorg/eclipse/core/runtime/IConfigurationElement;
+ (Ljava/lang/String;)[1L1org/eclipse/core/runtime/IConfigurationElement;
diff --git a/plugins/org.eclipse.objectteams.otequinox/schema/aspectBindings.exsd b/plugins/org.eclipse.objectteams.otequinox/schema/aspectBindings.exsd
index 0889712..2079ba4 100644
--- a/plugins/org.eclipse.objectteams.otequinox/schema/aspectBindings.exsd
+++ b/plugins/org.eclipse.objectteams.otequinox/schema/aspectBindings.exsd
@@ -137,6 +137,9 @@
          </documentation>
       </annotation>
       <complexType>
+         <sequence>
+            <element ref="superBase" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
          <attribute name="class" type="string" use="required">
             <annotation>
                <documentation>
@@ -216,6 +219,33 @@
       </complexType>
    </element>
 
+   <element name="superBase">
+      <annotation>
+         <documentation>
+            Relevant super classes of bound base classes. A super base class is relevant, if it defines a methods, whose override in the exact base is bound by callin or decapsulating callout.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="plugin" type="string">
+            <annotation>
+               <documentation>
+                  the plugin holding the super base class (can be omitted if same as the basePlugin of the enclosing aspectBinding).
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Fully qualified dot/dollar-separated base class that is a super class of a bound base class.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
    <annotation>
       <appInfo>
          <meta.section type="since"/>
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java
index f55c11d..6a7c324 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java
@@ -17,6 +17,7 @@
 package org.eclipse.objectteams.internal.osgi.weaving;
 
 import static org.eclipse.objectteams.otequinox.Constants.ACTIVATION;
+import static org.eclipse.objectteams.otequinox.Constants.NONE;
 import static org.eclipse.objectteams.otequinox.Constants.ASPECT_BINDING_EXTPOINT_ID;
 import static org.eclipse.objectteams.otequinox.Constants.BASE_PLUGIN;
 import static org.eclipse.objectteams.otequinox.Constants.CLASS;
@@ -25,6 +26,9 @@
 import static org.eclipse.objectteams.otequinox.Constants.SELF;
 import static org.eclipse.objectteams.otequinox.Constants.SUPERCLASS;
 import static org.eclipse.objectteams.otequinox.Constants.TEAM;
+import static org.eclipse.objectteams.otequinox.Constants.SUPER_BASE;
+import static org.eclipse.objectteams.otequinox.Constants.SUPER_BASE_CLASS;
+import static org.eclipse.objectteams.otequinox.Constants.SUPER_BASE_PLUGIN;
 import static org.eclipse.objectteams.otequinox.Constants.TRANSFORMER_PLUGIN_ID;
 import static org.eclipse.objectteams.otequinox.TransformerPlugin.log;
 
@@ -39,6 +43,7 @@
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.objectteams.internal.osgi.weaving.AspectBinding.BaseBundle;
@@ -146,6 +151,10 @@
 					if (teamSet == null)
 						teamLookup.put(teamClass, teamSet = new HashSet<>());
 					teamSet.add(team);
+					
+					for (@NonNull IConfigurationElement superBase : teams[j].getChildren(SUPER_BASE)) {
+						addSuperBases(superBase, aspectBundleId, aspectBundle, baseBundle, team, packageAdmin, hook);
+					}
 				}
 				
 				String realBaseBundleId = baseBundleId.toUpperCase().equals(SELF) ? aspectBundleId : baseBundleId;
@@ -163,7 +172,32 @@
 			bindings[i].connect(teamLookup);
 		}
 	}
-	
+
+	private void addSuperBases(IConfigurationElement superBase, String aspectBundleId, @Nullable Bundle aspectBundle,
+			BaseBundle baseBundle, TeamBinding teamBinding,
+			@SuppressWarnings("deprecation") @Nullable org.osgi.service.packageadmin.PackageAdmin packageAdmin,
+			OTWeavingHook hook)
+	{
+		String superBaseClass = superBase.getAttribute(SUPER_BASE_CLASS);
+		String superBasePlugin = superBase.getAttribute(SUPER_BASE_PLUGIN);
+		BaseBundle superBaseBundle;
+		if (superBasePlugin == null) {
+			superBasePlugin = baseBundle.bundleName;
+			superBaseBundle = baseBundle;
+		} else {
+			superBaseBundle = getBaseBundle(superBasePlugin);
+		}
+		AspectBinding superBinding = new AspectBinding(aspectBundleId, aspectBundle, superBaseBundle, new IConfigurationElement[0], 1);
+		TeamBinding team2 = superBinding.createResolvedTeam(0, teamBinding.teamName, NONE, teamBinding.superTeamName);
+		superBinding.allBaseClassNames.add(superBaseClass);
+		team2.baseClassNames.add(superBaseClass);
+		team2.equivalenceSet.add(teamBinding);
+		teamBinding.equivalenceSet.add(team2);
+		addBindingForBaseBundle(superBasePlugin, superBinding);
+		addBindingForAspectBundle(aspectBundleId, superBinding);
+		hook.setBaseTripWire(packageAdmin, superBasePlugin, baseBundle);
+	}
+
 	@SuppressWarnings("deprecation") // multiple uses of deprecated but still recommended class PackageAdmin
 	private boolean checkRequiredFragments(String aspectBundleId, String baseBundleId, IConfigurationElement[] fragments, 
 			@Nullable org.osgi.service.packageadmin.PackageAdmin packageAdmin) 
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/Constants.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/Constants.java
index 6671d9a..6513d73 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/Constants.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/Constants.java
@@ -49,6 +49,8 @@
 	static final String SUPERCLASS = "superclass";
 	/** Attribute of a "team" element denoting the requested activation: one of "NONE", "THREAD", "ALL_THREADS". */
 	static final String ACTIVATION = "activation";
+	/** Activation mode "NONE" */
+	static final String NONE = "NONE";
 	
 	/** Element of EP aspectBindings denoting an adapted base plugin. */
 	static final String BASE_PLUGIN = "basePlugin";
@@ -56,6 +58,11 @@
 	static final String REQUIRED_FRAGMENT = "requiredFragment";
 	/** Pseudo ID of a basePlugin specifying that the team(s) adapt base classes from their own plugin. */
 	static final String SELF = "SELF";
+	
+	/** Subelement of a "team" denoting additional base class to consider for weaving (supers of bound bases). */
+	static final String SUPER_BASE = "superBase";
+	static final String SUPER_BASE_CLASS = "class";
+	static final String SUPER_BASE_PLUGIN = "plugin";
 
 	/** Element of EP aspectBinding - child of basePlugin node - requesting exports forced on the given base plug-in. */
 	public static final String FORCED_EXPORTS_ELEMENT = "forcedExports";