Skip to content

Commit

Permalink
Avoid XStream causing illegal access issues for internal JDK collections
Browse files Browse the repository at this point in the history
Relates to: #24492
  • Loading branch information
geoand committed Apr 11, 2022
1 parent 4298deb commit f5a8bdd
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.quarkus.test.junit.internal;

import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.converters.collections.CollectionConverter;
import com.thoughtworks.xstream.mapper.Mapper;

/**
* A custom List converter that always uses ArrayList for unmarshalling.
* This is probably not semantically correct 100% of the time, but it's likely fine
* for all the cases where we are using marshalling / unmarshalling.
*
* The reason for doing this is to avoid XStream causing illegal access issues
* for internal JDK lists
*/
public class CustomListConverter extends CollectionConverter {

public CustomListConverter(Mapper mapper) {
super(mapper);
}

@Override
public boolean canConvert(Class type) {
return List.class.isAssignableFrom(type);
}

@Override
protected Object createCollection(Class type) {
return new ArrayList<>();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.quarkus.test.junit.internal;

import java.util.HashSet;
import java.util.Set;

import com.thoughtworks.xstream.converters.collections.CollectionConverter;
import com.thoughtworks.xstream.mapper.Mapper;

/**
* A custom Set converter that always uses HashSet for unmarshalling.
* This is probably not semantically correct 100% of the time, but it's likely fine
* for all the cases where we are using marshalling / unmarshalling.
*
* The reason for doing this is to avoid XStream causing illegal access issues
* for internal JDK sets
*/
public class CustomSetConverter extends CollectionConverter {

public CustomSetConverter(Mapper mapper) {
super(mapper);
}

@Override
public boolean canConvert(Class type) {
return Set.class.isAssignableFrom(type);
}

@Override
protected Object createCollection(Class type) {
return new HashSet<>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ class XStreamDeepClone implements DeepClone {
// avoid doing any work eagerly since the cloner is rarely used
xStreamSupplier = () -> {
XStream result = new XStream();
XStream.setupDefaultSecurity(result);
result.allowTypesByRegExp(new String[] { ".*" });
result.setClassLoader(classLoader);
result.registerConverter(new CustomListConverter(result.getMapper()));
result.registerConverter(new CustomSetConverter(result.getMapper()));
return result;
};
}
Expand Down

0 comments on commit f5a8bdd

Please sign in to comment.