提交 3f9c3e3d 编写于 作者: J Jesse Glick

Stack trace printed while running UseRecipesWithJenkinsRuleTest.

Default constructor of RobustReflectionConverter ought to use PluginManager.
java.lang.AssertionError
	at hudson.util.RobustReflectionConverter.<init>(RobustReflectionConverter.java:82)
	at hudson.util.RobustReflectionConverter.<init>(RobustReflectionConverter.java:77)
	at hudson.security.ProjectMatrixAuthorizationStrategy$ConverterImpl.<init>(ProjectMatrixAuthorizationStrategy.java:103)
上级 16ce00df
......@@ -53,6 +53,7 @@ import java.util.Map;
import java.util.Set;
import static java.util.logging.Level.WARNING;
import java.util.logging.Logger;
import javax.annotation.Nonnull;
/**
* Custom {@link ReflectionConverter} that handle errors more gracefully.
......@@ -71,10 +72,10 @@ public class RobustReflectionConverter implements Converter {
protected final Mapper mapper;
protected transient SerializationMethodInvoker serializationMethodInvoker;
private transient ReflectionProvider pureJavaReflectionProvider;
private final XStream2.ClassOwnership classOwnership;
private final @Nonnull XStream2.ClassOwnership classOwnership;
public RobustReflectionConverter(Mapper mapper, ReflectionProvider reflectionProvider) {
this(mapper, reflectionProvider, null);
this(mapper, reflectionProvider, new XStream2().new PluginClassOwnership());
}
RobustReflectionConverter(Mapper mapper, ReflectionProvider reflectionProvider, XStream2.ClassOwnership classOwnership) {
this.mapper = mapper;
......@@ -96,7 +97,7 @@ public class RobustReflectionConverter implements Converter {
}
OwnerContext oc = OwnerContext.find(context);
oc.startVisiting(writer, classOwnership == null ? null : classOwnership.ownerOf(original.getClass()));
oc.startVisiting(writer, classOwnership.ownerOf(original.getClass()));
try {
doMarshal(source, writer, context);
} finally {
......
......@@ -41,6 +41,7 @@ import com.thoughtworks.xstream.io.HierarchicalStreamDriver;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.mapper.CannotResolveClassException;
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
import hudson.PluginManager;
import hudson.PluginWrapper;
import hudson.diagnosis.OldDataMonitor;
......@@ -67,7 +68,7 @@ import javax.annotation.CheckForNull;
public class XStream2 extends XStream {
private RobustReflectionConverter reflectionConverter;
private final ThreadLocal<Boolean> oldData = new ThreadLocal<Boolean>();
private final ClassOwnership classOwnership;
private final @CheckForNull ClassOwnership classOwnership;
private final Map<String,Class<?>> compatibilityAliases = new ConcurrentHashMap<String, Class<?>>();
/**
......@@ -111,26 +112,7 @@ public class XStream2 extends XStream {
@Override
protected Converter createDefaultConverter() {
// replace default reflection converter
reflectionConverter = new RobustReflectionConverter(getMapper(),new JVM().bestReflectionProvider(), new ClassOwnership() {
PluginManager pm;
@Override public String ownerOf(Class<?> clazz) {
if (classOwnership != null) {
return classOwnership.ownerOf(clazz);
}
if (pm == null) {
Jenkins j = Jenkins.getInstance();
if (j != null) {
pm = j.getPluginManager();
}
}
if (pm == null) {
return null;
}
// TODO: possibly recursively scan super class to discover dependencies
PluginWrapper p = pm.whichPlugin(clazz);
return p != null ? p.getShortName() + '@' + trimVersion(p.getVersion()) : null;
}
});
reflectionConverter = new RobustReflectionConverter(getMapper(),new JVM().bestReflectionProvider(), new PluginClassOwnership());
return reflectionConverter;
}
......@@ -377,5 +359,30 @@ public class XStream2 extends XStream {
*/
@CheckForNull String ownerOf(Class<?> clazz);
}
class PluginClassOwnership implements ClassOwnership {
private PluginManager pm;
@SuppressWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // classOwnership checked for null so why does FB complain?
@Override public String ownerOf(Class<?> clazz) {
if (classOwnership != null) {
return classOwnership.ownerOf(clazz);
}
if (pm == null) {
Jenkins j = Jenkins.getInstance();
if (j != null) {
pm = j.getPluginManager();
}
}
if (pm == null) {
return null;
}
// TODO: possibly recursively scan super class to discover dependencies
PluginWrapper p = pm.whichPlugin(clazz);
return p != null ? p.getShortName() + '@' + trimVersion(p.getVersion()) : null;
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册