Package br.com.objectos.way.etc

Source Code of br.com.objectos.way.etc.YamlProvider

/*
* Copyright 2012 Objectos, Fábrica de Software LTDA.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package br.com.objectos.way.etc;

import static com.google.common.collect.Sets.newLinkedHashSet;

import java.beans.IntrospectionException;
import java.util.Collection;
import java.util.Map;
import java.util.Set;

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.introspector.BeanAccess;
import org.yaml.snakeyaml.introspector.Property;
import org.yaml.snakeyaml.introspector.PropertyUtils;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Representer;
import org.yaml.snakeyaml.resolver.Resolver;

import com.google.inject.Inject;
import com.google.inject.Provider;

/**
* @author marcio.endo@objectos.com.br (Marcio Endo)
*/
class YamlProvider implements Provider<Yaml> {

  private final Map<EtcKey, Etc> yamlModel;

  @Inject
  public YamlProvider(Map<EtcKey, Etc> yamlModel) {
    this.yamlModel = yamlModel;
  }

  @Override
  public Yaml get() {
    Representer representer = new Representer();

    for (EtcKey key : yamlModel.keySet()) {
      representer.addClassTag(key.get(), Tag.MAP);
    }

    NaturalPropertyUtils propertyUtils = new NaturalPropertyUtils();
    representer.setPropertyUtils(propertyUtils);

    DumperOptions options = new DumperOptions();
    options.setDefaultFlowStyle(FlowStyle.BLOCK);

    return new org.yaml.snakeyaml.Yaml(
        new Constructor(),
        representer,
        options,
        new Resolver());
  }

  private static class NaturalPropertyUtils extends PropertyUtils {

    @Override
    protected Set<Property> createPropertySet(
        Class<? extends Object> type, BeanAccess bAccess)
        throws IntrospectionException {

      Collection<Property> props = getPropertiesMap(type, BeanAccess.FIELD).values();

      Set<Property> res = newLinkedHashSet();

      for (Property property : props) {
        if (property.isReadable()) {
          res.add(property);
        }
      }

      return res;

    }

  }

}
TOP

Related Classes of br.com.objectos.way.etc.YamlProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.