paths) throws IOException {
for (File f : paths)
addPathFile(f);
@@ -699,6 +690,11 @@ public class ClassicPluginStrategy implements PluginStrategy {
return url;
}
+
+ @Override
+ protected Class defineClassFromData(File container, byte[] classData, String classname) throws IOException {
+ return super.defineClassFromData(container, pluginManager.getCompatibilityTransformer().transform(classname,classData), classname);
+ }
}
public static boolean useAntClassLoader = Boolean.getBoolean(ClassicPluginStrategy.class.getName()+".useAntClassLoader");
diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java
index 8bdb17ae89e08999ebc6686529e66d2cf112ad61..7ce9dea6d3456fbbab2306b7ad951265ae0215c8 100644
--- a/core/src/main/java/hudson/PluginManager.java
+++ b/core/src/main/java/hudson/PluginManager.java
@@ -59,6 +59,7 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.logging.LogFactory;
+import org.jenkinsci.bytecode.Transformer;
import org.jvnet.hudson.reactor.Executable;
import org.jvnet.hudson.reactor.Reactor;
import org.jvnet.hudson.reactor.ReactorException;
@@ -151,6 +152,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
// and load plugin-contributed classes.
public final ClassLoader uberClassLoader = new UberClassLoader();
+ private final Transformer compatibilityTransformer = new Transformer();
+
/**
* Once plugin is uploaded, this flag becomes true.
* This is used to report a message that Jenkins needs to be restarted
@@ -179,6 +182,17 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
rootDir.mkdirs();
strategy = createPluginStrategy();
+
+ // load up rules for the core first
+ try {
+ compatibilityTransformer.loadRules(getClass().getClassLoader());
+ } catch (IOException e) {
+ LOGGER.log(Level.WARNING, "Failed to load compatibility rewrite rules",e);
+ }
+ }
+
+ public Transformer getCompatibilityTransformer() {
+ return compatibilityTransformer;
}
public Api getApi() {
@@ -301,6 +315,13 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
});
+ // Let's see for a while until we open this functionality up to plugins
+// g.followedBy().attains(PLUGINS_LISTED).add("Load compatibility rules", new Executable() {
+// public void run(Reactor reactor) throws Exception {
+// compatibilityTransformer.loadRules(uberClassLoader);
+// }
+// });
+
session.addAll(g.discoverTasks(session));
pluginListed = true; // technically speaking this is still too early, as at this point tasks are merely scheduled, not necessarily executed.
diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java
index 515dee2d72fc1d71dae36361538ab6ec6a2d3ce9..6a5cc387f54c039e38204e39c2f12f4a0664e000 100644
--- a/core/src/main/java/hudson/model/AbstractProject.java
+++ b/core/src/main/java/hudson/model/AbstractProject.java
@@ -95,6 +95,7 @@ import net.sf.json.JSONObject;
import org.acegisecurity.Authentication;
import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;
+import org.jenkinsci.bytecode.AdaptField;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.args4j.Argument;
@@ -242,6 +243,7 @@ public abstract class AbstractProject,R extends A
/**
* List of all {@link Trigger}s for this project.
*/
+ @AdaptField(was=List.class)
protected volatile DescribableList,TriggerDescriptor> triggers = new DescribableList,TriggerDescriptor>(this);
private static final AtomicReferenceFieldUpdater triggersUpdater
= AtomicReferenceFieldUpdater.newUpdater(AbstractProject.class,DescribableList.class,"triggers");
diff --git a/pom.xml b/pom.xml
index b552aac8878cd3fdc49be3f081f14b8cd2f89a1a..02e96ce8154f10dfccd9560f21501c801fc63baa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -174,7 +174,7 @@ THE SOFTWARE.
org.jenkins-ci.main
remoting
- 2.31
+ 2.32