/******************************************************************************* * Cloud Foundry * Copyright (c) [2009-2016] Pivotal Software, Inc. All Rights Reserved. * * This product is licensed to you under the Apache License, Version 2.0 (the "License"). * You may not use this product except in compliance with the License. * * This product includes a number of subcomponents with * separate copyright notices and license terms. Your use of these * subcomponents is subject to the terms and conditions of the * subcomponent's license, as noted in the LICENSE file. *******************************************************************************/ package org.cloudfoundry.identity.uaa.impl.config; import org.springframework.beans.factory.FactoryBean; import java.util.Map; import java.util.Properties; /** * Factory for Java Properties that reads from a YAML source. YAML is a nice * human-readable format for configuration, * and it has some useful hierarchical properties. It's more or less a superset * of JSON, so it has a lot of similar * features. The Properties created by this factory have nested paths for * hierarchical objects, so for instance this * YAML * * <pre> * environments: * dev: * url: http://dev.bar.com * name: Developer Setup * prod: * url: http://foo.bar.com * name: My Cool App * </pre> * * is transformed into these Properties: * * <pre> * environments.dev.url=http://dev.bar.com * environments.dev.name=Developer Setup * environments.prod.url=http://foo.bar.com * environments.prod.name=My Cool App * </pre> * * Lists are represented as comma-separated values (useful for simple String * values) and also as property keys with <code>[]</code> dereferencers, for * example this YAML: * * <pre> * servers: * - dev.bar.com * - foo.bar.com * </pre> * * becomes java Properties like this: * * <pre> * servers=dev.bar.com,foo.bar.com * servers[0]=dev.bar.com * servers[1]=foo.bar.com * </pre> * * @author Dave Syer * */ public class YamlPropertiesFactoryBean extends YamlProcessor implements FactoryBean<Properties> { private Properties instance; @Override public Properties getObject() { if (instance == null) { instance = doGetObject(); } return instance; } private Properties doGetObject() { final Properties result = new Properties(); MatchCallback callback = new MatchCallback() { @Override public void process(Properties properties, Map<String, Object> map) { result.putAll(properties); } }; process(callback); return result; } @Override public Class<?> getObjectType() { return Properties.class; } @Override public boolean isSingleton() { return true; } }