Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
import java.util.Map;
import org.apache.commons.collections.map.AbstractMapDecorator;
import org.apache.commons.lang.ObjectUtils;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.constructor.AbstractConstruct;
import org.yaml.snakeyaml.constructor.Construct;
import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.error.Mark;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
Expand All @@ -22,10 +23,19 @@
/**
* @author <a href="mailto:[email protected]">Nicolas De Loof</a>
*/
class ModelConstructor extends CustomClassLoaderConstructor {
class ModelConstructor extends Constructor {

public ModelConstructor() {
super(Mapping.class, ModelConstructor.class.getClassLoader());
/*
* TODO remove loader field and getClassForName method and extend CustomClassLoaderConstructor instead after this
* plugin requires SnakeYAML 2.0
*/

private final ClassLoader loader;

public ModelConstructor(LoaderOptions loadingConfig) {
super(Mapping.class, loadingConfig);

this.loader = ModelConstructor.class.getClassLoader();

this.yamlConstructors.put(Tag.BOOL, ConstructScalar);
this.yamlConstructors.put(Tag.INT, ConstructScalar);
Expand Down Expand Up @@ -85,4 +95,16 @@ protected void constructSequenceStep2(SequenceNode node, Collection collection)
((Sequence) collection).setSource(getSource(node));
super.constructSequenceStep2(node, collection);
}

/**
* Load the class
*
* @param name - the name
* @return Class to create
* @throws ClassNotFoundException - when cannot load the class
*/
@Override
protected Class<?> getClassForName(String name) throws ClassNotFoundException {
return Class.forName(name, true, loader);
}
}
31 changes: 20 additions & 11 deletions plugin/src/main/java/io/jenkins/plugins/casc/yaml/YamlUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.parser.ParserImpl;
import org.yaml.snakeyaml.reader.StreamReader;
import org.yaml.snakeyaml.resolver.Resolver;

/**
Expand Down Expand Up @@ -56,8 +57,10 @@ public static Node merge(List<YamlSource> sources, ConfigurationContext context)
public static Node read(YamlSource source, Reader reader, ConfigurationContext context) throws IOException {
LoaderOptions loaderOptions = new LoaderOptions();
loaderOptions.setMaxAliasesForCollections(context.getYamlMaxAliasesForCollections());
Composer composer =
new Composer(new ParserImpl(new StreamReaderWithSource(source, reader)), new Resolver(), loaderOptions);
Composer composer = new Composer(
new ParserImpl(new StreamReaderWithSource(source, reader), loaderOptions),
new Resolver(),
loaderOptions);
try {
return composer.getSingleNode();
} catch (YAMLException e) {
Expand Down Expand Up @@ -100,21 +103,27 @@ public static Mapping loadFrom(List<YamlSource> sources, ConfigurationContext co
LOGGER.warning("configuration-as-code yaml source returned an empty document.");
return Mapping.EMPTY;
}
return loadFrom(merged);
return loadFrom(merged, context);
}

/**
* Load configuration-as-code model from a snakeyaml Node
*/
private static Mapping loadFrom(Node node) {
final ModelConstructor constructor = new ModelConstructor();
constructor.setComposer(new Composer(null, null) {
private static Mapping loadFrom(Node node, ConfigurationContext context) {
final LoaderOptions loaderOptions = new LoaderOptions();
loaderOptions.setMaxAliasesForCollections(context.getYamlMaxAliasesForCollections());
final ModelConstructor constructor = new ModelConstructor(loaderOptions);
constructor.setComposer(
new Composer(
new ParserImpl(new StreamReader(Reader.nullReader()), loaderOptions),
new Resolver(),
loaderOptions) {

@Override
public Node getSingleNode() {
return node;
}
});
@Override
public Node getSingleNode() {
return node;
}
});
return (Mapping) constructor.getSingleData(Mapping.class);
}
}