/* * PlotSquared, a land and world management plugin for Minecraft. * Copyright (C) IntellectualSites * Copyright (C) IntellectualSites team and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.plotsquared.core.configuration.file; import com.plotsquared.core.configuration.serialization.ConfigurationSerialization; import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.constructor.SafeConstructor; import org.yaml.snakeyaml.error.YAMLException; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.Tag; import java.util.LinkedHashMap; import java.util.Map; public class YamlConstructor extends SafeConstructor { YamlConstructor() { super(new LoaderOptions()); yamlConstructors.put(Tag.MAP, new ConstructCustomObject()); } private class ConstructCustomObject extends ConstructYamlMap { @Override public Object construct(final Node node) { if (node.isTwoStepsConstruction()) { throw new YAMLException("Unexpected referential mapping structure. Node: " + node); } final Map raw = (Map) super.construct(node); if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY)) { final Map typed = new LinkedHashMap<>(raw.size()); for (final Map.Entry entry : raw.entrySet()) { typed.put(entry.getKey().toString(), entry.getValue()); } try { return ConfigurationSerialization.deserializeObject(typed); } catch (final IllegalArgumentException ex) { throw new YAMLException("Could not deserialize object", ex); } } return raw; } @Override public void construct2ndStep(final Node node, final Object object) { throw new YAMLException("Unexpected referential mapping structure. Node: " + node); } } }