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";