From ddadc4b61b4b438946550e530f18c1b3b47cc46a Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 9 Jan 2017 17:49:27 -0500 Subject: [PATCH 1/2] [JENKINS-39134] Mechanism to allow tests to intercept program.dat deserialization. --- .../pickles/serialization/RiverReader.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java b/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java index 41974f81..d9611e84 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java @@ -25,6 +25,7 @@ package org.jenkinsci.plugins.workflow.support.pickles.serialization; import com.google.common.base.Function; +import com.google.common.collect.Lists; import com.google.common.util.concurrent.ListenableFuture; import org.apache.commons.io.IOUtils; import org.jboss.marshalling.ChainingObjectResolver; @@ -50,8 +51,11 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import javax.annotation.CheckForNull; import static org.apache.commons.io.IOUtils.*; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Reads program data file that stores the object graph of the CPS-transformed program. @@ -89,6 +93,9 @@ public Object writeReplace(Object original) { } }; + @Restricted(NoExternalUse.class) // tests only + public static @CheckForNull ObjectResolver customResolver = null; + private InputStream in; public RiverReader(File f, ClassLoader classLoader, FlowExecutionOwner owner) throws IOException { @@ -155,7 +162,7 @@ private List readPickles(int offset) throws IOException { try { MarshallingConfiguration config = new MarshallingConfiguration(); config.setClassResolver(new SimpleClassResolver(classLoader)); - config.setObjectResolver(ownerResolver); + config.setObjectResolver(combine(ownerResolver)); Unmarshaller eu = new RiverMarshallerFactory().createUnmarshaller(config); try { eu.start(Marshalling.createByteInput(es)); @@ -177,7 +184,11 @@ private BufferedInputStream openStreamAt(int offset) throws IOException { } private ObjectResolver combine(ObjectResolver... resolvers) { - return new ChainingObjectResolver(resolvers); + List _resolvers = Lists.newArrayList(resolvers); + if (customResolver != null) { + _resolvers.add(0, customResolver); + } + return _resolvers.size() == 1 ? _resolvers.get(0) : new ChainingObjectResolver(_resolvers); } @Override public void close() { From 0fc5bea2314c01bb0d8b49e564a62bb608b48c6d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 9 Jan 2017 18:08:13 -0500 Subject: [PATCH 2/2] FindBugs --- .../workflow/support/pickles/serialization/RiverReader.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java b/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java index d9611e84..55441e41 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/support/pickles/serialization/RiverReader.java @@ -27,6 +27,7 @@ import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ListenableFuture; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; import org.jboss.marshalling.ChainingObjectResolver; import org.jboss.marshalling.Marshalling; @@ -93,6 +94,7 @@ public Object writeReplace(Object original) { } }; + @SuppressFBWarnings(value="MS_SHOULD_BE_FINAL", justification="intentionally not") @Restricted(NoExternalUse.class) // tests only public static @CheckForNull ObjectResolver customResolver = null;