All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yammer.dropwizard.json.YamlConverter Maven / Gradle / Ivy

package com.yammer.dropwizard.json;

import com.google.common.base.Charsets;
import com.yammer.dropwizard.logging.Log;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonNode;
import org.yaml.snakeyaml.nodes.*;

import java.io.*;

class YamlConverter {
    private static final Log LOG = Log.forClass(YamlConverter.class);
    private final Json json;
    private final JsonFactory factory;

    YamlConverter(Json json, JsonFactory factory) {
        this.factory = factory;
        this.json = json;
    }

    JsonNode convert(File file) throws IOException {
        final ByteArrayOutputStream output = new ByteArrayOutputStream();
        final JsonGenerator generator = factory.createJsonGenerator(output).useDefaultPrettyPrinter();
        final Reader reader = new InputStreamReader(new FileInputStream(file), Charsets.UTF_8);
        try {
            final Node yaml = new org.yaml.snakeyaml.Yaml().compose(reader);
            build(yaml, generator);
            generator.close();
            LOG.debug("Parsed {} as:\n {}", file, output.toString());
            return json.readValue(output.toByteArray(), JsonNode.class);
        } finally {
            reader.close();
        }
    }

    private void build(Node yaml, JsonGenerator json) throws IOException {
        if (yaml instanceof MappingNode) {
            final MappingNode mappingNode = (MappingNode) yaml;
            json.writeStartObject();
            for (NodeTuple tuple : mappingNode.getValue()) {
                if (tuple.getKeyNode() instanceof ScalarNode) {
                    json.writeFieldName(((ScalarNode) tuple.getKeyNode()).getValue());
                }

                build(tuple.getValueNode(), json);
            }
            json.writeEndObject();
        } else if (yaml instanceof SequenceNode) {
            json.writeStartArray();
            for (Node node : ((SequenceNode) yaml).getValue()) {
                build(node, json);
            }
            json.writeEndArray();
        } else if (yaml instanceof ScalarNode) {
            final ScalarNode scalarNode = (ScalarNode) yaml;
            final String className = scalarNode.getTag().getClassName();
            if ("bool".equals(className)) {
                json.writeBoolean(Boolean.parseBoolean(scalarNode.getValue()));
            } else if ("int".equals(className)) {
                json.writeNumber(Long.parseLong(scalarNode.getValue()));
            } else if ("float".equals(className)) {
                json.writeNumber(Double.parseDouble(scalarNode.getValue()));
            } else if ("null".equals(className)) {
                json.writeNull();
            } else {
                json.writeString(scalarNode.getValue());
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy