001 package org.bukkit.configuration.file; 002 003 import java.util.LinkedHashMap; 004 import java.util.Map; 005 006 import org.yaml.snakeyaml.nodes.Node; 007 import org.yaml.snakeyaml.constructor.SafeConstructor; 008 import org.yaml.snakeyaml.error.YAMLException; 009 import org.yaml.snakeyaml.nodes.Tag; 010 011 import org.bukkit.configuration.serialization.ConfigurationSerialization; 012 013 public class YamlConstructor extends SafeConstructor { 014 015 public YamlConstructor() { 016 this.yamlConstructors.put(Tag.MAP, new ConstructCustomObject()); 017 } 018 019 private class ConstructCustomObject extends ConstructYamlMap { 020 @Override 021 public Object construct(Node node) { 022 if (node.isTwoStepsConstruction()) { 023 throw new YAMLException("Unexpected referential mapping structure. Node: " + node); 024 } 025 026 Map<?, ?> raw = (Map<?, ?>) super.construct(node); 027 028 if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY)) { 029 Map<String, Object> typed = new LinkedHashMap<String, Object>(raw.size()); 030 for (Map.Entry<?, ?> entry : raw.entrySet()) { 031 typed.put(entry.getKey().toString(), entry.getValue()); 032 } 033 034 try { 035 return ConfigurationSerialization.deserializeObject(typed); 036 } catch (IllegalArgumentException ex) { 037 throw new YAMLException("Could not deserialize object", ex); 038 } 039 } 040 041 return raw; 042 } 043 044 @Override 045 public void construct2ndStep(Node node, Object object) { 046 throw new YAMLException("Unexpected referential mapping structure. Node: " + node); 047 } 048 } 049 }